天天看點

Ansible2:Inventory

目錄

  • 簡介
  • 定義主機群組
    • 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

           

  1. 比對單個組
# ansible prod --list-hosts
  hosts (3):
    lb2.lab.example.com
    db1.example.com
    jupiter.lab.example.com
           
  1. 比對單個主機
# ansible db2.example.com --list-hosts
  hosts (1):
    db2.example.com
           
  1. 比對多個主機
# 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
           
  1. 比對多個組
# 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
           
  1. 比對不屬于任何組的主機
# ansible ungrouped --list-hosts
  hosts (4):
    srv1.example.com
    srv2.example.com
    s1.lab.example.com
    s2.lab.example.com
           

  1. 比對'*.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
           
  1. 比對

    172.25.*

    的主機:
# ansible '172.25.*' --list-hosts                         
  hosts (3):
    172.25.252.23
    172.25.252.44
    172.25.252.32


           
  1. 比對以

    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

           

  1. 比對包含

    *.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

           
  1. 比對包含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
           
  1. 比對屬于db組同時還屬于london組的主機:
# ansible 'db,&london' --list-hosts
  hosts (2):
    db2.example.com
    db3.example.com
           
  1. 比對在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

明确指定主機或組

  1. 通過

    --limit

    在標明的組中明确指定主機:
# ansible ungrouped  --limit srv1.example.com --list-hosts
  hosts (1):
    srv1.example.com
           
  1. --limit

    參數,還可以指定一個檔案,該檔案中定義明确指定的主機的清單,定義一個retry_hosts.txt如下:
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}} 。不過這個用法并不常用。

繼續閱讀