在現代 DevOps 實踐中,將基礎設施佈建與組態管理整合至 CI/CD 流程是提升效率的關鍵。本文聚焦於一個進階應用場景,闡述如何利用 Azure Pipelines 作為協作平台,調度 Terraform 執行基礎設施的自動化創建,並接續透過 Ansible 進行精確的軟體組態。此流程展示了基礎設施即程式碼(IaC)從定義、驗證到應用的完整生命週期管理,為企業實現敏捷且可預測的雲端資源部署提供標準化技術藍圖。
Azure Pipelines 整合 Terraform 與 Ansible:進階配置與執行
本節將深入探討如何在 Azure Pipelines 中,利用 Terraform 和 Ansible 完成更細緻的基礎設施部署與配置任務。我們將重點關注 Terraform 的應用階段,以及 Ansible 的安裝與執行細節。
Terraform 應用階段的自動化與驗證
Terraform 的 apply 命令是實際創建或修改基礎設施的關鍵步驟。在 Azure Pipelines 中,我們可以通過以下方式自動化此過程:
自動批准與執行 (
terraform apply -auto-approve):- 腳本:
script: terraform apply -auto-approve - 顯示名稱:
Terraform apply - 工作目錄:
$(Build.SourcesDirectory)/CHAP08/terraform - 環境變數:
ARM_CLIENT_ID: $(AZURE_CLIENT_ID)ARM_CLIENT_SECRET: $(AZURE_SECRET)ARM_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)ARM_TENANT_ID: $(AZURE_TENANT)ARM_ACCESS_KEY: $(AZURE_ACCESS_KEY) (用於 Terraform 狀態後端)
- 說明:
-auto-approve選項允許 Terraform 在沒有人工干預的情況下直接應用變更。這對於 CI/CD 管道至關重要,可以實現完全自動化的部署。Azure 認證信息(服務主體憑證和存儲訪問金鑰)通過環境變數傳遞,確保管道能夠安全地訪問 Azure 資源。
- 腳本:
選擇性的人工審核: 雖然在此範例中使用了
-auto-approve,但在實際生產環境中,通常會在terraform plan和terraform apply之間插入一個「手動批准」步驟。這允許團隊成員在變更實際應用前進行審核,增加一層安全保障。
Ansible 的整合與執行
在 Terraform 完成基礎設施的佈建後,Ansible 將被用來配置這些資源。
安裝 Ansible 依賴:
- 腳本:
script: pip install ansible[azure]==2.8.6 - 顯示名稱:
Get requirements - 說明: 此步驟確保在管道代理機上安裝了 Ansible 及其與 Azure 交互所需的擴展模塊。指定版本
2.8.6有助於確保環境的一致性。
- 腳本:
執行 Ansible 劇本:
- 腳本:
script: ansible-playbook playbookdemo.yml -i inv.azure_rm.yml - 顯示名稱:
Ansible playbook - 工作目錄:
$(Build.SourcesDirectory)/CHAP08/ansible - 環境變數:
AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)AZURE_CLIENT_SECRET: $(AZURE_SECRET)AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)AZURE_TENANT: $(AZURE_TENANT)
- 說明: 此命令執行 Ansible 劇本 (
playbookdemo.yml),並使用 Azure 動態清單 (inv.azure_rm.yml) 來定位目標虛擬機器。Ansible 需要 Azure 相關的環境變數來與 Azure API 交互,以獲取目標主機信息。
- 腳本:
視覺化 Terraform 應用與 Ansible 配置的細節
以下圖示詳細展示了 Terraform 應用階段的自動化選項,以及 Ansible 的執行細節。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
start
component "Advanced IaC Deployment in Azure Pipelines" {
node "Terraform Apply Stage" {
:Execute 'terraform apply -auto-approve';
:Automated resource provisioning;
:Uses Azure Service Principal & Access Key;
}
node "Optional Manual Approval" {
:Intermediate step for review;
:Ensures safety before applying changes;
}
node "Ansible Requirements Installation" {
:Execute 'pip install ansible[azure]';
:Sets up Ansible environment;
}
node "Ansible Playbook Execution" {
:Execute 'ansible-playbook';
:Uses dynamic inventory;
:Applies configuration (e.g., Nginx install);
:Requires Azure credentials for inventory;
}
node "Final Configured Infrastructure" {
:Provisioned VM with Nginx;
}
}
Terraform Apply Stage --> Optional Manual Approval : (Conditional)
Optional Manual Approval --> Terraform Apply Stage : (If Approved)
Terraform Apply Stage --> Ansible Requirements Installation : Infrastructure Ready
Ansible Requirements Installation --> Ansible Playbook Execution : Ansible Environment Ready
Ansible Playbook Execution --> Final Configured Infrastructure : Configuration Applied
stop
@enduml看圖說話:
此圖示深入展示了 Azure Pipelines 中 Terraform 和 Ansible 的執行細節。核心是「Terraform Apply Stage」,它執行 terraform apply -auto-approve 命令,自動化地在 Azure 中創建基礎設施,並依賴 Azure 服務主體和存儲訪問金鑰進行認證。
在 Terraform 應用階段之後,可以選擇性地加入「Optional Manual Approval」步驟,提供一個審核點,以增加部署的安全性。隨後,「Ansible Requirements Installation」階段確保 Ansible 環境已準備就緒,通過 pip 安裝必要的套件。
最後,「Ansible Playbook Execution」階段運行 Ansible 劇本,利用動態清單定位目標主機,並執行配置任務,例如安裝 Nginx。所有這些步驟共同導向「Final Configured Infrastructure」,即一個已成功部署並配置完成的虛擬機器。
Ansible 環境變數與執行細節
Ansible 環境變數: 在 Azure Pipelines 的 YAML 文件中,為 Ansible 執行步驟設置必要的環境變數。這些變數與 Terraform 使用的 Azure 服務主體憑證相同,確保 Ansible 能夠訪問 Azure API 來獲取動態清單信息。
AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)AZURE_SECRET: $(AZURE_SECRET)AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)AZURE_TENANT: $(AZURE_TENANT)ANSIBLE_HOST_KEY_CHECKING: False: 此設置禁用 SSH 主機金鑰檢查,簡化了 CI/CD 環境中的連接配置。
Ansible 腳本執行:
- 第一腳本:
pip install ansible[azure]==2.8.6- 安裝 Ansible 及其 Azure 插件,這是動態清單正常工作的先決條件。 - 第二腳本:
ansible-playbook playbookdemo.yml -i inv.azure_rm.yml- 執行 Ansible 劇本,並使用inv.azure_rm.yml文件作為動態清單。Azure 服務主體的憑證會作為環境變數傳遞,以便 Ansible 能夠查詢 Azure 以獲取目標虛擬機器的信息。
- 第一腳本:
創建與運行完整的 Azure Pipeline
提交與推送: 將包含 Terraform 和 Ansible 配置的 YAML 文件提交並推送到 Git 倉庫。
創建 Azure Pipeline:
- 在 Azure Pipelines 中,創建一個新管道。
- 選擇包含您的代碼的 Git 倉庫。
- 選擇使用現有的 YAML 管道文件。
配置 Pipeline 變數: 在管道的編輯模式下,添加以下變數以存儲敏感資訊:
- Azure 服務主體的憑證(
AZURE_CLIENT_ID,AZURE_SECRET,AZURE_SUBSCRIPTION_ID,AZURE_TENANT)。 - Terraform 狀態後端所需的 Azure 存儲訪問金鑰(
AZURE_ACCESS_KEY)。 建議將這些變數設置為「Secret」類型,以保護其安全。
- Azure 服務主體的憑證(
運行管道與監控: 運行管道,並在日誌面板中監控 Terraform 和 Ansible 的執行過程。您可以看到 Terraform 命令的輸出,以及 Ansible 劇本的執行結果。
最終驗證:
- 在 Azure 門戶中,找到通過 Terraform 佈建的虛擬機器的公共 IP 地址。
- 在瀏覽器中訪問該公共 IP 地址。如果一切順利,您應該能看到 Nginx 的首頁。
視覺化 Terraform 和 Ansible 管道執行與驗證
以下圖示總結了整個 Terraform 和 Ansible 管道的執行流程,並強調了最終的驗證步驟。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
start
component "End-to-End IaC Deployment Pipeline" {
node "Pipeline Setup" {
:Create azure-pipeline.yaml;
:Configure pipeline variables (secrets);
:Commit and push to Git repository;
}
node "Terraform Execution" {
:Run terraform init, plan, apply;
:Provision Azure VM based on Packer image;
}
node "Ansible Configuration" {
:Install Ansible and Azure plugins;
:Execute Ansible playbook with dynamic inventory;
:Configure VM (e.g., install Nginx);
}
node "Execution Monitoring" {
:View logs in Azure Pipelines;
:Track Terraform and Ansible progress;
}
node "Final Verification" {
:Retrieve VM Public IP from Azure Portal;
:Access VM via browser (e.g., Nginx homepage);
}
}
Pipeline Setup --> Terraform Execution : Trigger Deployment
Terraform Execution --> Ansible Configuration : Infrastructure Ready for Config
Ansible Configuration --> Execution Monitoring : Report Status
Execution Monitoring --> Final Verification : Confirm Successful Deployment
stop
@enduml看圖說話:
此圖示總結了整個基礎設施即程式碼 (IaC) 的端到端部署流程,涵蓋了從管道設置到最終驗證的關鍵階段。首先,「Pipeline Setup」階段涉及創建和配置 YAML 管道文件,並將其推送到 Git 倉庫。
接著,「Terraform Execution」階段負責運行 Terraform 命令,根據 Packer 構建的映像來佈建 Azure 虛擬機器。隨後,「Ansible Configuration」階段安裝必要的 Ansible 工具,並執行劇本來配置虛擬機器,例如安裝 Nginx。
「Execution Monitoring」階段讓用戶能夠通過 Azure Pipelines 的日誌來追蹤 Terraform 和 Ansible 的執行進度。最後,「Final Verification」階段通過獲取虛擬機器的公共 IP 地址,並在瀏覽器中訪問它來確認部署和配置的成功,例如看到 Nginx 的首頁。
結論
縱觀現代 DevOps 生態系的演進,將 Terraform 的宣告式佈建與 Ansible 的程序化配置在 Azure Pipelines 中結合,已不僅是技術堆疊的選擇,更是實現高效能與穩定性兼備的關鍵策略。
此整合框架的深層價值在於其清晰的職責分離:Terraform 精準定義「基礎設施的最終狀態」,而 Ansible 則負責達成「該狀態下的精細配置」。然而,-auto-approve 所帶來的極致效率,必須與人工審核關卡提供的風險控制相權衡,這正是高成熟度團隊治理價值的體現。同時,跨越多個工具鏈的憑證管理是此架構的穩固基石,其安全性與一致性直接決定了整個自動化流程的可靠性,是實踐中不可忽視的瓶頸。
展望未來,此「宣告式佈建+程序化配置」的混合模式將與自動化安全掃描(DevSecOps)及合規性驗證深度整合,形成更具韌性的基礎設施交付生命週期。
玄貓認為,對於高階管理者而言,成功導入此模式的重點,不僅在於技術實現,更在於建立與之匹配的治理框架,確保自動化這列高速列車,始終行駛在安全且可控的軌道上。