從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:8LABEL maintainer="Alex Li <guoqiangli@vmware.com>"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 && yum install -y genisoimageWORKDIR /tmpCMD ["/bin/bash"]
使用Docker Build構建Docker Image,並上傳到容器倉庫(私有或公共)中:
docker build -t harbor.corp.local/library/gitops-packer:v1.0 .docker push login harbor.corp.localdocker login -u admin harbor.corp.localdocker push harbor.corp.local/library/gitops-packer:v1.0
docker pull hutson/semantic-delivery-gitlab:9.1.0docker tag hutson/semantic-delivery-gitlab:9.1.0 harbor.corp.local/library/semantic-delivery-gitlab:9.1.0docker 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,以後只要修改了相關配置文件,就會自動執行模版構建,由於此構建是並發執行的,效率非常高,最後,祝大家可以輕鬆工作和快樂生活。