Patterns

Topics

在Ansible中,Patterns 是指我們怎樣確定由哪一臺主機來管理. 意思就是與哪臺主機進行互動. 但是在:doc:playbooks 中它指的是對應主機應用特定的配置或執行特定程序.

我們再來複習下:doc:intro_adhoc 章節中介紹的命令用法,命令格式如下:

ansible <pattern_goes_here> -m <module_name> -a <arguments>

示例如下:

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

一個pattern通常關聯到一系列組(主機的集合) –如上示例中,所有的主機均在 “webservers” 組中.

不管怎麼樣,在使用Ansible前,我們需事先告訴Ansible哪臺機器將被執行. 能這樣做的前提是需要預先定義唯一的 host names 或者 主機組.

如下的patterns等同於目標為倉庫(inventory)中的所有機器:

all
*

也可以寫IP地址或系列主機名:

one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*

如下patterns分別表示一個或多個groups.多組之間以冒號分隔表示或的關係.這意味著一個主機可以同時存在多個組:

webservers
webservers:dbservers

你也可以排隊一個特定組,如下例項中,所有執行命令的機器必須隸屬 webservers 組但同時不在 phoenix組:

webservers:!phoenix

你也可以指定兩個組的交集,如下例項表示,執行命令有機器需要同時隸屬於 webservers 和 staging 組.

webservers:&staging

你也可以組合更復雜的條件:

webservers:dbservers:&staging:!phoenix

上面這個例子表示“‘webservers’ 和 ‘dbservers’ 兩個組中隸屬於 ‘staging’ 組並且不屬於 ‘phoenix’ 組的機器才執行命令” ... 喲!唷! 好燒腦的說!

你也可以使用變數如果你希望通過傳參指定group,ansible-playbook通過 “-e” 參數可以實現,但這種用法不常用:

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

你也可以不必嚴格定義groups,單個的host names, IPs , groups都支援通配符:

*.example.com
*.com

Ansible同時也支援通配和groups的混合使用:

one*.com:dbservers

在高階語法中,你也可以在group中選擇對應編號的server:

webservers[0]

或者一個group中的一部分servers:

webservers[0-25]

大部分人都在patterns應用正則表示式,但你可以.只需要以 ‘~’ 開頭即可:

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

同時讓我們提前瞭解一些技能,除了如上,你也可以通過 --limit 標記來新增排除條件,/usr/bin/ansible or /usr/bin/ansible-playbook都支援:

ansible-playbook site.yml --limit datacenter2

如果你想從檔案讀取hosts,檔名以@為字首即可.從Ansible 1.2開始支援該功能:

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

夠簡單吧. 為了更好的掌握該章節內容,可以先了解 Introduction To Ad-Hoc CommandsPlaybooks

See also

Introduction To Ad-Hoc Commands
Examples of basic commands
Playbooks
Learning ansible’s configuration management language
Mailing List
Questions? Help? Ideas? Stop by the list on Google Groups
irc.freenode.net
#ansible IRC chat channel