概述:
vCenter内容库一直是我最常用的功能,其在vSphere的所有版本提供,我通过内容库管理多个vCenter环境的ISO光盘、虚拟机模版,但当我与客户沟通后,发现用户使用频率并不高,得到反馈:
- 手工维护虚拟机模版太复杂;
- 对虚拟机部署效率提升不大;
而这两点单独通过内容库是无法实现的,下面我将通过Packer工具、Govc工具和OVF文件自定义来帮助VMware的客户提高管理、运维效率,以及基础模版的安全性。
主要实现目标如下::
- 自动化构建虚拟机模版,并可定期更新;
- 虚拟机模版通过内容库管理;
- 模版基于安全基线(例如:等保3.0)构建,管理员可以自定义调整;
- 基于内容库部署虚拟机时,可自动完成操作系统初始化(主机名、IP地址、管理员密码等);
除了OVF模版定制外,还展示了govc、ovftool等工具的能力,相信对大家向自动化运维转型有所帮助。
如果您使用Terraform进行虚拟机交付,好消息是Terraform vSphere provider 1.20.0版本后开始支持OVA部署和OVF属性。
相关工具:
Packer是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。 vSphere是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。 govc是VMware官方出品的CLI工具,基于govmomi构建,非常适合自动化编排。 OVFTool是VMware官方出品的OVF和OVA导入/导出工具,在自动化部署和构建环境中经常被使用。 相关代码中包含Packer所需的json文件和CentOS8 OVF定制化相关文件。 工具Dokcer镜像集成Packer、OVFTool、Govc等工具。
环境需求:
- 一台Linux电脑,能够连接vCenter Server;
- VMware vSphere 7.0/8.0环境;
(可选)自行封装构建工具容器
如果你希望自己封装包含Packer、OVFTool、Govc等工具的Docker镜像,参考Dockerfile如下:
FROM rockylinux:8
LABEL maintainer="Alex Li <guoqiang.li@broadcom.com>"
ENV PACKER_VERSION=1.10.2
ENV GOVC_VERSION=v0.36.3
ENV GOVC_INSECURE=true
ENV LC_CTYPE=POSIX
ENV TIME_ZONE Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
ADD ./govc /usr/bin/
ADD ./packer /usr/bin/
RUN mkdir /app && rm -rf /usr/sbin/packer
ADD ./required_plugins.pkr.hcl /app
ADD ./VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle /app
WORKDIR /app
RUN packer init /app
RUN chmod a+x /usr/bin/govc /usr/bin/packer && \
dnf update -y && \
dnf install -y --setopt=tsflags=nodocs libnsl genisoimage expect python2 python2-pip xmlstarlet openssl sshpass && \
pip2 install requests termcolor argparse && \
dnf clean all
RUN /bin/sh /app/VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle --console --required --eulas-agreed && \
rm -rf /VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle
CMD ["/bin/bash"]
required_plugins.pkr.hcl用于packer初始化插件,本文章中只涉及vSphere的插件,windows-update插件用于Windows系统更新。
packer {
required_plugins {
vsphere = {
version = ">= v1.2.7"
source = "github.com/hashicorp/vsphere"
}
windows-update = {
version = ">=0.15.0"
source = "github.com/rgl/windows-update"
}
}
}
Rocky8-ovf的Packer模版相关文件
我们需要多个文件,用于使用Packer在vSphere环境中构建Rocky8的OVF模版:
- ks.cfg文件(无人值守应答文件,推荐详细分析此文件,作为系统初始化、安全加固非常有用)
- rocky8-ovf.auto.pkrvars.hcl文件(定义vCenter环境信息、ISO光盘位置和模版虚拟机配置)
- rocky8-ovf.pkr.hcl文件(Packer主文件,用于生命构建模版的过程和后续执行的动作)
- files/CustomizeOvf.sh文件(用于修改ovf文件的脚本,添加虚拟机规模、操作系统配置等)
- files/setup.sh文件(其存储在虚拟机模版中,用于基于ovf属性多操作系统进行初始化)
- files/UploadOvfToVCenter.sh文件(上传ovf虚拟机模版到vCenter内容库中)
- files/ovf-add-deployselect-1.xml文件(用于添加不同的虚拟机部署规模的描述)
- files/ovf-add-deployselect-2.xml文件(用于添加不同的虚拟机部署规模,eg. 2C4G/4C8G/8C12G等)
- files/ovf-add-multi-language.xml文件(多国语言支持文件,用于自定义内容提供多国语言支持)
- files/rocky8.xml文件(临时文件)
- files/rocky8.xml.template文件(用于自定义OVF属性内容)
- files/rc.local文件(用于Linux启用运行脚本,只运行一次)
- output-vsphere目录(用于保存OVF的临时输出目录)
推荐下载仓库的文件,避免拷贝粘贴可能造成的字符问题;[Rocky8-OVF] (https://github.com/6547709/2024-demo/tree/main/Rocky8-ovf)
Rocky8-ovf/
├── files
│ ├── CustomizeOvf.sh
│ ├── ovf-add-deployselect-1.xml
│ ├── ovf-add-deployselect-2.xml
│ ├── ovf-add-multi-language.xml
│ ├── rc.local
│ ├── rocky8.xml
│ ├── rocky8.xml.template
│ ├── setup.sh
│ └── UploadOvfToVCenter.sh
├── ks.cfg
├── output_vsphere
├── rocky8-ovf.auto.pkrvars.hcl
├── rocky8-ovf.pkr.hcl
└── variables.pkr.hcl
rocky8-ovf.pkr.hcl文件说明
source段落,用于定义虚拟机模版的配置,包含Bios类型、CPU、内存、ISO光盘和Kickstart文件等。
source "vsphere-iso" "rocky8" {
firmware = "efi-secure"
CPUs = var.vm_cpu_num
cpu_cores = var.vm_cpu_cores_num
RAM = var.vm_mem_size
RAM_reserve_all = false
boot_command = [
"<up>",
"e",
"<down><down><end><wait>",
" text inst.ks=hd:sr1:/ks.cfg",
"<enter><wait><leftCtrlOn>x<leftCtrlOff>"
]
boot_order = "disk,cdrom"
boot_wait = "10s"
cluster = var.vsphere_cluster
convert_to_template = false
datacenter = var.vsphere_datacenter
datastore = var.vsphere_datastore
disk_controller_type = ["pvscsi"]
export {
force = true
output_directory = "./output_vsphere"
}
folder = var.vm_folder
guest_os_type = "rhel8_64Guest"
insecure_connection = "true"
ip_wait_timeout = "60m"
ip_settle_timeout = "2m"
ip_wait_address = "10.0.0.0/8"
iso_paths = [var.iso_url]
cd_files = ["./ks.cfg"]
cd_label = "OEMDRV"
network_adapters {
network = var.vsphere_network
network_card = "vmxnet3"
}
notes = "Build via Packer, Version:${var.template_version} ."
password = var.vsphere_password
remove_cdrom = "true"
ssh_password = var.linux_ssh_password
ssh_username = "root"
ssh_timeout = "20m"
storage {
disk_size = var.vm_disk_size
disk_thin_provisioned = true
}
username = var.vsphere_user
vcenter_server = var.vsphere_server
video_ram = var.vm_video_ram
vm_name = "${var.vm_name}-${var.template_version}"
vm_version = var.vm_version
}
provisioner段落,用于向模版中追加文件和修改文件执行权限。
provisioner "file" {
destination = "/etc/rc.d/rc.local"
source = "files/rc.local"
}
provisioner "file" {
destination = "/usr/local/customization/setup.sh"
source = "files/setup.sh"
}
provisioner "shell" {
inline = ["chmod +x /etc/rc.d/rc.local", "chmod +x /usr/local/customization/setup.sh"]
}
post-processor段落,用于制备完成后,对OVF文件定制化、删除内容库中模版和上传新模版。
post-processor "shell-local" {
inline = [
"export VM_NAME=${var.vm_name}",
"export TEMPLATE_VERSION=${var.template_version}",
"export VSPHERE_NETWORK=${var.vsphere_network}",
"cd files",
"chmod +x ./CustomizeOvf.sh",
"./CustomizeOvf.sh"
]
}
post-processor "shell-local" {
inline = [
"export GOVC_URL=${var.vsphere_server}",
"export GOVC_USERNAME=${var.vsphere_user}",
"export GOVC_PASSWORD=${var.vsphere_password}",
"export VSPHERE_CONTENT_LIBRARY=${var.vsphere_content_library}",
"export VM_NAME=${var.vm_name}",
"export TEMPLATE_VERSION=${var.template_version}",
"cd files",
"chmod +x ./UploadOvfToVCenter.sh",
"./UploadOvfToVCenter.sh"
]
}
(必须修改)rocky8-ovf.auto.pkrvars.hcl文件说明
此文件必须修改为您所在环境的配置,其中要注意:内容库、虚拟机文件夹需要提前创建,vm_version根据需要进行修改,vSphere 7.0支持19,vSphere 8.0支持20。
// vSphere Config
vsphere_server = "mgmt-vc03.corp.local"
vsphere_user = "Administrator@vsphere.local"
vsphere_password = "******"
vsphere_datacenter = "VVF-DC"
vsphere_cluster = "VVF-Cluster"
vsphere_content_library = "VM-Templates"
vm_folder = "VM-Templates"
vsphere_datastore = "ST-10T"
// Rocky Install Media
iso_url = "[ST-ISO] 000ISO/Rocky-8.9-x86_64-dvd1.iso"
// Virtual Machine Hardware Settings
template_version = "1.0.0"
vm_name = "Rocky8-OVF"
vsphere_network = "dvpg-vlan4043"
vm_cpu_num = 4
vm_cpu_cores_num = 4
vm_mem_size = 4096
vm_disk_size = 102400
vm_video_ram = 8192
vm_version = 19
//Guest Operating System Metada
linux_ssh_password = "******"
OVF属性定制化介绍
为减少依赖,本示例采用bash脚本自定义ovf文件,如果您修改了示例文件的内容可能造成重新构建ovf异常,此时您可以查看“CustomizeOvf.sh”脚本,调整脚本代码进行修复。
如果您希望增加额外的操作系统初始化内容,例如:增加虚拟机监控、向资产管理平台注册等,您可以修改“setup.sh”脚本。
您还可以通过vCenter自定虚拟机的OVF属性,然后导出成OVF模版,以确定如何自定OVF文件。
使用Packer构建模版
完成配置文件的准备后,我们需要验证packer的配置文件是否正确,使用以下命令:
docker pull liguoqiang/packer-cli:1.10.2
docker run -it --rm -v /home/liguoqiang/packer/demo/Rocky8-ovf:/app/Rocky8-ovf liguoqiang/packer-cli:1.10.2 /bin/bash
进入Docker的Shell后,开始执行模版构建:
cd /app/Rocky8-ovf
packer init .
packer validate .
packer build .
检查构建结果
构建过程中Packer会在vCenter中创建虚拟机,并给予ks.cfg文件完成操作系统安装和初始化。
操作系统初始化完成后,Packer会通过ssh连接到虚拟机模版,并执行后续的定制化过程,包括执行脚本、自定义虚拟机ovf文件等,并最终上传到vCenter内容库中;
通过vCenter部署验证
通过vCenter内容库部署Rocky8-OVF模版。
选择部署位置和集群后,显示模版的相关信息,产品名称、提供商等。
选择虚拟机的硬件配置(vCPU和内存),此配置是OVF模版定制的。
选择虚拟机存储和网络
填写操作系统初始化配置参数,操作系统启动后,会基于这些参数进行配置。
注意:默认会禁用Root用户远程登录,以cloud-user作为超级管理员用户。
启动VM后,我们可以看到操作系统名称、IP地址、DNS和hosts记录都完成了配置。
并可以通过虚拟机的配置->设置->vApp选项看到部署时输入的信息。
完成
至此我们完成了虚拟机模版的构建,内容库上传和虚拟机自定义部署,不仅可以帮助客户高效的维护虚拟机模版,还可以帮助提高虚拟机部署效率。 从原理上能看出来,OVF的自定义属性可以被Guest OS通过VMware Tools读取到(详见setup.sh),并通过自己的脚本/程序对属性值进行处理,这将极大方便日后的自动化部署和自动化运维工作。
govc downlaod
https://github.com/vmware/govmomi/releases
packer download
https://github.com/hashicorp/packer/releases
ovf-tool download 需要账号哦
https://developer.broadcom.com/tools/open-virtualization-format-ovf-tool/4.6.2
govc,packer都是可以下载的,ovf-tools你注册一个账户就可以下载了,没有限制;如果你还不能下载,我再发给您。