nwarila-platform/proxmox-packer-framework

GitHub: nwarila-platform/proxmox-packer-framework

Proxmox Packer框架,用于构建加固的Linux虚拟机模板。

Stars: 0 | Forks: 0

# Proxmox Packer 框架 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ff29b41bfb234755.svg)](https://github.com/nwarila-platform/proxmox-packer-framework/actions/workflows/main-validation.yml) [![安全](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ec3fac480b234758.svg)](https://github.com/nwarila-platform/proxmox-packer-framework/actions/workflows/security.yaml) [![发布](https://img.shields.io/github/v/release/nwarila-platform/proxmox-packer-framework)](https://github.com/nwarila-platform/proxmox-packer-framework/releases) [![许可证:MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) 一个数据驱动的 [Packer](https://www.packer.io/) 框架,用于构建加固的 Proxmox VE 虚拟机模板。该框架拥有 Proxmox 构建器合约、标准化层和 CI 验证流程。消费者仓库提供自己的安装模板、Ansible 内容和环境特定值。 ## 目的 这个仓库是一个组织框架,而不是一个现成的镜像工厂。其任务是给下游仓库提供一个稳定、可重用的 Proxmox/Packer 合约,以便团队继承: - 安全的基础设施默认值 - 共享的输入模式 - 一致的验证和 CI 行为 - 框架逻辑和消费者内容之间的清晰分离 框架不决定虚拟机操作系统应该包含哪些软件包、加固配置文件或应用程序堆栈。这些决定留给了消费者仓库。 ## 所有权模型 | 层 | 所有者 | 默认源 | |-------|-------|----------------| | Packer 协调和变量合约 | 本框架 | 本仓库 | | ISO 下载和 Proxmox 存储上的 SHA 验证 | [terraform-proxmox-iso-manager-framework](https://github.com/nwarila-platform/terraform-proxmox-iso-manager-framework) | 运行器仓库的 Terraform | | OS 安装模板 | 消费者仓库 | `examples/packer/` 中的已发货安装示例 | | Ansible 角色、剧本、Galaxy 要求 | 消费者仓库 | [ansible-framework](https://github.com/nwarila-platform/ansible-framework) | 本仓库仅提供安装示例。它不提供 Ansible 角色、剧本、清单或 `ansible.cfg`;消费者从 [ansible-framework](https://github.com/nwarila-platform/ansible-framework) 或等效仓库导入这些内容。 ISO 生命周期由外部拥有。运行器仓库调用 `terraform-proxmox-iso-manager-framework` 下载并 SHA-256 验证引导 ISO 到 Proxmox 存储,然后通过其 `var_file` 输入生成 `boot_iso` pkrvars 文件,由本框架的可重用工作流程使用。请参阅 [docs/explanation/architecture.md](docs/explanation/architecture.md#iso-lifecycle-boundary)。 ## 架构 从高层次来看: 1. 消费者 `.pkrvars.hcl` 文件提供环境特定输入。 2. `packer/locals.pkr.hcl` 标准化这些输入并组装安装模板合约。 3. `packer/source.pkr.hcl` 将标准化值映射到 Proxmox ISO 构建器。 4. `packer/builds.pkr.hcl` 运行消费者提供的安装模板,然后运行消费者提供的 Ansible 剧本。 请参阅 [docs/explanation/architecture.md](docs/explanation/architecture.md) 了解设计决策,以及 [docs/reference/template-contract.md](docs/reference/template-contract.md) 了解模板变量合约。 ## 支持的操作系统 | OS | 版本 | 安装方法 | 示例 | 状态 | |----|---------|----------------|---------|--------| | Rocky Linux | 9.x | Kickstart | [examples/packer/rocky-linux-9/](examples/packer/rocky-linux-9/) | 验证过的示例 | | Ubuntu Server | 24.04 LTS | 自动安装 | [examples/packer/ubuntu-24-04/](examples/packer/ubuntu-24-04/) | 验证过的引导示例 | | Windows Server | 2022 | 自动应答 | [examples/packer/windows-server-2022/](examples/packer/windows-server-2022/) | 验证过的引导示例 | 通用的 `install_template` 合约支持任何可以从虚拟 CD 引导的模板文件启动的虚拟机操作系统。 引导示例已在 CI 中验证,但消费者仍需: - 从调用 `terraform-proxmox-iso-manager-framework` 的运行器仓库 Terraform 中提供 `boot_iso`(以及任何 `additional_iso_files`) - 将 `ansible_config.*` 路径指向消费者拥有的 Ansible 内容 - 决定示例 TLS 和 WinRM 设置是否是其环境的可接受的引导异常 ## 先决条件 | 工具 | 版本 | 目的 | |------|---------|---------| | [Packer](https://www.packer.io/) | 1.15.0 | 镜像构建器 | | [Ansible](https://docs.ansible.com/) | 消费者定义 | 消费者拥有的配置内容 | | [Proxmox VE](https://www.proxmox.com/) | 8.x | 虚拟机管理程序目标 | | [pre-commit](https://pre-commit.com/) | 4.0+ | 本地钩子运行器 | ## Proxmox API 令牌 创建一个具有 Packer 所需最小权限的专用 API 令牌。以下示例使用 `--privsep=0`,这会禁用令牌权限分离。如果您的环境支持令牌范围 ACL,则首选具有仅所需权限的权限分离令牌。 ``` pveum role add PackerBuilder -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit ISO.Download Pool.Audit Pool.Allocate SDN.Use Sys.Modify" pveum user add packer@pve pveum aclmod / -user packer@pve -role PackerBuilder pveum user token add packer@pve packer-token --privsep=0 ``` ## 快速入门 ### 1. 克隆并初始化 ``` git clone https://github.com/nwarila-platform/proxmox-packer-framework.git cd proxmox-packer-framework cd packer packer init . ``` ### 2. 复制示例输入 ``` # Packer 示例输入 cp ../examples/packer/.env.example ./../.env.packer.example cp ../examples/packer/rocky-linux-9/rocky-linux-9.pkrvars.hcl ./my-rocky.pkrvars.hcl ``` `.env.example` 文件是您应该导出到您的 shell 或 CI 环境的值的模板。它们不是由 Packer 自动加载的。 ### 3. 配置您的环境 - 从复制的 Packer 环境示例中导出 `PKR_VAR_*` 值,用于 Proxmox 访问和部署用户凭证 - 编辑 `my-rocky.pkrvars.hcl` 以设置网络、存储、硬件和安装设置 - 将 `install_template.template_path` 和 `ansible_config.*` 路径指向消费者拥有的内容 框架要求调用者提供 `boot_iso`(以及任何 `additional_iso_files`)——没有捆绑的媒体默认值。在生产中,运行器仓库从 `terraform-proxmox-iso-manager-framework` 输出渲染这些块到自动加载的 pkrvars 文件。对于本地验证运行,`examples/packer/` 下的示例 pkrvars 文件直接固定已知的良好 Proxmox 存储路径和 SHA-256 校验和。 框架还接受 `PKR_VAR_proxmox_skip_tls_verify` 和 `PKR_VAR_proxmox_node` 作为匹配嵌套 `packer_image` 字段的顶级 CI 友好覆盖。 ### 4. 验证和构建 ``` # Packer 验证和构建 cd ../packer packer validate \ -var-file="my-rocky.pkrvars.hcl" \ . packer build -force \ -var-file="my-rocky.pkrvars.hcl" \ . ``` `vm_id` 值在 Proxmox 中是集群范围内的唯一值。提供的示例 ID 仅作为占位符。 ### 5. 安装 pre-commit 钩子 ``` pre-commit install pre-commit install --hook-type commit-msg ``` ## 项目结构 ``` proxmox-packer-framework/ |-- .config/ |-- .github/ | |-- scripts/ | | |-- get_packer_version.sh | | |-- validate_examples.sh | | `-- validate_examples.ps1 | `-- workflows/ |-- .vscode/ |-- docs/ | |-- explanation/ | | `-- architecture.md | `-- reference/ | `-- template-contract.md |-- examples/ | |-- packer/ | | |-- .env.example | | |-- rocky-linux-9/ | | |-- ubuntu-24-04/ | | `-- windows-server-2022/ | `-- terraform/ | |-- .env.example | |-- README.md | `-- terraform.tfvars.example |-- packer/ | |-- builds.pkr.hcl | |-- data.pkr.hcl | |-- locals.pkr.hcl | |-- packer.pkr.hcl | |-- source.pkr.hcl | `-- variables.pkr.hcl |-- .editorconfig |-- .gitattributes |-- .pre-commit-config.yaml |-- .release-please-manifest.json |-- release-please-config.json |-- CHANGELOG.md |-- CODE_OF_CONDUCT.md |-- CONTRIBUTING.md |-- LICENSE |-- SECURITY.md `-- SUPPORT.md ``` ## CI/CD 管道 | 工作流程 | 触发器 | 执行操作 | |----------|---------|--------------| | 主要验证 | 推送到 `main` 并触摸 `packer/**`、`examples/**`、`contract/**`、`tools/**`、`.github/scripts/**`、`.github/workflows/**`、`.pre-commit-config.yaml`(以及 release-please 输出) | 可重用工作流程合约检查、Packer init/fmt/validate | | PR 验证 | 每个 `main` 的 PR(以及合并队列) | 可重用工作流程合约检查、Packer init/fmt/validate | | 安全 | 推送到 `main`、合并队列、每周计划 | 调用 org `reusable-iac-security`(Trivy IaC 加 Gitleaks 密钥扫描)、`reusable-codeql` 和 `reusable-scorecard`(OpenSSF Scorecard)可重用 | | Drift Gate | 每个 `main` 的 PR | 验证此仓库与 org 基线和 `packer-framework-template` 基线清单的一致性 | | 仓库卫生 | `main` 的 PR、合并队列、每周计划 | 调用 org `reusable-repo-hygiene` 策略(SHA 固定操作、精确固定、`pull_request_target` 安全性) | | 发布 | 推送到 `main`(通过 `RELEASE_PLEASE_ON_PUSH` 选择的)或已发布的发布 | 运行 release-please 以更新更改日志/发布,并发布发布证据/证明 | 秘密扫描和 IaC 扫描在安全工作流程中运行一次,通过 org 拥有的 `reusable-iac-security` 可重用;验证工作流程不再运行 Gitleaks。两个附加工作流程是可调用的而不是事件触发的:`reusable-packer-framework-build.yaml`(以下描述的下游构建/验证入口点)和 `reusable-release-evidence.yaml`(由发布工作流程调用)。 ## 下游集成 下游 OS 模板仓库应在 CI 验证或构建针对 SHA 固定的框架修订版时通过其可重用工作流程调用此框架。该工作流程接受与 `NWarila/packer-framework-template` 相同的运行器协议输入名称: ``` jobs: validate-template-inputs: uses: nwarila-platform/proxmox-packer-framework/.github/workflows/reusable-packer-framework-build.yaml@0123456789abcdef0123456789abcdef01234567 with: framework_ref: 0123456789abcdef0123456789abcdef01234567 input_repo: NWarila/ input_ref: fedcba9876543210fedcba9876543210fedcba98 overlay_paths: | packer/repos/public/=>packer/repos/public/ var_file: | packer/repos/public/rocky-linux-9.pkrvars.hcl build: false upload_artifacts: false ``` 对于特权 Proxmox 构建,设置 `build: true` 并将 Proxmox 凭据作为可重用工作流程秘密传递。该工作流程下载固定的 `secure-packer-bootstrapper` 发布版本,验证其 SHA-256 校验和,在构建步骤中生成短期的部署用户密码/散列/密钥材料,将生成的密钥加载到 `ssh-agent` 中,然后运行 `packer build`。 ``` jobs: build-template: uses: nwarila-platform/proxmox-packer-framework/.github/workflows/reusable-packer-framework-build.yaml@0123456789abcdef0123456789abcdef01234567 with: framework_ref: 0123456789abcdef0123456789abcdef01234567 input_repo: NWarila/ input_ref: fedcba9876543210fedcba9876543210fedcba98 overlay_paths: | packer/repos/public/=>packer/repos/public/ var_file: | packer/repos/public/rocky-linux-9.pkrvars.hcl build: true upload_artifacts: true secrets: proxmox_hostname: ${{ secrets.PROXMOX_HOSTNAME }} proxmox_api_token_id: ${{ secrets.PROXMOX_PACKER_FRAMEWORK_TOKEN_ID }} proxmox_api_token_secret: ${{ secrets.PROXMOX_PACKER_FRAMEWORK_SECRET }} proxmox_node: ${{ secrets.PROXMOX_NODE }} deploy_user_name: ${{ secrets.DEPLOY_USER_NAME }} ``` 此框架生成旨在由 Terraform 或 OpenTofu 消费的 Proxmox VM 模板。下游仓库可以在旁边检出其自己的消费者内容,将 `.auto.pkrvars.hcl` 文件放置在框架 `packer/` 工作目录中,并直接运行 `packer validate .` / `packer build .`,只要它提供: - 指向消费者拥有的安装模板的 `install_template` - 指向消费者拥有的 Ansible 内容的 `ansible_config`,其中 `ansible-playbook` 在运行时环境中可用在 PATH 中 - 从运行器仓库 Terraform 调用 `terraform-proxmox-iso-manager-framework` 生成的 `boot_iso`(以及任何 `additional_iso_files`) `template_description` 中的构建时间戳可以用于在发布新模板时触发下游 VM 替换。 ``` resource "terraform_data" "template_version" { input = data.proxmox_virtual_environment_vm.template.description } resource "proxmox_virtual_environment_vm" "vm" { lifecycle { replace_triggered_by = [terraform_data.template_version] } } ``` ## 贡献 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。此项目使用 [Conventional Commits](https://www.conventionalcommits.org/) 并通过预提交钩子强制执行它们。 ## 许可证 本项目采用 [MIT 许可证](LICENSE)。
标签:Ansible, CI验证, ECS, GitHub Advanced Security, ISO管理, Packer, Proxmox, SHA验证, Terraform, VM模板, 代码库, 可重用性, 基础设施, 安全加固, 开源, 数据驱动, 日志审计, 特权提升, 系统提示词, 自动化部署, 虚拟化, 软件构建