Ansible 學(xué)習(xí)筆記 - 定位主機和組的模式

中英文對照表

英文 中文 備注
host 主機
group (主機)組
pattern 模式
ad hoc 特別命令
playbook 劇本 Ansible 專有名詞,一段復(fù)雜的編排
inventory 庫存 Ansible 專有名詞
flag 標(biāo)志
alias 別名

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

當(dāng)您通過一個特別命令(ad hoc)或運行一個劇本(playbook)執(zhí)行 Ansible 時,您必須選擇要針對哪個受管節(jié)點或組執(zhí)行。模式允許您針對庫存(inventory)中的特定主機和/或組運行命令和劇本。Ansible 模式可以引用單個主機、IP地址、庫存組、一組 組或庫存中的所有主機。模式非常靈活——您可以排除或要求主機子集,使用通配符或正則表達(dá)式,等等。Ansible 在模式中包含的所有庫存主機上執(zhí)行。

使用模式

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

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: 行內(nèi)容:

- name: <play_name>
  hosts: <pattern>

例如:

- name: restart webservers
  hosts: webservers

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

常用模式

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

描述 模式 目標(biāo)
所有主機 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 地址或主機名,但沒有出現(xiàn)在庫存中,你會看到這樣的錯誤:

[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

高級模式選項

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

在模式中使用變量

你可以通過 -e 參數(shù)使用變量來向 ansible-playbook 傳遞組說明符:

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

在模式中使用組位置

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

[webservers]
cobweb
webbing
weber

您可以使用下標(biāo)來選擇單獨的主機或范圍內(nèi)的 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

在模式中使用正則

你可以以 ~ 開頭,指定一個模式作為一個正則表達(dá)式:

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

模式和 ansible-playbook 標(biāo)志

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

ansible-playbook site.yml --limit datacenter2

最后,您可以使用 --limit 從文件中讀取主機列表,方法是在文件名前加上 @ 前綴:

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

如果 RETRY_FILES_ENABLED 設(shè)置為 True, ansible-playbook 運行后將創(chuàng)建一個 .retry 文件,其中包含所有劇本中失敗的主機列表。每次 ansible-playbook 運行結(jié)束時,該文件都會被覆蓋。

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

要使用 Ansible 命令和腳本應(yīng)用您的模式知識,請閱讀特別命令介紹腳本介紹。

三人行, 必有我?guī)? 知識共享, 天下為公. 本文由東風(fēng)微鳴技術(shù)博客 EWhisper.cn 編寫.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容