在現代雲端架構中,基礎設施即程式碼(IaC)與組態管理的自動化已成為提升開發維運效率與系統穩定性的關鍵。本篇將深入探討 Azure Pipelines 作為 CI/CD 核心,如何串連 Terraform 的宣告式基礎設施佈建能力與 Ansible 的程序化組態管理優勢。此整合模式不僅解決了手動部署的複雜性與潛在風險,更建立了一套可重複、可驗證的交付流程。我們將從 Terraform 的部署任務談起,延伸至 Ansible Playbook 的執行,並進一步說明如何利用 Docker 將應用程式打包為標準化容器。此流程完整涵蓋了從底層資源創建、伺服器配置到應用程式容器化的完整生命週期,是實現 DevOps 精神與高效能雲端維運的標準實踐。
雲端基礎設施自動化:Azure Pipelines 的 Terraform 與 Ansible 整合實踐
深入探討如何在 Azure Pipelines 中整合 Terraform 和 Ansible,實現雲端基礎設施的自動化部署與配置,並詳細解析 Docker 的核心概念、安裝與 Dockerfile 的編寫,為後續的容器化微服務奠定基礎
本節將聚焦於利用 Azure Pipelines 實現雲端基礎設施的自動化部署與配置。我們將詳細闡述如何在 Azure Pipelines 中整合 Terraform 和 Ansible 這兩個強大的工具,以實現從基礎設施創建到應用程式配置的端到端自動化。同時,我們將引入 Docker 的核心概念,包括其安裝、Docker Hub 的註冊,以及如何編寫 Dockerfile 來構建應用程式映像檔,為後續的容器化微服務架構打下堅實的基礎。
Azure Pipelines 整合 Terraform 與 Ansible
Azure Pipelines 作為一個強大的 CI/CD 服務,能夠無縫整合 Terraform 和 Ansible,實現複雜的雲端基礎設施管理。
Terraform 的自動化部署:
- 目的: 自動化雲端資源(如虛擬機器、網路、資料庫)的創建、更新和刪除。
- Azure Pipelines 中的 Terraform 任務: Azure Pipelines 提供了豐富的 Terraform 任務,包括:
TerraformInstaller@0: 安裝指定版本的 Terraform。TerraformCLI@0: 執行 Terraform 命令,如init,plan,apply,destroy。
- 配置:
- 在 Pipeline 的 YAML 文件中,添加 Terraform 任務。
- 身份驗證: 配置 Azure 服務連接 (Service Connection),以便 Terraform 能夠安全地連接到 Azure 訂閱。
- 工作目錄: 指定 Terraform 配置文件所在的目錄。
- 命令參數: 設置要執行的 Terraform 命令及其參數(如
-var,-auto-approve)。
- 工作流程: CI 管道可以執行
terraform plan來預覽變更,CD 管道則在批准後執行terraform apply來實際部署。
Ansible 的自動化配置:
- 目的: 在已部署的基礎設施上,自動化安裝軟體、配置服務、管理使用者等。
- Azure Pipelines 中的 Ansible 任務:
Ansible@1: 執行 Ansible Playbook。
- 配置:
- 連接目標: 需要配置 Ansible 連接到目標虛擬機器。這通常透過 SSH 金鑰或 Azure 服務連接來實現。
- Playbook 路徑: 指定要執行的 Ansible Playbook 文件。
- 變數傳遞: 可以將變數傳遞給 Ansible Playbook,以實現動態配置。
- 工作流程: 在 Terraform 部署虛擬機器後,緊接著執行 Ansible 任務,對這些虛擬機器進行應用程式安裝和配置。
整合 Terraform 與 Ansible 的 CI/CD 流程:
- 一個典型的流程是:
- CI 階段: 執行
terraform plan,驗證基礎設施變更。 - CD 階段 (部署):
- 執行
terraform apply創建或更新基礎設施。 - 緊接著,執行 Ansible Playbook,對新創建或更新的資源進行配置。
- 執行
- CI 階段: 執行
- 這種組合能夠實現從底層基礎設施到上層應用程式配置的完整自動化。
- 一個典型的流程是:
Docker 核心概念與應用
Docker 是領先的容器化平台,它允許開發者將應用程式及其所有依賴打包到一個標準化的容器中,從而實現跨環境的一致運行。
Docker 的核心概念:
- 容器 (Container): Docker 容器是一個獨立、可執行、包含運行應用程式所需一切的軟體包,包括程式碼、運行時、系統工具、系統庫和設置。容器是隔離的,但共享主機操作系統的內核。
- 映像檔 (Image): Docker 映像檔是一個輕量級、獨立、可執行的軟體包,包含運行容器所需的所有內容:程式碼、運行時、庫、環境變數和配置文件。映像檔是唯讀的,基於分層文件系統。
- Dockerfile: 一個文本文件,包含了一系列指令,用於自動化構建 Docker 映像檔。Dockerfile 定義了映像檔的基礎、需要安裝的軟體、複製的程式碼、暴露的端口等。
- Docker Hub: 一個雲端註冊中心,用於儲存和分享 Docker 映像檔。類似於 GitHub 對於程式碼倉庫的作用。
Docker 安裝:
- 跨平台支援: Docker Desktop 可在 Windows 和 macOS 上運行,提供了一個方便的圖形界面。
- Linux 安裝: 可以透過官方提供的安裝腳本或操作系統的包管理器進行安裝。
- 伺服器端: 在 Linux 伺服器上安裝 Docker Engine。
註冊 Docker Hub:
- 創建一個 Docker Hub 帳戶,用於推送(上傳)和拉取(下載)Docker 映像檔。
- 在本地 Docker 客戶端登錄 Docker Hub:
docker login。
編寫 Dockerfile:
- 基本結構:
# 指定基礎映像檔 FROM ubuntu:latest # 設定工作目錄 WORKDIR /app # 複製應用程式程式碼到容器 COPY . . # 安裝應用程式依賴 RUN apt-get update && apt-get install -y python3 python3-pip RUN pip3 install -r requirements.txt # 暴露應用程式使用的端口 EXPOSE 8000 # 定義容器啟動時執行的命令 CMD ["python3", "app.py"] - 指令解析:
FROM: 指定基礎映像檔,如ubuntu,alpine,python:3.9-slim。RUN: 在映像檔層級執行命令,用於安裝軟體、創建目錄等。COPY: 將本地文件複製到映像檔中。ADD: 類似於 COPY,但增加了解壓 tar 包和從 URL 下載的功能。WORKDIR: 設定後續命令的工作目錄。EXPOSE: 聲明容器運行時監聽的端口。CMD: 定義容器啟動時的預設命令。ENTRYPOINT: 類似 CMD,但更適合用於設置容器的可執行文件。
- 基本結構:
Dockerfile 構建流程圖示
@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
partition "Dockerfile 構建映像檔流程" {
partition "Dockerfile 定義" {
:1. 選擇基礎映像檔 (FROM);
:2. 設定工作目錄 (WORKDIR);
:3. 複製應用程式檔案 (COPY/ADD);
:4. 安裝依賴與軟體 (RUN);
:5. 暴露應用程式端口 (EXPOSE);
:6. 定義啟動命令 (CMD/ENTRYPOINT);
}
partition "映像檔構建" {
:7. 執行 `docker build -t <image_name> .`;
note right: Docker 讀取 Dockerfile\n逐條執行指令\n創建映像檔層
:8. 每個指令創建一個新的映像檔層;
:9. 最終生成一個完整的 Docker 映像檔;
}
partition "映像檔推送" {
:10. 登錄 Docker Hub (`docker login`);
:11. 為映像檔打標籤 (`docker tag <local_image> <dockerhub_user>/<image_name>:<tag>`);
:12. 推送映像檔 (`docker push <dockerhub_user>/<image_name>:<tag>`);
}
}
stop
end note
@enduml
看圖說話:
此圖示詳細展示了使用 Dockerfile 構建 Docker 映像檔的整個流程。首先,「Dockerfile 定義」部分列出了編寫 Dockerfile 時需要包含的核心指令,如選擇基礎映像檔、設置工作目錄、複製文件、安裝依賴、暴露端口以及定義啟動命令。接著,「映像檔構建」部分說明了 docker build 命令如何讀取 Dockerfile,並逐條執行指令,為每個指令創建一個映像檔層,最終生成一個完整的映像檔。最後,「映像檔推送」部分則涵蓋了將構建好的本地映像檔推送到 Docker Hub 的步驟,包括登錄、打標籤和推送操作。這張圖為理解 Docker 映像檔的構建過程和發布流程提供了清晰的指引。
結論
縱觀現代管理者的多元挑戰,將雲端基礎設施自動化視為一項核心技術修養已是必然趨勢。Terraform 與 Ansible 在 Azure Pipelines 中的整合,不僅是工具的簡單疊加,更是將「宣告式基礎設施」與「冪等性組態管理」兩種哲學無縫融合的實踐。相較於傳統手動部署或零散的腳本,此整合方案提供了可版本控制、可重複驗證且高度一致的部署流程,大幅提升了維運效能與系統可靠性。然而,其挑戰在於初期的學習曲線與對 Terraform 狀態檔(State File)及 Ansible 動態主機清單(Dynamic Inventory)的精準掌握,這正是從「知道」到「精通」的關鍵瓶頸。
更深一層來看,這套自動化流程並非終點,而是通往雲端原生(Cloud-Native)架構的關鍵基石。文章中引入 Docker 概念,正揭示了此發展路徑的下一階段:將自動化從基礎設施層延伸至應用程式容器化層。未來的 2-3 年,我們將看到此類 CI/CD 流程與 Kubernetes 等容器調度平台更深度的整合,最終形成完整的 GitOps 生態系。
玄貓認為,對於追求卓越工程文化與高彈性商業架構的組織而言,投資建構此自動化基礎,已非「選項」,而是確保未來競爭力的「必要策略」。優先掌握此技術堆疊,才能在微服務與容器化的浪潮中,佔據穩固的領先地位。