从2月份开始的[模版自动化系列],已通过一系列的文章熟悉多种虚拟机模版的自动化构建,但在企业实际环境中模版的数量会远远超过这些,此时单一通过shell进行管理和更新,依然非常复杂和繁琐的(虽然相比以前已经有了很大的提高)。现在把自己基于GitOps的方式来管理模版分享出来,进一步提高模版的构建和管理效率,本篇文章将介绍如何通过GitLab CI/CD对模版进行自动化管理。
对于模版保存还存在一个重要的难题需要解决,那就是当云平台或其他自动调用的时候,并不是通过模版名称进行识别,那仅仅通过名称更新模版,就会导致其他系统无法正确识别新模版。vCenter 6.5开始支持模版更新,此特性正解决了我们遇到的问题,并且Packer也是在8月底的版本支持此特性(OVF模版)。使用vCenter内容库还有一个好处,内容库支持订阅,在企业内部如果包含多个vCenter环境的情况下,只需构建一次即可。
通过之前的文章大家对模版构建已经很熟悉了,为了提高移动设备的阅读体验,本手册不再介绍详细的模版配置,您可以通过访问 https://github.com/6547709/gitops-packer 直接查看代码和配置。
基于GitOps自动化构建vSphere模版特性:
Packer:是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。
vSphere:是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。
govc:是一个基于govmomi的cli工具,实现对vSphere的远程管理。
https://github.com/vmware/govmomi
Packer-provisioner-windows-update:Windows Update for packer插件。
https://github.com/rgl/packer-provisioner-windows-update
Gitlab CI/CD:是一个CI/CD工具,与代码集成在一起工作。
https://docs.gitlab.com/ee/ci/
Semantic-delivery-gitlab:镜像用于实现语义版本管理。 Harbor:是私有Docker镜像仓库,用于存储用于执行Packer、Govc和Genisoimage的Docker镜像。
https://hub.docker.com/r/hutson/semantic-delivery-gitlab
相关代码:中包含了Gitlab CI/CD所需的所有文件。
https://github.com/6547709/gitops-packer
针对各模版的配置请参考历史的文章。 CI/CD可以根据情况选择不同工具,原理都相同。
需要先通过相关工具中的地址下载packer、govc和windows update for packer三个执行文件,存储到与Dockerfile相同的目录中,Dockerfile如下:
FROM centos:8
LABEL maintainer="Alex Li <guoqiangli@vmware.com>"
ENV PACKER_VERSION=1.6.4
ENV GOVC_VERSION=v0.23.0
ENV GOVC_INSECURE=true
ENV TIME_ZONE Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
ADD ./govc /usr/bin/
ADD ./packer /usr/bin/
ADD ./packer-provisioner-windows-update /usr/bin
RUN chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update && yum install -y genisoimage
WORKDIR /tmp
CMD ["/bin/bash"]
使用Docker Build构建Docker Image,并上传到容器仓库(私有或公共)中:
docker build -t harbor.corp.local/library/gitops-packer:v1.0 .
docker push login harbor.corp.local
docker login -u admin harbor.corp.local
docker push harbor.corp.local/library/gitops-packer:v1.0
docker pull hutson/semantic-delivery-gitlab:9.1.0
docker tag hutson/semantic-delivery-gitlab:9.1.0 harbor.corp.local/library/semantic-delivery-gitlab:9.1.0
docker push harbor.corp.local/library/semantic-delivery-gitlab:9.1.0
这里不进行详细操作说明,下面是最终仓库内容的截图:
此文件是Gitlab CI/CD的主配置文件,常用配置参数在此文件中定义,无需修改packer和操作系统自动应答文件。
提示1:本手册为了易读,所有敏感信息也在此配置文件中声明,强烈建议使用Gitlab项目变量进行定义,避免敏感信息泄漏。 提示2:以下代码示例已经过删减,完成代码请从Github获取。
# 环境变量定义,生产环境不建议在此配置敏感定义(例如:密码)
variables:
DOCKER_DRIVER: "overlay2"
GITLAB_TOKEN: "xxxxxxxxxxxxx"
# 定义用于执行packer、govc和genisoimage的Docker镜像,需要提前构建
PACKER_DOCKER_IMAGE: "harbor.corp.local/library/packer-gitops:v1.0"
# 定义用于创建模板的vCenter相关信息,密码部分推荐在Gitlab的项目变量定义,以提高安全性。
VC_SERVER: "vcenter.corp.local"
VC_USERNAME: "Administrator@vsphere.local"
VC_PASSWORD: "VMware1!"
VC_DATACENTER: "Labs-DC02"
VC_CLUSTER: "DC02-Cluster"
VC_CONTENT_LIBRARY: "DC02-VM-Templates"
VC_FOLDER: "Templates"
VC_DATASTORE: "SSD_DATASTORE"
# 定义VM相关配置
VM_NETWORK: "vlan100"
VM_CPU: 2
VM_MEM: 4096
VM_DISK: 81920
VM_VIDEO_RAM: 16384
VM_HW_VERSION: 17
# 定义安装光盘的存储路径,Winodws系统需要根据安装光盘的不同调整自动应答文件。
# -----此处省略部分代码,从github中获取完整代码------
OS_CENTOS8_ISO: "[SSD_DATASTORE 0-ISO/CentOS-8.2.2004-x86_64-dvd1.iso"
OS_WINDOWS2016_ISO: "[SSD_DATASTORE] 0-ISO/cn_windows_server_2016_vl_x64_dvd.iso"
# 定义CentOS8自动应答光盘的存储路径,每次编译会自动覆盖之前版本。
OS_CENTOS8_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-ks.iso"
OS_CENTOS8_GUI_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-gui-ks.iso"
# 定义VMware Tools安装路径
OS_WINDOWS_VMTOOLS: "[SSD_DATASTORE] 0-ISO/VMware-tools-windows-11.1.5.iso"
# 定义Windows系统使用pvscsi驱动的路径,此文件只能同时被一个VM挂载,需要为每个Windows系统配置一个文件。
OS_WIN2016_DRIVER: "[SSD_DATASTORE] 0-ISO/win2016-pvscsi-Windows8.flp"
# 定义GOVC环境变量,用于上传CentOS8自动应答的ISO(ks.cfg)
GOVC_URL: ${VC_SERVER}
GOVC_USERNAME: ${VC_USERNAME}
GOVC_PASSWORD: ${VC_PASSWORD}
# 此配置用于定义Linux root和ops用户、Windows Administrator和ops用户的密码,密码推荐在Gitlab的项目变量定义,以提高安全性。
LINUX_SSH_PASSWORD: "VMware1!"
WINDOWS_PASSWORD: "VMware1!"
# 此变量用于定义虚拟机名称,最终会以-latest作为后缀存储到vCenter内容库中。
CENTOS8_VM_NAME: "CentOS8"
WIN2016_VM_NAME: "Win2016"
# 定义Windows安装KEY,根据不同的安装版本配置。
WIN2016_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX"
WIN2019_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX"
#定义CI/CD的阶段,devliver阶段用于生成版本号,validate阶段用于验证packer配置文件是否正确,build-iso阶段用于CentOS8的ISO制作,并自动上传到共享存储中,,build阶段用于模版构建,list-library阶段用于列出内容库模版。
stages:
- deliver
- validate
- build-iso
- build
- list-library
#采用语义版本管理,基于commit消息增加版本号和生成Release文档,此阶段不会进行打包和部署,仅仅是添加版本tag。
deliver:
image:
name: harbor.corp.local/library/sematic-delivery-gitlab:9.1.0
entrypoint: [""]
stage: deliver
only:
- master
script:
- semantic-delivery-gitlab --token ${GITLAB_TOKEN}
#此阶段用于验证packer配置文件是否正确。
packer-validate:
image:
name: ${PACKER_DOCKER_IMAGE}
stage: validate
script:
- packer validate ./CentOS8/centos-vsphere.json
- packer validate ./Win2016/win2016-vsphere.json
only:
- tags
dependencies:
- deliver
#此阶段用于构建CentOS8所需的ISO文件,并上传到vSphere存储中(自动覆盖之前版本)。
#for CentOS8。
CentOS8-ks-iso-build:
image:
name: ${PACKER_DOCKER_IMAGE}
stage: build-iso
script:
- cd CentOS8
- sed -i 's/__PASSWORD__/'"${LINUX_SSH_PASSWORD}"'/g' ./ks.cfg
- genisoimage -o centos8-ks.iso -V "OEMDRV" ./ks.cfg
- govc datastore.upload -ds ${VC_DATASTORE} centos8-ks.iso 0-ISO/centos8-ks.iso
only:
changes:
- CentOS8/ks.cfg
# -----此处省略部分代码,从github中获取完整代码------
#此阶段用于生成虚拟机模板,模板名基于job中变量定义,最终模板使用-latest最为后缀。
#for CentOS8。
packer-build-CentOS8:
image:
name: ${PACKER_DOCKER_IMAGE}
stage: build
variables:
VM_NAME: ${CENTOS8_VM_NAME}
script:
- cd CentOS8
- packer build --force centos-vsphere.json
only:
- tags
dependencies:
- packer-validate
# -----此处省略部分代码,从github中获取完整代码------
#for Windows Server 2016。
packer-build-Win2016:
image:
name: ${PACKER_DOCKER_IMAGE}
stage: build
variables:
VM_NAME: ${WIN2016_VM_NAME}
OS_WINDOWS_DRIVER: ${OS_WIN2016_DRIVER}
script:
- cd Win2016
- sed -i 's/__PASSWORD__/'"${WINDOWS_PASSWORD}"'/g' ./Autounattend.xml
- sed -i 's/__LICENSEKEY__/'"${WIN2016_KEY}"'/g' ./Autounattend.xml
- packer build --force win2016-vsphere.json
timeout: 120m
only:
- tags
dependencies:
- packer-validate
# -----此处省略部分代码,从github中获取完整代码------
#list vcenter content library。
list-content-library:
image:
name: ${PACKER_DOCKER_IMAGE}
stage: list-library
script:
- govc library.info -json ${VC_CONTENT_LIBRARY}/*
only:
- tags
标准且规范的commit消息不仅可以保证版本历史的可读性,还可以了解每次变更的内容和影响范围,并会自动在Release页面生成文档,所以,强烈建议采用标准的commit消息格式和内容。
fix: 当修复代码问题时,使用此标记。示例:fix: 修复Windows模版ISO文件错误。版本号变化:1.0.0->1.0.1
feat: 当新增功能或模版时,使用此标记。示例:feat: 增加Photon模版。版本号变化:1.0.0->1.1.0
[skip ci] 当不希望自动执行CI/CD时,在消息中增加此标记。示例:fix: 更新ReadME.[skip ci]。版本号变化:无变化
当提交变更后,Gilab CI/CD会基于.gitlab-ci.yml中的配置自动执行流水线,整个过程分为2组5个步骤:
流水线执行过程如下图所示,共花费25分钟时间,完成8个模版的自动化构建:
登录vCenter内容库查看模版更新:
在Gitlab CI/CD的计划中,添加一个每周/月的定时执行计划,添加完成后如下图所示。
在模版构建过程中,Windows的构建时间最长,某些情况下长达2个小时,可能会触发Gitlab CI/CD的超时和Packer的超时机制,导致任务失败。为提高模版构建效率和降低出错率,建议自行封装带有最新补丁的模版,下面是大致的制作过程,共参考。
提示1:DISM++虽然提供系统更新的功能,但是针对Windows Server系统似乎不正常,所以建议使用手工添加补丁的方式。 提示2:通过DISM工具还可以将pvscsi的驱动添加到安装光盘中,这样就无需额外添加pvscsi驱动。
至此通过Gitlab CI/CD、Govc和Packer实现了vSphere环境下的模版GitOps,以后只要修改了相关配置文件,就会自动执行模版构建,由于此构建是并发执行的,效率非常高,最后,祝大家可以轻松工作和快乐生活。
来源:
https://www.toutiao.com/i6882207358122983948/