中英文對照表
| 英文 | 中文 | 備注 |
|---|---|---|
| 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 編寫.