目錄
- 簡介
- 定義主機群組
- 1. 簡單的主機群組
- 2. 指定主機範圍
- 3. 定義主機組嵌套
- 選擇主機與組
- 1. 比對所有主機
- 2. 比對指定的主機或主機組
- 3. 通配符比對
- 4. 通配符組合比對
- 4. 正規表達式比對
- 5. 通過--limit明确指定主機或組
在使用Ansible來批量管理主機的時候,通常我們需要先定義要管理哪些主機或者主機組,而這個用于管理主機與主機組的檔案就叫做Inventory,也叫主機清單。該檔案預設位于/etc/ansible/hosts。當然我們也可以通過修改ansible配置檔案的hostfile配置項來修改預設inventory的位置。
對于/etc/ansible/hosts最簡單的定義格式像下面:
# 中括号中的名字代表組名,可以根據自己的需求将龐大的主機分成具有辨別的組,如上面分了兩個組webservers和dbservers組;
# 主機(hosts)部分可以使用域名、主機名、IP位址表示;當然使用前兩者時,也需要主機能反解析到相應的IP位址,一般此類配置中多使用IP位址;
mail.yanruogu.com
[webservers]
web1.yanruogu.com
web2.yanruogu.com
[dbservers]
db1.yanruogu.com
db2.yanruogu.com
# 下面指定了從web01到web50,webservers組共計50台主機;databases組有db-a到db-f共6台主機
[webservers]
www[01:50].yanruogu.com
[databases]
db-[a:f].yanruogu.com
一個主機組可以包含若幹個子主機組:
# 如下示例中,production組包含兩個子組,分别為webservers和dbservers,webservers和dbservers組分别包含若幹主機
[webservers]
web1.lab.example.com
web2.lab.example.com
[dbservers]
db1.lab.example.com
db2.lab.example.com
[production:children]
webservers
dbservers
在前面定義Inventory的時候,我們會把所有被管理主機通過主機組的方式定義到Inventory當中,但是當我們實際使用的時候,可能隻需要對某一主機或主機組進行操作,這個時候就需要通過比對的方式指定某一特定主機或主機組。
在此之間,我們先定義一個主機清單示例:
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
[web]
jupiter.lab.example.com
saturn.example.com
[db]
db1.example.com
db2.example.com
db3.example.com
[lb]
lb1.lab.example.com
lb2.lab.example.com
[boston]
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com
[london]
db2.example.com
db3.example.com
file1.lab.example.com
lb1.lab.example.com
[dev]
web1.lab.example.com
db3.example.com
[stage]
file2.example.com
db2.example.com
[prod]
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com
[function:children]
web
db
lb
city
[city:children]
boston
london
environments
[environments:children]
dev
stage
prod
new
[new]
172.25.252.23
172.25.252.44
可以通過
all
或者
*
來指定比對所有主機,通過如下指令檢視
all
比對到的主機:
# ansible all --list-hosts
hosts (16):
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
jupiter.lab.example.com
saturn.example.com
db1.example.com
db2.example.com
db3.example.com
lb1.lab.example.com
lb2.lab.example.com
file1.lab.example.com
web1.lab.example.com
file2.example.com
172.25.252.23
172.25.252.44
172.25.252.32
- 比對單個組
# ansible prod --list-hosts
hosts (3):
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com
- 比對單個主機
# ansible db2.example.com --list-hosts
hosts (1):
db2.example.com
- 比對多個主機
# ansible 'lb1.lab.example.com,s1.lab.example.com,db1.example.com' --list-hosts
hosts (3):
lb1.lab.example.com
s1.lab.example.com
db1.example.com
- 比對多個組
# ansible 'london,boston' --list-hosts
hosts (7):
db2.example.com
db3.example.com
file1.lab.example.com
lb1.lab.example.com
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com
- 比對不屬于任何組的主機
# ansible ungrouped --list-hosts
hosts (4):
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
- 比對'*.example.com':
# ansible '*.example.com' --list-hosts
hosts (14):
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
jupiter.lab.example.com
saturn.example.com
db1.example.com
db2.example.com
db3.example.com
lb1.lab.example.com
lb2.lab.example.com
file1.lab.example.com
web1.lab.example.com
file2.example.com
- 比對
的主機:172.25.*
# ansible '172.25.*' --list-hosts
hosts (3):
172.25.252.23
172.25.252.44
172.25.252.32
- 比對以
開頭的主機及主機組:s
# ansible 's*' --list-hosts
hosts (7):
file2.example.com
db2.example.com
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
saturn.example.com
- 比對包含
但不包含*.example.com
*.lab.example.com
# ansible '*.example.com,!*.lab.example.com' --list-hosts
hosts (7):
srv1.example.com
srv2.example.com
saturn.example.com
db1.example.com
db2.example.com
db3.example.com
file2.example.com
- 比對包含prod以及172開頭、包含lab關鍵字的主機或組
# ansible 'prod,172*,*lab*' --list-hosts
hosts (11):
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com
172.25.252.23
172.25.252.44
172.25.252.32
s1.lab.example.com
s2.lab.example.com
lb1.lab.example.com
file1.lab.example.com
web1.lab.example.com
- 比對屬于db組同時還屬于london組的主機:
# ansible 'db,&london' --list-hosts
hosts (2):
db2.example.com
db3.example.com
- 比對在london組或者boston組,還必須在prod組中且必須不在lb組中的主機:
# ansible 'boston,london,&prod,!lb' --list-hosts
hosts (2):
db1.example.com
jupiter.lab.example.com
在開頭的地方使用”~”,用來表示這是一個正規表達式:
# ansible '~(s|db).*example\.com' --list-hosts
hosts (8):
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
saturn.example.com
db1.example.com
db2.example.com
db3.example.com
5. 通過 --limit
明确指定主機或組
--limit
- 通過
在標明的組中明确指定主機:--limit
# ansible ungrouped --limit srv1.example.com --list-hosts
hosts (1):
srv1.example.com
-
參數,還可以指定一個檔案,該檔案中定義明确指定的主機的清單,定義一個retry_hosts.txt如下:--limit
srv1.example.com
再次執行ansible指令如下:
# ansible ungrouped --limit @retry_hosts.txt --list-hosts
hosts (1):
srv1.example.com
後續學習中,在ansible-playbook指令行中也可以通過複雜的主機表達式來標明主機,不過需要使用-e參數來指定:ansible-palybook -e webservers:!{{excluded}}:&{{required}} 。不過這個用法并不常用。