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