Ansible 作為現代 IT 自動化與組態管理的關鍵工具,其運作核心建立在一套清晰且模組化的組件之上。要有效發揮其強大功能,首要之務便是深入理解其基礎架構,特別是目標主機清單(Inventory)、劇本(Playbook)以及核心配置文件(ansible.cfg)之間的協作關係。清單不僅是定義管理對象的目錄,更是實現基礎設施即代碼(Infrastructure as Code)的第一步,透過群組與變數的靈活運用,能將複雜的系統環境抽象化為可管理的邏輯單元。掌握這些組件的配置與組織方式,是建構可擴展、可維護且具備一致性的自動化工作流程的基石,為企業實現高效能的維運管理模式提供理論支持。

Ansible 核心組件與配置詳解

本章節將深入探討 Ansible 的核心組件,包括目標主機 (Hosts)、清單 (Inventory) 和劇本 (Playbook),並說明它們在 Ansible 工作流程中的作用。同時,我們將詳細介紹 Ansible 的主要配置文件 (ansible.cfg),包括其預設內容、配置選項以及在 Azure Cloud Shell 環境下的特殊配置方法,為後續的實踐操作奠定堅實的理論基礎。

Ansible 的核心組件 (Artifacts)

Ansible 的運作依賴於幾個關鍵的組件,它們共同構成了 Ansible 的配置管理體系:

  • 目標主機 (Hosts): 這是 Ansible 將要執行配置操作的目標系統。這些主機可以是本地機器,也可以是遠端的伺服器,包括虛擬機器、容器或其他網路設備。Ansible 透過 SSH 或 WinRM 等協議與這些主機進行通信。

  • 清單 (Inventory): 清單是 Ansible 用來定義和組織目標主機的文件。它通常是一個 INI 或 YAML 格式的文件,列出了 Ansible 需要管理的伺服器。清單不僅可以簡單地列出主機名或 IP 地址,還可以對主機進行分組,並為每個主機或主機組定義變數。

    • 靜態清單: 直接在文件中列出主機和組。
    • 動態清單: 透過腳本或 API 動態生成主機列表,這對於雲端環境(如 Azure、AWS)尤其有用,可以自動發現和管理動態變化的資源。
  • 劇本 (Playbook): 劇本是 Ansible 的核心配置腳本,它使用 YAML 語言編寫,描述了一系列 Ansible 要在目標主機上執行的任務。劇本定義了「什麼」需要被配置,以及「如何」進行配置。一個劇本可以包含多個「階段」(plays),每個階段針對特定的目標主機組執行一系列任務。

Ansible 的配置管理 (ansible.cfg)

Ansible 的行為可以透過一個名為 ansible.cfg 的配置文件進行自定義。這個文件通常位於 /etc/ansible/ansible.cfg 路徑下,並在 Ansible 安裝時由安裝程式自動創建。

ansible.cfg 文件包含多個配置選項,用於控制 Ansible 的各種行為,例如:

  • 連接設置: 如 SSH 連接的超時時間、重試次數、使用哪種傳輸協議 (ssh 或 smart)。
  • 模組行為: 如模組的預設路徑、是否啟用模組的緩存。
  • 清單設置: 如預設清單文件的路徑。
  • 安全設置: 如是否啟用 SSH 主機金鑰校驗。

預設的 ansible.cfg 文件通常包含大量的註釋掉的配置選項,旨在為使用者提供一個完整的參考。您可以通過修改這個文件來調整 Ansible 的預設行為,以適應您的工作流程和環境。

在 Azure Cloud Shell 中的配置:

如果您在 Azure Cloud Shell 中使用 Ansible,由於 Cloud Shell 的環境是臨時且共享的,預設的 /etc/ansible/ansible.cfg 可能無法持久化或滿足您的需求。在這種情況下,您需要手動創建一個 ansible.cfg 文件,並將 ANSIBLE_CONFIG 環境變數指向該文件的路徑。

例如,您可以在您的 Cloud Shell 主目錄下創建一個 ansible.cfg 文件,然後設置環境變數:

# 在 Cloud Shell 中創建 ansible.cfg 文件
echo "[defaults]" > ~/ansible.cfg
echo "inventory = ~/inventory" >> ~/ansible.cfg # 假設您的清單文件也在主目錄
echo "remote_user = azureuser" >> ~/ansible.cfg # 設定遠端使用者

# 設定 ANSIBLE_CONFIG 環境變數
export ANSIBLE_CONFIG=~/ansible.cfg

這樣,Ansible 在執行時就會讀取您自定義的配置文件,而不是使用系統預設的配置。

理解這些核心組件和配置選項,是有效使用 Ansible 進行系統自動化配置的基礎。接下來,我們將實際操作,學習如何創建清單和編寫劇本。

Ansible 清單 (Inventory) 架構與實踐

