Ansible 的核心價值在於簡化自動化流程,但其進階功能的掌握更是提升效率的關鍵。delegate_to
指令實作了任務委派,例如在不停機佈署程式碼時,可將任務委派給本地主機執行,透過 rsync
同步檔案到遠端主機,避免直接操作前端伺服器。run_once
選項確保任務在整個 playbook 執行過程中只在一臺主機上執行一次,適用於資料函式庫 Schema 更新等場景。Ansible 也支援透過跳板機連線到隔離網路中的裝置,並提供 vars_prompt
功能,允許在執行過程中取得使用者輸入,例如密碼或設定選項。
深入理解 Ansible 任務執行與連線控制技術
Ansible 致力於簡化自動化流程,但真正掌握其精髓需要深入理解其進階功能。本文將引領你探索任務委派、單次執行、跳板機設定以及動態提示等技巧,提升 Ansible 自動化技能。
精準掌控:任務委派與 delegate_to
在 Ansible 的世界中,delegate_to
指令扮演著關鍵角色,它允許你將任務委派給指定的目標主機執行,即使該主機並不在主要目標清單中。這在處理複雜的網路架構和多層級系統管理時尤為重要。
案例:不停機佈署的藝術
假設你需要在不停機的情況下佈署程式碼到多臺前端伺服器。這通常需要將伺服器從負載平衡器中移除、佈署程式碼、然後再將伺服器加回負載平衡器。delegate_to
正是解決這個問題的利器。
- name: 流暢佈署,不停機
hosts: frontends
tasks:
- name: 從本地主機同步檔案到遠端主機
local_action:
module: command
_raw_params: rsync -a /tmp/ {{ inventory_hostname }}:/tmp/target/
等同於:
tasks:
- name: 從本地主機同步檔案到遠端主機
command: rsync -a /tmp/ {{ inventory_hostname }}:/tmp/target/
delegate_to: localhost
內容解密:
此程式碼定義了一個 Ansible playbook,用於在不停機的情況下將檔案從本地主機同步到多臺前端伺服器。delegate_to: localhost
確保任務在本地主機上執行,然後透過 rsync
將檔案同步到遠端主機。這種方法避免了直接在前端伺服器上操作,從而實作不停機佈署。
一次到位:run_once
選項的妙用
run_once
選項確保任務在整個 playbook 執行過程中只在一臺主機上執行一次。這在管理叢集環境時非常有用,例如資料函式庫 schema 更新或叢集服務設定,只需執行一次即可。
案例:資料函式庫 Schema 升級
---
- name: 資料函式庫 Schema 升級,一次搞定
hosts: databases
tasks:
- name: 升級資料函式庫 Schema
debug:
msg: 正在升級資料函式庫 Schema...
run_once: true
內容解密:
此 playbook 將只在一臺資料函式庫主機上執行 Schema 升級任務,避免重複操作,確保資料函式庫一致性。run_once: true
確保任務僅執行一次,無論 databases
群組中有多少臺主機。
跨越藩籬:代理和跳板機的設定
在許多企業環境中,核心網路裝置通常位於隔離網路中,只能透過跳板機存取。Ansible 提供了靈活的代理設定,讓你可以輕鬆管理這些裝置。
graph LR A[Ansible 控制主機] -->|SSH 連線| B[跳板機] B -->|內部網路連線| C[目標裝置]
圖表翻譯:
此圖表展示了 Ansible 如何透過跳板機連線到目標裝置。首先,Ansible 控制主機透過 SSH 連線到跳板機,然後跳板機再連線到隔離網路中的目標裝置。這種架構使得管理隔離網路中的裝置變得更加靈活和安全。
互動體驗:Ansible 動態提示
Ansible 的 vars_prompt
功能讓你的 Playbook 更具互動性,允許你在執行過程中從使用者那裡取得資訊,例如密碼或設定選項。
vars_prompt:
- name: loginid
prompt: "請輸入您的使用者名稱"
private: no
- name: password
prompt: "請輸入您的密碼"
private: yes
tasks:
- name: 執行登入
debug:
msg: "以 {{ loginid }} 登入中..."
內容解密:
vars_prompt
區塊定義了需要提示使用者輸入的變數。private: yes
設定確保密碼輸入不會顯示在螢幕上,提高安全性。這種互動式設計使得 Playbook 能夠根據使用者的輸入動態調整執行流程。
本地執行與 localhost 連線的區別
理解 Ansible 中本地執行和 localhost 連線的區別至關重要。本地執行是指直接在 Ansible 控制主機上執行任務,而 localhost 連線則是指透過 SSH 連線到 localhost。
[local]
localhost ansible_connection=local
內容解密:
ansible_connection=local
設定告訴 Ansible 使用本地連線方式,避免建立不必要的 SSH 連線。這種設定在需要直接操作本地資源時非常有用,可以提高效率並減少連線開銷。
graph LR A[本地執行] --> B{直接操作本地資源} C[localhost 連線] --> D(透過 SSH 連線到 localhost)
圖表翻譯:
此圖表比較了本地執行和 localhost 連線的區別。本地執行直接在 Ansible 控制主機上操作本地資源,而 localhost 連線則是透過 SSH 連線到 localhost。兩者在許可權管理和連線方式上有所不同。
精準控制 Playbook 執行:標籤與條件式執行
在管理大型與複雜的基礎架構時,我們經常需要根據特定條件或需求執行 playbook 的部分任務。Ansible 提供了標籤和條件式執行兩種機制,讓你能更精細地控制 playbook 的行為。
利用標籤選擇性執行任務
標籤功能讓你可以為 playbook 中的任務增加標籤,然後在執行 playbook 時,透過 --tags
或 --skip-tags
引數指定要執行或跳過的標籤,從而實作選擇性執行任務。
- name: 有條件地安裝軟體套件
hosts: all
tasks:
- name: 安裝 Python3 在 CentOS 上
yum:
name: python3
state: present
when: ansible_distribution == "CentOS"
- name: 安裝 Python 在 Ubuntu 上
apt:
name: python3
state: present
when: ansible_distribution == "Ubuntu"
內容解密:
此 playbook 將根據作業系統發行版 (ansible_distribution
) 的不同,條件式地安裝 Python3。在 CentOS 系統上使用 yum
安裝,而在 Ubuntu 系統上則使用 apt
。這種靈活性使得相同的 playbook 可以適用於不同的作業系統環境。
Ansible Vault:保護敏感資料
在 playbook 中,我們經常需要使用一些敏感資料,例如密碼、API 金鑰等。為了避免這些敏感資料以明文形式儲存在 playbook 中,Ansible 提供了 Vault 功能,可以對敏感資料進行加密。
---
- name: 使用 Ansible Vault
hosts: databases
vars:
database_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
# 省略加密內容...
內容解密:
database_password
變數的值使用了 !vault
標籤,表示該值已被 Ansible Vault 加密。在執行 playbook 時,Ansible 會提示你輸入 Vault 金鑰來解密該變數。這種加密措施有效保護了敏感資料的安全性。
Ansible 叢集升級策略
叢集升級往往風險重重,任何錯誤都可能導致服務中斷。Ansible 提供了多種功能,協助我們安全有效地管理叢集升級。
分批執行,降低風險
- hosts: all
serial: 2
tasks:
- name: 更新 Nginx 網頁伺服器軟體套件至最新版本
apt: name=nginx state=latest
內容解密:
此設定將所有主機分成兩臺一組,依次更新 Nginx 網頁伺服器軟體套件,有效控制影響範圍,降低升級風險。
自動中止,避免災難
- hosts: all
max_fail_percentage: 20
tasks:
- name: 重啟關鍵服務以套用更新
shell: systemctl restart critical_service
圖表翻譯:
graph LR A[開始升級] --> B{檢查失敗比例} B -->|低於20%| C[繼續升級] B -->|超過20%| D[中止升級] C --> E[完成升級] D --> F[發出警示]
此圖表展示了 Ansible 如何根據失敗比例決定是否繼續或中止升級流程,有效避免了大規模失敗的風險。