Ansible 學習筆記 - 定位主機和組的模式

東風微鳴發表於2023-01-15

中英文對照表

英文 中文 備註
host 主機
group (主機)組
pattern 模式
ad hoc 特別命令
playbook 劇本 Ansible 專有名詞,一段複雜的編排
inventory 庫存 Ansible 專有名詞
flag 標誌
alias 別名

模式(Patterns):定位主機和主機組

當您透過一個特別命令(ad hoc)或執行一個劇本(playbook)執行 Ansible 時,您必須選擇要針對哪個受管節點或組執行。模式允許您針對庫存(inventory)中的特定主機和/或組執行命令和劇本。Ansible 模式可以引用單個主機、IP地址、庫存組、一組 組或庫存中的所有主機。模式非常靈活——您可以排除或要求主機子集,使用萬用字元或正規表示式,等等。Ansible 在模式中包含的所有庫存主機上執行。

使用模式

幾乎在執行特別命令或劇本時都要使用模式。模式是特別命令(ad hoc command )中唯一沒有標誌的元素。其通常是第二個元素:

ansible <pattern> -m <module_name> -a "<module options>"

例如:

ansible webservers -m service -a "name=httpd state=restarted"

⚠️ 注意:

如果 shell 是 zsh,<pattern> 需要用雙引號括起來,如下:

  • ✅ ansible "component*" -m ping
  • ❌ ansible component* -m ping ,這個會報錯:「zsh: no matches found: component*」

在劇本中,模式是每個劇本的 hosts: 行內容:

- name: <play_name>
  hosts: <pattern>

例如:

- name: restart webservers
  hosts: webservers

由於您經常希望一次針對多個主機執行命令或劇本,因此模式通常引用庫存組。特別命令和上面的劇本都將對 webservers 組中的所有機器執行。

常用模式

該表列出了針對庫存主機和組的常見模式。

描述 模式 目標
所有主機 all (或 *)
一臺主機 host1
多臺主機 host1:host2 (或 host1,host2)
一個(主機)組 webservers
多個(主機)組 webservers:dbservers webservers 組中的所有主機加上 dbservers 中的所有主機
排除(主機)組 webservers:!atlanta 在 webservers 且不在 atlanta 組中的所有主機
組的交集 webservers:&staging 既在 webservers 又在 staging 中的所有主機

✍️ 筆記:

可以使用逗號(,)或冒號(:)分隔主機列表。在處理範圍和 IPv6 地址時,首選逗號。

一旦你知道了基本的模式,你就可以把它們組合起來。舉個例子:

webservers:dbservers:&staging:!phoenix

針對 “webservers” 組和 “dbservers” 組中所有也在 “staging” 組中的機器,除了 “phoenix” 組中的機器。

您可以對 FQDN 或 IP 地址使用萬用字元模式,只要目錄中的主機是透過 FQDN 或 IP 地址命名的:

192.0.\*
\*.example.com
\*.com

你可以同時混合萬用字元模式和組:

one*.com:dbservers

模式的限制

模式取決於庫存。如果一個主機或組沒有列在你的目錄中,你不能使用模式來鎖定它。如果你的模式包含一個 IP 地址或主機名,但沒有出現在庫存中,你會看到這樣的錯誤:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com

您的模式必須與庫存語法匹配。如果將主機定義為別名:

atlanta:
  host1:
    http_port: 80
    maxRequestsPerChild: 808
    host: 127.0.0.2

您必須在模式中使用別名。在上面的示例中,必須在模式中使用 host1。如果你使用 IP 地址,你將再次報錯:

[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

高階模式選項

上面描述的通用模式將滿足您的大多數需求,但是 Ansible 提供了其他幾種方法來定義您想要目標的主機和組。

在模式中使用變數

你可以透過 -e 引數使用變數來向 ansible-playbook 傳遞組說明符:

webservers:!{{ excluded }}:&{{ required }}

在模式中使用組位置

可以根據主機在組中的位置定義主機或主機子集。例如,給定下列組:

[webservers]
cobweb
webbing
weber

您可以使用下標來選擇單獨的主機或範圍內的 webservers 組:

webservers[0]       # == cobweb
webservers[-1]      # == weber
webservers[0:2]     # == webservers[0],webservers[1]
                    # == cobweb,webbing
webservers[1:]      # == webbing,weber
webservers[:3]      # == cobweb,webbing,weber

在模式中使用正則

你可以以 ~ 開頭,指定一個模式作為一個正規表示式:

~(web|db).*\.example\.com

模式和 ansible-playbook 標誌

您可以使用命令列選項更改劇本中定義的模式的行為。例如,可以透過指定 -i 127.0.0.2, (注意末尾的逗號),在單個主機上執行一個定義了所有主機的劇本。即使你的目標主機沒有在你的庫存中定義,這也可以工作。你也可以使用 --limit 標誌來限制你的目標主機:

ansible-playbook site.yml --limit datacenter2

最後,您可以使用 --limit 從檔案中讀取主機列表,方法是在檔名前加上 @ 字首:

ansible-playbook site.yml --limit @retry_hosts.txt

如果 RETRY_FILES_ENABLED 設定為 True, ansible-playbook 執行後將建立一個 .retry 檔案,其中包含所有劇本中失敗的主機列表。每次 ansible-playbook 執行結束時,該檔案都會被覆蓋。

ansible-playbook site.yml –limit @site.retry

要使用 Ansible 命令和指令碼應用您的模式知識,請閱讀特別命令介紹指令碼介紹

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章