使用 Packer 自动创建模板并在 VMware vSphere 环境中用 Ansible 进行部署¶
知识:
复杂性:
阅读时间: 30 分钟
先决条件、假设和一般说明¶
- 已提供 vSphere 环境,并且有一个已授权的用户
- 一个用于存储文件的内部 Web 服务器
- 可以访问 Rocky Linux 存储库的 Web 访问权限
- Rocky Linux 的 ISO 镜像
- 已提供 Ansible 环境
- 假设您对提到的每种产品都有一定的了解。如果没有,请在开始之前深入研究其文档。
- 此处未使用 Vagrant。有人指出,使用 Vagrant 时,会提供一个非自签名的 SSH 密钥。如果您想深入研究,可以这样做,但本文档不包含此内容。
简介¶
本文档涵盖使用 Packer 进行 vSphere 虚拟机模板创建,以及如何使用 Ansible 将该制品部署为新的虚拟机。
可能的调整¶
当然,您可以将此操作指南改编用于其他虚拟机监控程序。
尽管我们这里使用的是最小 ISO 镜像,但您也可以选择使用 DVD 镜像(体积更大,可能太大)或引导镜像(体积更小,可能太小)。此选择权在您。它尤其影响您所需的安装带宽,以及因此的配置时间。接下来我们将讨论默认选择的影响以及如何纠正它。
您也可以选择不将虚拟机转换为模板。在这种情况下,您将使用 Packer 来部署每个新 VM,这仍然是可行的。从 0 开始的安装在 10 分钟内完成,无需人工干预。
Packer¶
Packer 简介¶
Packer 是一个开源虚拟机镜像工具,根据 MPL 2.0 许可发布,由 HashiCorp 创建。它将帮助您自动化创建虚拟机镜像的过程,从单一源配置在云和本地虚拟化环境中预先配置操作系统和已安装的软件。
使用 Packer,您可以创建用于以下平台的镜像
您可以查看这些资源以获取更多信息
安装 Packer¶
有两种方法可以在您的 Rocky Linux 系统上安装 Packer。
从 HashiCorp 仓库安装 Packer¶
HashiCorp 为不同的 Linux 发行版维护和签名了软件包。要在我们的 Rocky Linux 系统上安装 packer,请按照以下步骤操作
-
安装 dnf-config-manager
sudo dnf install -y dnf-plugins-core
-
将 HashiCorp 仓库添加到我们 Rocky Linux 系统中的可用仓库
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
-
安装 Packer
sudo dnf -y install packer
从 Packer 网站下载并安装¶
您可以从 Packer downloads 开始下载适用于您平台的二进制文件。
-
在下载页面上,复制 Linux 二进制下载部分中与您的系统架构对应的下载链接。
-
使用
wget
工具从 shell 或终端下载它wget https://releases.hashicorp.com/packer/1.8.3/packer_1.8.3_linux_amd64.zip
这将下载一个 .zip 文件。
-
要解压下载的存档,请在 shell 中运行以下命令
unzip packer_1.8.3_linux_amd64.zip
技巧
如果您收到错误并且您的系统上没有安装 unzip 应用程序,您可以通过执行此命令
sudo dnf install unzip
来安装它。 -
将 Packer 应用程序移动到 bin 文件夹
sudo mv packer /usr/local/bin/
验证 Packer 安装是否正确¶
如果上一个过程的所有步骤都已正确完成,我们可以继续验证 Packer 在我们系统上的安装。
要验证 Packer 是否已正确安装,请运行 packer
命令,您将获得如下所示的结果
$ packer
Usage: packer [--version] [--help] <command> [<args>]
Available commands are:
build build image(s) from template
console creates a console for testing variable interpolation
fix fixes templates from old versions of packer
fmt rewrites HCL2 config files to canonical format
hcl2_upgrade transform a JSON template into an HCL2 configuration
init install missing plugins or upgrade plugins
inspect see components of a template
plugins interact with Packer plugins and catalog
validate check that a template is valid
version prints the Packer version
使用 Packer 创建模板¶
注意
在以下示例中,假设您使用的是 Linux 系统。
由于我们将连接到 VMware vCenter Server 以通过 Packer 发送命令,因此我们需要将凭据存储在我们将要创建的配置文件之外。
让我们在我们的主目录中创建一个带有凭据的隐藏文件。这是一个 json 文件
$ vim .vsphere-secrets.json {
"vcenter_username": "rockstar",
"vcenter_password": "mysecurepassword"
}
这些凭据需要一些访问您 vSphere 环境的权限。
让我们创建一个 json 文件(未来,此文件的格式将更改为 HCL)
{
"variables": {
"version": "0.0.X",
"HTTP_IP": "fileserver.rockylinux.lan",
"HTTP_PATH": "/packer/rockylinux/8/ks.cfg"
},
"sensitive-variables": ["vcenter_password"],
"provisioners": [
{
"type": "shell",
"expect_disconnect": true,
"execute_command": "bash '{{.Path}}'",
"script": "{{template_dir}}/scripts/requirements.sh"
}
],
"builders": [
{
"type": "vsphere-iso",
"CPUs": 2,
"CPU_hot_plug": true,
"RAM": 2048,
"RAM_hot_plug": true,
"disk_controller_type": "pvscsi",
"guest_os_type": "centos8_64Guest",
"iso_paths": [
"[datasyno-contentlibrary-mylib] contentlib-a86ad29a-a43b-4717-97e6-593b8358801b/3a381c78-b9df-45a6-82e1-3c07c8187dbe/Rocky-8.4-x86_64-minimal_72cc0cc6-9d0f-4c68-9bcd-06385a506a5d.iso"
],
"network_adapters": [
{
"network_card": "vmxnet3",
"network": "net_infra"
}
],
"storage": [
{
"disk_size": 40000,
"disk_thin_provisioned": true
}
],
"boot_command": [
"<up><tab> text ip=192.168.1.11::192.168.1.254:255.255.255.0:template:ens192:none nameserver=192.168.1.254 inst.ks=http://{{ user `HTTP_IP` }}/{{ user `HTTP_PATH` }}<enter><wait><enter>"
],
"ssh_password": "mysecurepassword",
"ssh_username": "root",
"shutdown_command": "/sbin/halt -h -p",
"insecure_connection": "true",
"username": "{{ user `vcenter_username` }}",
"password": "{{ user `vcenter_password` }}",
"vcenter_server": "vsphere.rockylinux.lan",
"datacenter": "DC_NAME",
"datastore": "DS_NAME",
"vm_name": "template-rockylinux8-{{ user `version` }}",
"folder": "Templates/RockyLinux",
"cluster": "CLUSTER_NAME",
"host": "esx1.rockylinux.lan",
"notes": "Template RockyLinux version {{ user `version` }}",
"convert_to_template": true,
"create_snapshot": false
}
]
}
接下来,我们将描述此文件的每个部分。
变量部分¶
第一步,我们声明变量,主要是为了提高可读性
"variables": {
"version": "0.0.X",
"HTTP_IP": "fileserver.rockylinux.lan",
"HTTP_PATH": "/packer/rockylinux/8/ks.cfg"
},
我们将在以后创建的模板名称中使用 version
变量。您可以轻松地增加此值以满足您的需求。
我们还将需要我们的启动虚拟机来访问 ks.cfg
(Kickstart)文件。
Kickstart 文件包含在安装过程中提出的问题的答案。此文件将其所有内容传递给 Anaconda(安装过程),这使您可以完全自动化模板的创建。
作者喜欢将他的 ks.cfg
文件存储在模板可以访问的内部 Web 服务器上,但您也可以选择其他可能性。
例如,在我们的实验室中,ks.cfg
文件可以通过此 URL 访问:http://fileserver.rockylinux.lan/packer/rockylinux/8/ks.cfg。您需要设置一些类似的东西来使用此方法。
由于我们希望保护我们的密码,因此将其声明为敏感变量。示例
"sensitive-variables": ["vcenter_password"],
Provisioners 部分¶
下一部分很有趣,稍后我们将提供 requirements.sh
的脚本来涵盖它
"provisioners": [
{
"type": "shell",
"expect_disconnect": true,
"execute_command": "bash '{{.Path}}'",
"script": "{{template_dir}}/scripts/requirements.sh"
}
],
安装完成后,VM 将重启。一旦 Packer 检测到 IP 地址(感谢 VMware Tools),它将复制 requirements.sh
并执行它。这是一个清理 VM(删除 SSH 密钥、清除历史记录等)和安装一些额外包的好方法。
Builders 部分¶
您可以声明一个或多个 Builder 来定位 vSphere 环境以外的内容(可能是 Vagrant 模板)。
但我们这里使用的是 vsphere-iso
Builder
"builders": [
{
"type": "vsphere-iso",
此 Builder 允许我们配置所需的硬件
"CPUs": 2,
"CPU_hot_plug": true,
"RAM": 2048,
"RAM_hot_plug": true,
"disk_controller_type": "pvscsi",
"guest_os_type": "centos8_64Guest",
"network_adapters": [
{
"network_card": "vmxnet3",
"network": "net_infra"
}
],
"storage": [
{
"disk_size": 40000,
"disk_thin_provisioned": true
}
],
!!! "注意"
You will never forget again to include CPU_hot_plug as it is automatic now!
您可以使用磁盘、CPU 等进行更多酷炫的操作。如果您有兴趣进行其他调整,应参考文档。
要开始安装,您需要 Rocky Linux 的 ISO 镜像。以下是如何使用位于 vSphere 内容库中的镜像的示例。当然,您也可以将 ISO 存储在其他地方。对于 vSphere 内容库,您必须获取内容库托管服务器上 ISO 文件的完整路径。在这种情况下,它是 Synology,所以直接在 DSM 浏览器中。
"iso_paths": [
"[datasyno-contentlibrary-mylib] contentlib-a86ad29a-a43b-4717-97e6-593b8358801b/3a381c78-b9df-45a6-82e1-3c07c8187dbe/Rocky-8.4-x86_64-minimal_72cc0cc6-9d0f-4c68-9bcd-06385a506a5d.iso"
],
然后,您必须提供在安装过程中输入的完整命令:配置 IP 和传输 Kickstart 响应文件的路径。
注意
此示例处理最复杂的情况:使用静态 IP。如果您有 DHCP 服务器可用,过程将更加简单。
这是过程中最有趣的部分:我敢肯定,您会想在生成过程中欣赏 VMware 控制台,只是为了看到命令在启动过程中自动输入。
"boot_command": [
"<up><tab> text ip=192.168.1.11::192.168.1.254:255.255.255.0:template:ens192:none nameserver=192.168.1.254 inst.ks=http://{{ user `HTTP_IP` }}/{{ user `HTTP_PATH` }}<enter><wait><enter>"
],
第一次重启后,Packer 将通过 SSH 连接到您的服务器。您可以使用 root 用户,或具有 sudo 权限的另一个用户,但无论如何,此用户必须与您在 ks.cfg 文件中定义的用户相对应。
"ssh_password": "mysecurepassword",
"ssh_username": "root",
在此过程结束时,VM 必须停止。使用非 root 用户进行此操作会稍微复杂一些,但有详细的文档记录。
"shutdown_command": "/sbin/halt -h -p",
接下来,我们处理 vSphere 配置。这里唯一值得注意的地方是使用我们主目录中定义的变量,以及 insecure_connection
选项,因为我们的 vSphere 使用自签名证书(参见本文档顶部的假设中的注释)。
"insecure_connection": "true",
"username": "{{ user `vcenter_username` }}",
"password": "{{ user `vcenter_password` }}",
"vcenter_server": "vsphere.rockylinux.lan",
"datacenter": "DC_NAME",
"datastore": "DS_NAME",
"vm_name": "template-rockylinux8-{{ user `version` }}",
"folder": "Templates/RockyLinux",
"cluster": "CLUSTER_NAME",
"host": "esx1.rockylinux.lan",
"notes": "Template RockyLinux version {{ user `version` }}"
最后,我们将要求 vSphere 将我们停止的 VM 转换为模板。
在此阶段,您也可以选择仅按原样使用 VM(不将其转换为模板)。在这种情况下,您可以选择而是创建快照
"convert_to_template": true,
"create_snapshot": false,
ks.cfg 文件¶
如上所述,我们需要提供一个由 Anaconda 使用的 kickstart 响应文件。
这是该文件的一个示例
# Use CD-ROM installation media
repo --name="AppStream" --baseurl="http://download.rockylinux.org/pub/rocky/8.4/AppStream/x86_64/os/"
cdrom
# Use text install
text
# Don't run the Setup Agent on first boot
firstboot --disabled
eula --agreed
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=static --device=ens192 --gateway=192.168.1.254 --ip=192.168.1.11 --nameserver=192.168.1.254,4.4.4.4 --netmask=255.255.255.0 --onboot=on --ipv6=auto --activate
# Root password
rootpw mysecurepassword
# System services
selinux --permissive
firewall --enabled
services --enabled="NetworkManager,sshd,chronyd"
# System timezone
timezone Europe/Paris --isUtc
# System booloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitionning information
part /boot --fstype="xfs" --ondisk=sda --size=512
part pv.01 --fstype="lvmpv" --ondisk=sda --grow
volgroup vg_root --pesize=4096 pv.01
logvol /home --fstype="xfs" --size=5120 --name=lv_home --vgname=vg_root
logvol /var --fstype="xfs" --size=10240 --name=lv_var --vgname=vg_root
logvol / --fstype="xfs" --size=10240 --name=lv_root --vgname=vg_root
logvol swap --fstype="swap" --size=4092 --name=lv_swap --vgname=vg_root
skipx
reboot
%packages --ignoremissing --excludedocs
openssh-clients
curl
dnf-utils
drpm
net-tools
open-vm-tools
perl
perl-File-Temp
sudo
vim
wget
python3
# unnecessary firmware
-aic94xx-firmware
-atmel-firmware
-b43-openfwwf
-bfa-firmware
-ipw2100-firmware
-ipw2200-firmware
-ivtv-firmware
-iwl*-firmware
-libertas-usb8388-firmware
-ql*-firmware
-rt61pci-firmware
-rt73usb-firmware
-xorg-x11-drv-ati-firmware
-zd1211-firmware
-cockpit
-quota
-alsa-*
-fprintd-pam
-intltool
-microcode_ctl
%end
%addon com_redhat_kdump --disable
%end
%post
# Manage Ansible access
groupadd -g 1001 ansible
useradd -m -g 1001 -u 1001 ansible
mkdir /home/ansible/.ssh
echo -e "<---- PAST YOUR PUBKEY HERE ---->" > /home/ansible/.ssh/authorized_keys
chown -R ansible:ansible /home/ansible/.ssh
chmod 700 /home/ansible/.ssh
chmod 600 /home/ansible/.ssh/authorized_keys
echo "ansible ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
chmod 440 /etc/sudoers.d/ansible
systemctl enable vmtoolsd
systemctl start vmtoolsd
%end
由于我们选择了使用最小 ISO,而不是 Boot 或 DVD,因此并非所有必需的安装包都可用。
由于 Packer 依赖 VMware Tools 来检测安装结束,而 open-vm-tools
包仅在 AppStream 存储库中可用,因此我们必须在安装过程中指定,我们希望同时使用 CD-ROM 和此远程存储库作为源
!!! "注意"
If you do not have access to the external repos, you can use either a mirror of the repo, a squid proxy, or the DVD.
# Use CD-ROM installation media
repo --name="AppStream" --baseurl="http://download.rockylinux.org/pub/rocky/8.4/AppStream/x86_64/os/"
cdrom
让我们跳到网络配置,因为在这个例子中,我们不使用 DHCP 服务器
# Network information
network --bootproto=static --device=ens192 --gateway=192.168.1.254 --ip=192.168.1.11 --nameserver=192.168.1.254,4.4.4.4 --netmask=255.255.255.0 --onboot=on --ipv6=auto --activate
记住我们在安装结束时指定了 Packer 通过 SSH 连接的用户。此用户和密码必须匹配
# Root password
rootpw mysecurepassword
警告
您可以在此处使用不安全的密码,只要您确保在部署 VM 后立即更改此密码,例如使用 Ansible。
这是选择的分区方案。可以完成更复杂的操作。您可以定义适合您需求的分区方案,将其适配到 Packer 中定义的磁盘空间,并遵循您环境中定义的安全性规则(/tmp
的专用分区等)。
# System booloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitionning information
part /boot --fstype="xfs" --ondisk=sda --size=512
part pv.01 --fstype="lvmpv" --ondisk=sda --grow
volgroup vg_root --pesize=4096 pv.01
logvol /home --fstype="xfs" --size=5120 --name=lv_home --vgname=vg_root
logvol /var --fstype="xfs" --size=10240 --name=lv_var --vgname=vg_root
logvol / --fstype="xfs" --size=10240 --name=lv_root --vgname=vg_root
logvol swap --fstype="swap" --size=4092 --name=lv_swap --vgname=vg_root
下一节涉及将要安装的软件包。一项“最佳实践”是仅将安装的软件包数量限制在您需要的软件包,这可以减少攻击面,尤其是在服务器环境中。
注意
作者喜欢将安装过程中的操作限制在最低限度,并将所需安装推迟到 Packer 的安装后脚本。因此,在这种情况下,我们只安装最少必需的软件包。
openssh-clients
包似乎是 Packer 将其脚本复制到 VM 所必需的。
Packer 还需要 open-vm-tools
来检测安装结束,这解释了 AppStream 存储库的添加。包 perl
和 perl-File-Temp
也将在部署部分由 VMware Tools 必需。这很遗憾,因为它需要许多其他依赖包。python3
(3.6) 也将在未来由 Ansible 工作需要(如果您不使用 Ansible 或 Python,请删除它们!)。
%packages --ignoremissing --excludedocs
openssh-clients
open-vm-tools
python3
perl
perl-File-Temp
curl
dnf-utils
drpm
net-tools
sudo
vim
wget
您不仅可以添加软件包,还可以删除它们。由于我们控制了我们的硬件将在其中工作的环境,因此我们可以删除任何对我们无用的固件。
# unnecessary firmware
-aic94xx-firmware
-atmel-firmware
...
下一部分添加了一些用户。在这种情况下,创建一个 ansible
用户(没有密码但带有公钥)很有意义。这使得我们的所有新 VM 都可以从我们的 Ansible 服务器访问,以运行安装后操作。
# Manage Ansible access
groupadd -g 1001 ansible
useradd -m -g 1001 -u 1001 ansible
mkdir /home/ansible/.ssh
echo -e "<---- PAST YOUR PUBKEY HERE ---->" > /home/ansible/.ssh/authorized_keys
chown -R ansible:ansible /home/ansible/.ssh
chmod 700 /home/ansible/.ssh
chmod 600 /home/ansible/.ssh/authorized_keys
echo "ansible ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
chmod 440 /etc/sudoers.d/ansible
现在我们需要启用并启动 vmtoolsd
(管理 open-vm-tools 的进程)。vSphere 将在 VM 重启后检测到 IP 地址。
systemctl enable vmtoolsd
systemctl start vmtoolsd
安装过程完成,VM 将重启。
Provisioners¶
请记住,我们在 Packer 中声明了一个 provisioner,在我们的例子中,它对应于一个 .sh
脚本,该脚本将存储在与我们的 json 文件相邻的子目录中。
有不同类型的 Provisioners,我们也可以使用 Ansible。您可以自由探索这些可能性。
此文件可以完全更改,但这提供了一个脚本可以做什么的示例,在这种情况下是 requirements.sh
。请注意,“知识库文章 URL”替换了一个损坏的 URL,但含义不变。
#!/bin/sh -eux
echo "Updating the system..."
dnf -y update
echo "Installing cloud-init..."
dnf -y install cloud-init
# see https://bugs.launchpad.net/cloud-init/+bug/1712680
# and "URL to knowlege base article"
# Virtual Machine customized with cloud-init is set to DHCP after reboot
echo "manual_cache_clean: True " > /etc/cloud/cloud.cfg.d/99-manual.cfg
echo "Disable NetworkManager-wait-online.service"
systemctl disable NetworkManager-wait-online.service
# cleanup current SSH keys so templated VMs get fresh key
rm -f /etc/ssh/ssh_host_*
# Avoid ~200 meg firmware package we don't need
# this cannot be done in the KS file so we do it here
echo "Removing extra firmware packages"
dnf -y remove linux-firmware
dnf -y autoremove
echo "Remove previous kernels that preserved for rollbacks"
dnf -y remove -y $(dnf repoquery --installonly --latest-limit=-1 -q)
dnf -y clean all --enablerepo=\*;
echo "truncate any logs that have built up during the install"
find /var/log -type f -exec truncate --size=0 {} \;
echo "remove the install log"
rm -f /root/anaconda-ks.cfg /root/original-ks.cfg
echo "remove the contents of /tmp and /var/tmp"
rm -rf /tmp/* /var/tmp/*
echo "Force a new random seed to be generated"
rm -f /var/lib/systemd/random-seed
echo "Wipe netplan machine-id (DUID) so machines get unique ID generated on boot"
truncate -s 0 /etc/machine-id
echo "Clear the history so our install commands aren't there"
rm -f /root/.wget-hsts
export HISTSIZE=0
需要一些解释
echo "Installing cloud-init..."
dnf -y install cloud-init
# see https://bugs.launchpad.net/cloud-init/+bug/1712680
# and https://kb.vmware.com/s/article/71264
# Virtual Machine customized with cloud-init is set to DHCP after reboot
echo "manual_cache_clean: True" > /etc/cloud/cloud.cfg.d/99-manual.cfg
由于 vSphere 现在通过 VMware Tools 使用 cloud-init 来配置 CentOS 8 客户机,因此必须安装它。但是,如果您不执行任何操作,配置将在第一次重启时应用,一切都会正常。但在下一次重启时,cloud-init 将不会从 vSphere 收到任何新信息。在这些情况下,由于没有关于如何操作的信息,cloud-init 将重新配置 VM 的网络接口以使用 DHCP,您将丢失静态配置。
由于这不是我们想要的行为,因此我们需要指示 cloud-init 不要自动删除其缓存,因此要重用它在第一次重启后以及之后每次重启时收到的配置信息。
为此,我们创建一个文件 /etc/cloud/cloud.cfg.d/99-manual.cfg
,其中包含 manual_cache_clean: True
指令。
注意
这意味着,如果您需要通过 vSphere 客户机自定义(在正常使用中,这种情况应该很少见)重新应用网络配置,您将需要自己删除 cloud-init 缓存。
脚本的其余部分已注释掉,不需要更多细节。
您可以查看 Bento 项目 以获取有关在此自动化过程部分中可以做什么的更多想法。
模板创建¶
现在是时候启动 Packer 并检查完全自动化的创建过程是否正常工作了。
只需在命令行中输入此命令
./packer build -var-file=~/.vsphere-secrets.json rockylinux8/template.json
您可以快速转到 vSphere 并欣赏这项工作。
您将看到机器被创建、启动,如果您启动控制台,您将看到命令的自动输入和安装过程。
创建完成后,您将在 vSphere 中找到准备使用的模板。
部署部分¶
如果没有自动部署模板部分,这份文档将不完整。
为此,我们将使用一个简单的 Ansible playbook,它使用 vmware_guest
模块。
我们将提供的这个 playbook 必须根据您的需求和您的做事方式进行调整。
---
- name: Deploy VM from template
hosts: localhost
gather_facts: no
vars_files:
- ./vars/credentials.yml
tasks:
- name: Clone the template
vmware_guest:
hostname: "{{ vmware_vcenter_hostname }}"
username: "{{ vmware_username }}"
password: "{{ vmware_password }}"
validate_certs: False
name: "{{ vm_name }}"
template: "{{ template_name }}"
datacenter: "{{ datacenter_name }}"
folder: "{{ storage_folder }}"
state: "{{ state }}"
cluster: "{{ cluster_name | default(omit,true) }}"
esxi_hostname: "{{ esxi_hostname | default(omit,true) }}"
wait_for_ip_address: no
annotation: "{{ comments | default('Deployed by Ansible') }}"
datastore: "{{ datastore_name | default(omit,true) }}"
networks:
- name: "{{ network_name }}"
ip: "{{ network_ip }}"
netmask: "{{ network_mask }}"
gateway: "{{ network_gateway }}"
device_type: "vmxnet3"
type: static
hardware:
memory_mb: "{{ memory_mb|int * 1024 }}"
num_cpu: "{{ num_cpu }}"
hotadd_cpu: True
hotadd_memory: True
customization:
domain: "{{ domain }}"
dns_servers: "{{ dns_servers.split(',') }}"
guest_id: "{{ guest_id }}"
register: deploy_vm
您可以将敏感数据存储在 ./vars/credentials.yml
中,您显然会提前使用 ansible-vault
对其进行加密(尤其是在您使用 git 进行工作时)。由于所有内容都使用了变量,因此您可以轻松地使其适合您的需求。
如果您不使用 Rundeck 或 Awx 之类的东西,您可以使用类似以下的命令行启动部署
ansible-playbook -i ./inventory/hosts -e '{"comments":"my comments","cluster_name":"CS_NAME","esxi_hostname":"ESX_NAME","state":"started","storage_folder":"PROD","datacenter_name":"DC_NAME}","datastore_name":"DS_NAME","template_name":"template-rockylinux8-0.0.1","vm_name":"test_vm","network_name":"net_prod","network_ip":"192.168.1.20","network_gateway":"192.168.1.254","network_mask":"255.255.255.0","memory_mb":"4","num_cpu":"2","domain":"rockylinux.lan","dns_servers":"192.168.1.254","guest_id":"centos8_64Guest"}' ./vmware/create_vm.yml --vault-password-file /etc/ansible/vault_pass.py
此时,您可以使用 Ansible 启动虚拟机的最终配置。不要忘记更改 root 密码,保护 SSH,在您的监控工具和 IT 清单中注册新 VM 等。
总结¶
正如我们所见,现在有完全自动化的 DevOps 解决方案来创建和部署 VM。
同时,这代表了不可否认的时间节省,尤其是在云或数据中心环境中。它还促进了公司所有计算机(服务器和工作站)的标准合规性,以及模板的易于维护/演进。
其他参考¶
有关详细项目,该项目还涵盖了使用最新的 vSphere、Packer 和 Packer vSphere 插件来部署 Rocky Linux 和其他操作系统,请访问此项目。
作者:Antoine Le Morvan
贡献者: Steven Spencer, Ryan Johnson, Pedro Garcia, Ganna Zhyrnova