概述:
这是自己一直想实现的模版目标,特别是当客户和合作伙伴经常问到VMware产品的OVA是如何做的时候,通常我会建议使用VMware Studio工作制作,但是VMware Studio过于庞大和复杂,很难上手。最近看到William Lam的PhotonOS虚拟应用(OVA)制作的博客,燃起自己攻破模版的最后一个难关——添加OVF属性,提高运维效率和向自动化部署迈进,特别感谢William写了一系列的OVF博客。
自使用Packer来自动化构建虚拟机模版后,也逐步发现了一些需求和使用过程中的挑战:
- 如何在部署的过程中添加第二块硬盘,用于存储数据,并自动对磁盘进行分区、格式化和挂载;
- 如何在部署时使用静态IP地址和相关网络配置,减少部署后的操作;
- 如何在部署时指定Root账户密码,避免使用模版中包含的默认密码;
- 如何生成OVA文件,已用于其他环境的部署;
- Partner希望自己的产品能够在部署时进行初始化,简化产品部署难度。
本博客内容在使用Packer自动构建vSphere虚拟机模版—CentOS 8基础之上进行构建,具备以下功能:
- Packer构建模版后,对ovf文件进行定制化,实现主机名、IP地址、NTP服务器、第二块硬盘和Root密码的部署参数定制;
- 模版部署完成后,开机自动完成相关配置和第二块硬盘的初始化(LVM);
- OVF模版封装完成后,使用govc在vCenter中删除模版虚拟机;
- OVA模版封装完成后,自动上传到S3存储(环境中使用本地MinIO搭建);
- 在vCenter中使用该模版部署VM时,管理员可以直接配置虚拟机的主机名和IP地址等信息,加快部署效率;
除了OVF模版定制外,还展示了govc、ovftool等工具的能力,相信对大家向自动化运维转型有所帮助。
如果您使用Terraform进行虚拟机交付,好消息是Terraform vSphere provider 1.20.0版本后开始支持OVA部署和OVF属性。
相关工具:
Packer是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。 vSphere是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。 govc是VMware官方出品的CLI工具,基于govmomi构建,非常适合自动化编排。 OVFTool是VMware官方出品的OVF和OVA导入/导出工具,在自动化部署和构建环境中经常被使用。 MinIO是基于go语言开发的对象存储系统,S3兼容,本示例中用于存储封装完成的虚拟机模版OVA文件。 相关代码中包含Packer所需的json文件和CentOS8 OVF定制化相关文件。
环境需求:
- 一台Linux电脑,能够连接vCenter Server;
- 安装Packer程序
- 安装govc程序
- 安装ovftool程序
- (可选)部署MinIO存储/使用兼容的S3存储
Packer安装
Packer采用GO语言编写,安装非常简单,只需要将解压后的packer文件拷贝到系统bin目录下即可,下面是在Linux下的安装方式:
wget https://releases.hashicorp.com/packer/1.6.5/packer_1.6.5_linux_amd64.zip
unzip packer_1.6.5_linux_amd64.zip
cp packer /usr/loca/bin
chmod +x /usr/local/bin
packer version
govc安装
govc工具用于通过shell操作vCenter,因为默认情况下Packer不会自动删除模版虚拟机(export ovf模式下),本示例中使用govc删除已构建的模版虚拟机。
wget https://github.com/vmware/govmomi/releases/download/v0.23.0/govc_linux_amd64.gz
gzip -d govc_linux_amd64.gz
chmod +x govc_linux_amd64
mv govc_linux_amd64 /usr/local/bin/govc
govc version
ovftool安装
ovftool用于封装单个OVA文件,下载地址:https://code.vmware.com/web/tool/4.4.0/ovf
echo -e "/w00t\n" >> /tmp/answer && Mware-ovftool-4.4.0-16360108-lin.x86_64.bundle --eulas-agreed --required --console < /tmp/answer
ovftool --version
(增强)封装构建工具容器
如果你想让环境更加干净,也可以采用Container封装所有的工具,并在日常构建中,使用Container进行操作,Dockerfile如下:
FROM centos:7.8.2003
LABEL maintainer="Alex Li <guoqiangli@vmware.com>"
ENV PACKER_VERSION=1.6.5 \
GOVC_VERSION=v0.23.0 \
GOVC_INSECURE=true \
OVFTOOL_VERSION=4.4.0 \
TIME_ZONE=Asia/Shanghai
ADD ./govc ./packer ./packer-provisioner-windows-update ./mc ./VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle /usr/bin/
RUN chmod +x /usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle && \
echo -e "/w00t\n" >> /tmp/answer && \
/usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle --eulas-agreed --required --console < /tmp/answer && \
rm -rf /usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle && \
chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update /usr/bin/mc && \
yum install -y genisoimage && \
yum clean all && \
ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
WORKDIR /
CMD ["/bin/bash"]
CentOS 8的Packer模版
我们需要两个基础文件,用于使用Packer在vSphere环境中构建CentOS 8.x模版:
- centos-vsphere.json文件(Packer模版);
- ks.cfg文件(无人值守应答文件)
- files/add_ovf_properties.sh文件,用于修改Packer导出的ovf文件,增加“动态磁盘”和“用户输入参数”等内容,并封装成单个OVA文件;
- files/centos.xml.template文件,用于自定义用户输入信息模版,包含主机名、IP地址、NTP等配置;
- files/ovf-add-disk-1.xml和files/ovf-add-disk-2.xml文件,用于动态增加第二块磁盘;
- rc.local文件,用于在每次系统启动时调用,其会判断/usr/local/customization/ran_customization文件是否存在;
- setup.sh文件,用于操作系统初始化(主机名、IP地址、初始化磁盘等);
- output-vsphere目录,用于保存OVF和OVA的输出目录;
推荐下载仓库的文件,避免拷贝粘贴可能造成的字符问题;[packer-vsphere] (https://github.com/6547709/packer-vsphere/tree/master/CentOS8-OVF)
.
├── centos8_ks.iso
├── centos-vsphere.json
├── files
│ ├── add_ovf_properties.sh
│ ├── centos.xml.template
│ ├── ovf-add-disk-1.xml
│ ├── ovf-add-disk-2.xml
│ ├── rc.local
│ └── setup.sh
├── ks.cfg
└── output-vsphere
centos-vsphere.json文件说明
provissioners段落,用于系统自动化安全完成后的自定义操作,例如:更新系统补丁,清理模版等,本示例中进行了系统更新、上传rc.local和setup.sh文件。
"provisioners": [
{
"type": "shell",
"inline": [
"yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm",
"sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*",
"sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*",
"yum update -y",
"yum clean all",
"systemctl enable --now cockpit.socket",
"echo \"{{user `root-password`}}\" | passwd --stdin root",
"echo \"{{user `ops-password`}}\" | passwd --stdin ops",
"mkdir -p /usr/local/customization/",
"sed -i 's/^HISTSIZE=1000/HISTSIZE=2000/' /etc/profile",
"echo |tee /var/log/wtmp /var/log/btmp /root/.bash_history > /dev/null"
]
},
{
"type": "file",
"source": "files/rc.local",
"destination": "/etc/rc.d/rc.local"
},
{
"type": "file",
"source": "files/setup.sh",
"destination": "/usr/local/customization/setup.sh"
},
{
"type": "shell",
"inline": [
"chmod +x /etc/rc.d/rc.local",
"chmod +x /usr/local/customization/setup.sh"
]
}
],
post-processors段落,用于制备完成后,对OVF文件定制化、删除VC中遗留模版迅即和上传到S3存储等操作。
"post-processors": [
{
"type": "shell-local",
"environment_vars": ["CENTOS_VERSION={{ user `version` }}", "CENTOS_APPLIANCE_NAME={{ user `vm-name` }}", "FINAL_CENTOS_APPLIANCE_NAME={{ user `vm-name` }}_{{user `version`}}", "CENTOS_OVF_TEMPLATE={{ user `centos-ovf-template` }}"],
"inline": [
"cd files",
"chmod +x ./add_ovf_properties.sh",
"./add_ovf_properties.sh"
]
},
{
"type": "shell-local",
"environment_vars": ["GOVC_URL={{ user `vsphere-server` }}", "GOVC_USERNAME={{ user `vsphere-user` }}", "GOVC_PASSWORD={{ user `vsphere-password` }}" , "GOVC_INSECURE=true"],
"inline": [
"govc vm.destroy {{user `vm-name`}}"
]
},
{
"type": "shell-local",
"inline": [
"mc config host add minio-local {{user `s3-server`}} {{user `s3-access-key`}} {{user `s3-secret-key`}} --api s3v4",
"mc cp ./output-vsphere/{{user `vm-name`}}_{{user `version`}}.ova minio-local/{{user `s3-bucket`}}",
"mc ls minio-local/{{user `s3-bucket`}}",
"rm -rf ./output-vsphere/{{user `vm-name`}}_{{user `version`}}.ova"
]
}
],
Packer验证配置
完成配置文件的准备后,我们需要验证packer的配置文件是否正确,使用以下命令:
packer validate centos-vsphere.json
Packer执行构建
packer build centos-vsphere.json
如果在构建过程中遇见问题,可以使用如下命令进行构建,日志会输入到packer.log文件中。
PACKER_LOG=1 PACKER_LOG_PATH="packer.log" packer build -force -on-error=ask centos-vsphere.json
检查构建结果
构建完成后,命令行如下提示;
通过vCenter部署验证
通过vCenter部署生成的OVA模版。
显示模版的相关信息,产品名称、提供商等。
填写相关配置参数,操作系统启动后,会基于这些参数进行配置。
启动VM后,我们可以看到操作系统名称、IP地址、DNS和hosts记录都完成了配置。
我们增加的第二块磁盘也完成了lv创建,并挂载到/data目录。
完成
至此我们完成了OVA模版的基本配置定制化,从原理上能看出来,OVF的自定义属性可以被Guest OS通过VMware Tools读取到(详见setup.sh),并通过自己的脚本/程序对属性值进行处理,这将极大方便日后的自动化部署和自动化运维工作。
能否出个Photon的自定义属性模板
没问题,我近期测试一下。