GitOps—通过CI/CD自动化构建虚拟机模版( 二 )

  • 执行自动构建测试;
  • 在Gitlab CI/CD中添加定时任务;
  • 完成 。
  • 构建用于执行Packer命令的DockerIamge需要先通过相关工具中的地址下载packer、govc和windows update for packer三个执行文件 , 存储到与Dockerfile相同的目录中 , Dockerfile如下:
    FROM centos:8LABEL maintainer="Alex Li "ENV PACKER_VERSION=1.6.4ENV GOVC_VERSION=v0.23.0ENV GOVC_INSECURE=trueENV TIME_ZONE Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtimeADD ./govc /usr/bin/ADD ./packer /usr/bin/ADD ./packer-provisioner-windows-update /usr/binRUN chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update--tt-darkmode-color: #666666;">提示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: 2VM_MEM: 4096VM_DISK: 81920VM_VIDEO_RAM: 16384VM_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.0entrypoint: [""]stage: deliveronly:- masterscript:- semantic-delivery-gitlab --token ${GITLAB_TOKEN}#此阶段用于验证packer配置文件是否正确 。 packer-validate:image:name: ${PACKER_DOCKER_IMAGE}stage: validatescript:- packer validate ./CentOS8/centos-vsphere.json- packer validate ./Win2016/win2016-vsphere.jsononly:- tagsdependencies:- deliver#此阶段用于构建CentOS8所需的ISO文件 , 并上传到vSphere存储中(自动覆盖之前版本) 。 #for CentOS8 。 CentOS8-ks-iso-build:image:name: ${PACKER_DOCKER_IMAGE}stage: build-isoscript:- 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.isoonly:changes:- CentOS8/ks.cfg# -----此处省略部分代码 , 从github中获取完整代码------ #此阶段用于生成虚拟机模板 , 模板名基于job中变量定义 , 最终模板使用-latest最为后缀 。 #for CentOS8 。 packer-build-CentOS8:image:name: ${PACKER_DOCKER_IMAGE}stage: buildvariables:VM_NAME: ${CENTOS8_VM_NAME}script:- cd CentOS8- packer build --force centos-vsphere.jsononly:- tagsdependencies:- packer-validate# -----此处省略部分代码 , 从github中获取完整代码------ #for Windows Server 2016 。 packer-build-Win2016:image:name: ${PACKER_DOCKER_IMAGE}stage: buildvariables: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.jsontimeout: 120monly:- tagsdependencies:- packer-validate# -----此处省略部分代码 , 从github中获取完整代码------ #list vcenter content library 。 list-content-library:image:name: ${PACKER_DOCKER_IMAGE}stage: list-libraryscript:- govc library.info -json ${VC_CONTENT_LIBRARY}/*only:- tags


    推荐阅读