本章節將深入探討 Ansible 清單 (Inventory) 的概念與架構,重點介紹靜態清單的創建方式,包括基本的單一主機配置、使用群組 (Groups) 來組織多樣化的主機角色,以及如何為特定主機或群組定義變數。內容將引導讀者透過實際範例,理解如何有效地組織和管理 Ansible 的目標主機,為後續的劇本執行奠定基礎。

Ansible 清單:目標主機的組織與管理

Ansible 清單是 Ansible 用來識別和組織其將要管理的目標主機的關鍵文件。它定義了 Ansible 需要連接和執行配置任務的伺服器列表。清單主要分為兩種形式:靜態清單和動態清單。

靜態清單 (Static Inventory)

靜態清單是最基礎的清單形式,它直接在文件中列出目標主機的 IP 地址或 Fully Qualified Domain Name (FQDN)。這種方式適用於您已經明確知道所有目標主機地址的場景。

創建靜態清單檔案:

  1. 建立目錄: 首先,為您的 Ansible 專案創建一個專用的目錄,例如 devopsansible

    mkdir devopsansible
    cd devopsansible
    
  2. 創建清單文件: 在該目錄下,創建一個名為 myinventory 的文件(無擴展名),並在其中列出目標主機的地址。

    # myinventory 範例
    192.10.14.10
    localhost
    

    當 Ansible 執行時,如果指定了此清單文件,它將會嘗試在 192.10.14.10localhost 這兩台主機上執行所有定義的任務。

使用群組 (Groups) 組織主機

在實際的企業環境中,一個應用程式通常由多種不同角色的伺服器組成,例如 Web 伺服器、資料庫伺服器、應用程式伺服器等。為了更有效地管理這些不同角色的主機,Ansible 允許您將主機組織到不同的群組中。

群組的定義:

在清單文件中,群組名稱用方括號 [] 包圍,並置於主機列表之上。

# myinventory 範例 (包含群組)

[webserver]
192.10.20.31
192.10.20.32

[database]
192.10.30.10

[appserver]
192.10.40.20

在這個例子中:

  • webserver 群組包含了兩台 Web 伺服器。
  • database 群組包含了一台資料庫伺服器。
  • appserver 群組包含了一台應用程式伺服器。

透過這種群組化的方式,您可以編寫一個劇本,針對特定的群組(例如 webserver 群組)執行一系列配置任務,而無需為每台主機單獨指定。

為群組和主機定義變數

Ansible 還支持為特定的主機或群組定義變數。這些變數可以在劇本中使用,從而實現更靈活和參數化的配置。

變數的定義方式:

變數可以在清單文件中直接定義,也可以在單獨的變數文件中定義。

  • 在清單文件中定義變數:

    [webserver]
    web1.example.com http_port=8080
    web2.example.com http_port=8081
    
    [database]
    db1.example.com db_port=5432
    
    [all:vars]
    ansible_user=admin
    ansible_ssh_private_key_file=~/.ssh/id_rsa
    

    在上面的例子中:

    • web1.example.comweb2.example.com 分別被賦予了不同的 http_port 變數值。
    • db1.example.com 被賦予了 db_port 變數。
    • [all:vars] 部分定義了適用於所有主機的變數,例如 ansible_user 和 SSH 私鑰路徑。

透過這種方式,您可以為不同的環境或主機角色定義特定的配置參數,使得劇本更加通用和易於管理。

動態清單 (Dynamic Inventory)

雖然本節重點介紹靜態清單,但值得一提的是,對於雲端環境中經常變動的資源,動態清單是更為推薦的方式。動態清單通常由腳本(例如 Python 腳本)生成,該腳本會查詢雲端 API(如 Azure API)來獲取當前活躍的資源列表,並以 Ansible 可識別的格式輸出。這確保了 Ansible 始終能夠管理到最新的基礎設施狀態。

縱觀現代管理者的多元挑戰,精通 Ansible 核心組件與配置的過程,已不僅是單純的技術能力提升,更可視為對系統化管理思維的深度修養。相較於傳統逐點式的維運思維,Ansible 的清單架構,特別是群組與變數的應用,迫使實踐者從單一節點的維護者,轉變為整個服務生態系的架構師。

這個從「點」到「面」的思維轉變,其初始挑戰在於建立一套清晰、可擴展的清單與 ansible.cfg 治理框架。然而,一旦跨越此瓶頸,其整合價值便體現於將瑣碎的配置工作,升級為可預測、可複用且具備高度彈性的策略部署。這正是區分資深專家與初階執行者的關鍵能力分野。

展望未來,隨著雲原生與混合雲架構日趨複雜,單純編寫劇本的技能將逐漸普及,而真正能定義技術領導者價值的,將是其設計與維護一套能反映業務邏輯與組織架構的動態清單系統的能力。

玄貓認為,對於追求卓越的管理者與工程師而言,與其急於堆疊功能性的劇本,不如優先投資心力於清單的結構化設計與配置治理。這一步看似基礎,卻是將自動化從「執行工具」提升為「戰略資產」的關鍵樞紐。