Ansible 致力於簡化自動化流程,而有效管理多個 Playbook 和理解組態設定至關重要。本文首先介紹如何使用 import_playbook 將多個 Playbook 整合至單一檔案 site.yml,避免手動執行多個 Playbook 的繁瑣流程,並確保所有任務依序執行。接著,文章探討 Ansible 組態檔案的運作機制,包含其預設搜尋路徑、INI 格式的組態檔案結構,以及如何透過環境變數或直接修改組態檔案來調整 Ansible 的行為。同時也提醒讀者留意組態檔案的安全性,特別是在多使用者環境下,應妥善設定存取許可權。最後,文章詳細說明如何使用 ansible-config 命令列工具,包含 list、dump 和 --only-changed 等選項,方便使用者檢視和管理 Ansible 的組態引數。此外,也強調了命令列引數的重要性,例如 --version、--help、-i、--private-key 和 --user 等,這些引數能提供更彈性的操作方式,並覆寫組態檔案中的設定,以滿足不同情境的佈署需求。
理解Ansible基礎 Chapter 2
在前面的章節中,我們已經成功地建立了兩個獨立的Playbook,分別針對不同的主機群組進行了簡單的連線測試。執行結果顯示,所有目標主機均成功回應,未出現任何錯誤。
appserver1-emea.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
appserver2-emea.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
然而,這種做法存在一個明顯的缺陷:需要手動執行多個Playbook。為了簡化操作並遵循最佳自動化實踐,我們可以利用import_playbook指令將多個Playbook合併成一個頂層的Playbook,命名為site.yml。
建立頂層Playbook
---
- import_playbook: frontend-na.yml
- import_playbook: appserver-emea.yml
執行這個單一的Playbook將獲得與依次執行多個Playbook相同的效果。
$ ansible-playbook -i production-inventory site.yml
輸出結果顯示,兩個Playbook被順利執行,所有主機均成功完成任務。
PLAY [frontends_na_zone]
*******************************************************
TASK [Gathering Facts]
*********************************************************
ok: [frontend2-na.example.com]
ok: [frontend1-na.example.com]
TASK [simple connection test]
**************************************************
ok: [frontend1-na.example.com]
ok: [frontend2-na.example.com]
PLAY [appservers_emea_zone]
****************************************************
TASK [Gathering Facts]
*********************************************************
ok: [appserver2-emea.example.com]
ok: [appserver1-emea.example.com]
TASK [simple connection test]
**************************************************
ok: [appserver2-emea.example.com]
ok: [appserver1-emea.example.com]
PLAY RECAP
*******************************************************************
appserver1-emea.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
appserver2-emea.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
frontend1-na.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
frontend2-na.example.com : ok=2 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
內容解密:
此輸出結果顯示了執行site.yml Playbook的過程和結果。透過import_playbook指令,我們成功地將多個Playbook合併,並自動執行所有包含的任務。
探索Ansible組態檔案
Ansible的行為部分由其組態檔案定義。系統會按照特定順序尋找組態檔案,優先順序如下:
ANSIBLE_CONFIG環境變數指定的檔案位置(如果已設定)- 當前工作目錄中的
ansible.cfg - 使用者主目錄中的
~/.ansible.cfg /etc/ansible/ansible.cfg(中央組態檔案)
大多數透過套件管理器安裝Ansible的使用者會在/etc/ansible目錄下找到預設的組態檔案。如果是透過原始碼或pip安裝,則需要自行建立中央組態檔案。
檢查Ansible安裝和組態
可以透過以下命令檢查Ansible的版本和組態檔案位置:
$ ansible --version
輸出結果可能如下:
config file = None
configured module search path = ['/Users/james/.ansible/plugins/modules',
'/usr/share/ansible/plugins/modules']
ansible python module location =
/usr/local/Cellar/ansible/2.9.6_1/libexec/lib/python3.8/site-
packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.8.2 (default, Mar 11 2020, 00:28:52) [Clang 11.0.0
(clang-1100.0.33.17)]
內容解密:
此命令輸出了Ansible的版本資訊、組態檔案位置、模組搜尋路徑、Python模組位置、可執行檔位置以及Python版本等重要資訊。
透過瞭解和調整Ansible的組態檔案,可以更好地滿足特定的需求和環境要求。接下來的章節將探討更多關於Ansible的使用和管理技巧。
深入理解 Ansible 基礎 Chapter 2
探索預設組態與設定引數
首先,讓我們來探索 Ansible 提供的預設組態。透過以下指令,我們可以列出目前的組態引數:
$ ansible-config list
此指令提供了 Ansible 支援的引數詳情,包括環境變數名稱(env 欄位)、組態檔案引數與段落(ini 欄位)、預設值(default 欄位)以及引數描述(description 欄位)。這些資訊來源於 lib/constants.py。
ansible-config list 輸出範例
ACTION_WARNINGS:
default: true
description:
- By default Ansible will issue a warning when received from a task action (module or action plugin)
- These warnings can be silenced by adjusting this setting to False.
env:
- name: ANSIBLE_ACTION_WARNINGS
ini:
- key: action_warnings
section: defaults
name: Toggle action warnings
type: boolean
version_added: '2.5'
AGNOSTIC_BECOME_PROMPT:
default: true
description: Display an agnostic become prompt instead of displaying a prompt containing the command line supplied become method
env:
- name: ANSIBLE_AGNOSTIC_BECOME_PROMPT
ini:
- key: agnostic_become_prompt
section: privilege_escalation
name: Display an agnostic become prompt
type: boolean
version_added: '2.5'
簡潔顯示所有組態引數及其目前值
若要簡潔地顯示所有可能的組態引數及其目前值,可以執行:
$ ansible-config dump
輸出結果會顯示所有組態引數(以環境變數格式呈現)及其目前設定。如果引數使用預設值,將在引數名稱後標示 (default)。
ansible-config dump 輸出範例
ACTION_WARNINGS(default) = True
AGNOSTIC_BECOME_PROMPT(default) = True
ALLOW_WORLD_READABLE_TMPFILES(default) = False
ANSIBLE_CONNECTION_PATH(default) = None
ANSIBLE_COW_PATH(default) = None
ANSIBLE_COW_SELECTION(default) = default
修改組態引數與觀察變化
讓我們來修改一個組態引數,看看對輸出的影響。例如,透過設定環境變數來修改 ANSIBLE_FORCE_COLOR:
$ export ANSIBLE_FORCE_COLOR=True
然後,再次執行 ansible-config dump,並加上 --only-changed 選項,以檢視哪些引數被修改過:
$ ansible-config dump --only-changed
ANSIBLE_FORCE_COLOR(env: ANSIBLE_FORCE_COLOR) = True
此命令告訴我們,ANSIBLE_FORCE_COLOR 已被修改為 True,且是透過環境變數設定的。
編輯 Ansible 組態檔案
Ansible 的組態檔案採用 INI 格式,包括段落(如 [defaults])、鍵值對(如 key = value)以及註解(以 # 或 ; 開頭)。你只需在組態檔案中放置需要修改的引數。
簡易組態檔案範例
# 設定我的組態變數
[defaults]
inventory = /Users/danieloh/ansible/hosts ; 這是 inventory 檔案的路徑
組態檔案的安全性考量
將 ansible.cfg 置於目前工作目錄時,應確保該檔案的安全性,特別是在多使用者系統上,限制存取許可權至使用者帳戶是非常重要的。
命令列引數的重要性
除了組態檔案外,傳遞給 Ansible 可執行檔的命令列引數也至關重要。這些引數可以覆寫組態檔案中的設定,例如使用 -i 開關來指定 inventory 檔案的位置。
綜上所述,瞭解並適當組態 Ansible 的組態引數和命令列引數,可以有效地控制 Ansible 的行為,從而更高效地完成自動化任務。
程式碼分析與邏輯解說
此段落主要探討瞭如何使用 ansible-config 命令列工具來管理和檢查 Ansible 的組態設定。下面是對範例程式碼的詳細解析:
$ ansible-config list
$ ansible-config dump
$ ansible-config dump --only-changed
ansible-config list:列出所有可用的 Ansible 組態引數,包括其預設值、描述、相關環境變數和 INI 組態檔案中的位置。- 作用:提供全面的組態資訊,方便管理員查詢和調整設定。
- 邏輯:查詢
lib/constants.py中的定義,輸出結構化的資訊。
ansible-config dump:顯示所有組態引數的目前值,無論它們是否被修改過。- 作用:提供目前 Ansible 環境的完整組態圖景。
- 邏輯:遍歷所有組態項,輸出其當前值,並標示是否為預設值。
ansible-config dump --only-changed:僅顯示那些與預設值不同的組態引數。- 作用:快速定位已修改的組態項,便於檢查和除錯。
- 邏輯:比較當前組態與預設組態,篩選出差異項後輸出。
這些命令共同構成了管理和診斷 Ansible 組態設定的有力工具。透過這些工具,可以靈活地調整和最佳化 Ansible 的執行行為。
Ansible 命令列引數詳解
在深入瞭解Ansible的基礎知識後,本章節將重點介紹如何使用命令列引數來執行Playbook,並探討一些常用引數的實際應用。
檢視Ansible版本與組態
首先,我們可以使用 --version 引數來確認Ansible是否已安裝及其版本:
$ ansible --version
輸出範例:
config file = None
configured module search path = ['/Users/james/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/Cellar/ansible/2.9.6_1/libexec/lib/python3.8/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.8.2 (default, Mar 11 2020, 00:28:52) [Clang 11.0.0 (clang-1100.0.33.17)]
瞭解Ansible命令列引數
幾乎所有Ansible可執行檔都支援 --help 選項,用於顯示有效的命令列引數。執行以下命令可檢視所有選項和引數:
$ ansible --help
輸出將顯示可用引數的詳細資訊,例如:
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD] [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS] [--scp-extra-args SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS] [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR] [-a MODULE_ARGS] [-m MODULE_NAME]
pattern
內容解密:
usage: ansible:顯示Ansible命令的基本用法。- 各個引數(如
-h、--version等)提供了不同的功能,例如顯示幫助資訊、版本資訊等。 pattern是必要的位置引數,用於指定主機模式。
使用命令列引數執行特定任務
除了執行adhoc任務外,Ansible還可以用於其他有用的任務。例如,列出特定群組中的主機:
$ ansible -i production-inventory --list-host appservers_emea_zone
輸出範例:
hosts (2):
appserver1-emea.example.com
appserver2-emea.example.com
內容解密:
-i production-inventory指定了用於Ansible操作的inventory檔案。--list-host appservers_emea_zone用於列出appservers_emea_zone群組中的主機。
在Playbook中使用命令列引數
同樣地,ansible-playbook 命令也支援多種命令列引數。例如,使用 --private-key 引數指定私鑰檔案:
$ ansible-playbook -i production-inventory site.yml --private-key ~/keys/id_rsa
或者,使用 --user 引數指定遠端使用者:
$ ansible-playbook -i production-inventory site.yml --user danieloh
內容解密:
-i production-inventory指定inventory檔案。site.yml是要執行的Playbook檔案。--private-key ~/keys/id_rsa指定用於SSH連線的私鑰檔案。--user danieloh指定用於連線的遠端使用者名稱。