我正在尝试在 Hyper-V 上使用打包程序创建自动安装 Ubuntu 操作系统,我有这样的项目:
packer-main/
|
|--->http/
| |--->user-data
|
|--->templates/
| |--->build.pkr.hcl
|
|--->variables
| |--->pkrvars.hcl
用户数据中的内容
#cloud-config
autoinstall:
version: 1
identity:
hostname: jammy-daily
username: ubuntu
pkrvars.hcl 的内容
hostname = "jammy-daily"
username = "ubuntu"
和 build.pkr.hcl
...
ssh_username = "${var.username}"
vm_name = "${var.hostname}"
...
我的挑战在于需要在启动构建过程之前动态修改用户数据中的变量。虽然我知道 PowerShell 脚本或 Bash 脚本可以达到此目的,但我很好奇是否有专门的工具可用于简化此类自动化。我也有兴趣了解创建自动化基础设施的最佳实践。
答案1
几乎任何服务器/网络配置管理(通常称为“编排”)工具都可以使用模板来生成文件数据,您可以将其放入 user_data 参数中。 Ansible 和 Saltstack 原生使用 Jinja2 模板; Chef、Puppet 和 Terraform 也支持 Jinja2。
您可能会发现,当从映像启动虚拟机时,而不是由 Packer 创建映像时,会更好地生成 user_data(并将变量替换为值)。如果您的主机名嵌入在映像中,则需要为网络中的每个主机 (VM) 构建不同的映像。
相比之下,当主机特定信息未烘焙到映像中时,单个映像可以由多个 VM 使用,并且主机特定信息可以在 VM 启动时放入 user_data 中。它需要配置管理/编排工具来进行启动,但从长远来看,您可以通过减少构建和维护的映像数量来节省精力。只是一个想法。