自動化運維工具Ansible實戰(二)主機清單的管理

Ansible安裝好之後的主機清單配置文件有如下兩種:
1、yum安裝,配置文件默認路徑爲:
/etc/ansible/hosts
2、源碼包安裝,主機清單配置文件路徑需要從軟件包裏面拷貝,如下:

[root@Ansible ~]# mkdir /etc/ansible   --創建ansible目錄
[root@Ansible ~]# cp /usr/src/ansible-2.5.0/examples/hosts /etc/ansible/  --拷貝文件(已拷貝忽略就好了)

Ansible通過讀取默認的主機清單配置/etc/ansible/hosts(我們前面已經拷貝)來同時連接到多個遠程主機,來執行遠程操作任務的。但是如果要修改默認路徑可以通過修改主配置文件 ansible.cfg 的 hostfile 參數指定相應的路徑。
具體查看相應的路徑爲:

[root@Ansible ~]# vim /etc/ansible/ansible.cfg       --該配置文件後面會詳細說明
#remote_port    = 22
#remote_user = root
#private_key_file = /path/to/file
#host_key_checking = False
#hostfile = /etc/ansible/hosts

一、主機和組

1、主機和組(Hosts and Groups)

通過配置/etc/ansible/hosts這個文件來定義主機和組

[root@Ansible ~]# vim /etc/ansible/hosts 
[web]                   #定義組名,可自定義
192.168.8.55            #定義主機IP
192.168.8.66            #新定義一臺主機IP

組定義:
可以根據自己的需求將龐大的主機分成具有標識的組
主機定義:
可以使用域名、主機名、IP地址表示;當然使用前兩者時,也需要主機能反解析相應的IP地址,一般此類配置中多使用IP地址
示例:

[root@Ansible ~]# ansible web -m command -a 'uptime'
192.168.8.66 | SUCCESS | rc=0 >>
 15:54:44 up 13:52,  4 users,  load average: 0.00, 0.01, 0.05

192.168.8.55 | SUCCESS | rc=0 >>
 15:54:45 up 10:47,  4 users,  load average: 0.24, 0.06, 0.06

2、端口與別名

ssh默認的端口是22(此時的Ansible主機配置文件可以省略),但是如果某些主機的ssh運行在自定義的端口上,Ansible使用Paramiko進行ssh連接時不會使用你ssh配置文件中列出的端口,但是如果修改ansible使用openssh進行ssh連接時將會使用:
在Client 192.168.8.66上ssh開啓2個端口連接

[root@Client ~]# vim /etc/ssh/sshd_config 
17 Port 10022
 18 Port 22
[root@Client ~]# systemctl restart sshd  --修改之後,重啓sshd服務生效

在Ansible服務端的配置:

[root@Ansible ~]# vim /etc/ansible/hosts
[web]
192.168.199.123:10022
192.168.199.124

示例:

[root@Ansible ~]# ansible web -m command -a 'uptime'
192.168.8.66 | SUCCESS | rc=0 >>
 16:17:28 up 14:14,  4 users,  load average: 0.00, 0.02, 0.05

192.168.8.55 | SUCCESS | rc=0 >>
 16:17:29 up 11:10,  4 users,  load average: 0.01, 0.03, 0.05

3、指定主機範圍

hosts官方有個例子是通過指定主機名的範圍來進行多臺主機的定義

[root@Ansible ~]# vim /etc/ansible/hosts
[webservers]
node[01:50] .example.com

上面指定了從node01.com到node50. example.com,webservers組共計50臺主機

4、使用主機變量

hosts主機經常使用到的變量爲:
ansible_ssh_host     #用於指定被管理的主機的真實IP
ansible_ssh_port     #用於指定連接到被管理主機的ssh端口號,默認是22
ansible_ssh_user     #ssh連接時默認使用的用戶名
ansible_ssh_pass     #ssh連接時的密碼
ansible_sudo_pass    #使用sudo連接用戶時的密碼
ansible_sudo_exec    #如果sudo命令不在默認路徑,需要指定sudo命令路徑
ansible_ssh_private_key_file     #祕鑰文件路徑,祕鑰文件如果不想使用ssh-agent管理時可以使用此選項
ansible_shell_type     #目標系統的shell的類型,默認sh
ansible_connection     #SSH 連接的類型: local , ssh , paramiko,在 ansible 1.2 之前默認是 paramiko ,後來智能選擇,優先使用基於 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter     #用來指定python解釋器的路徑,默認爲/usr/bin/python 同樣可以指定ruby 、perl 的路徑
ansible_*_interpreter     #其他解釋器路徑,用法與ansible_python_interpreter類似,這裏"*"可以是ruby或才perl等其他語言

上面的實例也可以配置直接使用用戶名和密碼進行連接

[root@Ansible ~]# vim /etc/ansible/hosts
[web]
192.168.8.66 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass='123456'
192.168.8.55

示例:

[root@Ansible ~]# ansible web -m command -a 'uptime'
192.168.8.66 | SUCCESS | rc=0 >>
 16:46:32 up 14:43,  4 users,  load average: 0.21, 0.06, 0.06

192.168.8.55 | SUCCESS | rc=0 >>
 16:46:34 up 11:39,  7 users,  load average: 0.16, 0.41, 0.37

5、定義組內變量

變量也可以通過組名,然後應用到組內的所有成員。組變量的作用域是覆蓋組所有成員,通過定義一個新塊,塊名由組名+":vars" 組成。格式如下:

[root@Ansible ~]# vim /etc/ansible/hosts
[web]
Server
Client
[web:vars]
Server_01=192.168.8.8
Client_01=192.168.8.66
[root@Ansible ansible]# ansible web -m command -a 'uptime'
Client | SUCCESS | rc=0 >>
 17:26:55 up 15:24,  4 users,  load average: 0.00, 0.01, 0.05

Server | SUCCESS | rc=0 >>
 17:26:55 up 14:42,  5 users,  load average: 0.05, 0.14, 0.18

說明:上面的web組中包含了兩臺主機Server和Client,通過對web組指定了vars變量,相應的Server和Client主機相當於相應的指定了Server_01和Client_01變量的參數值。

6、組的包含於組內變量

同時Ansible支持組嵌套組 ,通過定義一個新塊,塊名由組名+":children"組成。格式如下:

[root@Ansible ~]# vim /etc/ansible/hosts
[shenzhen]
host1
host2
[guangzhou]
host3
host4
[guangdong:children]
shenzhen
guangzhou
[guangdong:vars]
tomcat=192.168.8.8
nginx=192.168.8.66
apache=192.168.8.77
zabbix=192.168.8.88
[china:children]
guangdong
beijing
shanghai

說明:上面我指定了深圳組有host1、host2;廣州組有host3、host4,我又指定了廣東組,同時包含深圳和廣州;同時爲該組內的所有主機指定了四個vars變量。後面我又設定了一箇中國組,包含廣東、北京、上海

二、Patterns(主機與組正則匹配部分)

Patterns 其實就是Ansible中的規則去管理哪些主機,也可以理解爲,要與哪臺主機進行通信。

ansible <pattern_goes_here> -m <module_name> -a <arguments>
ansible <執行的客戶機列表> -m <調用的模塊> -a <執行的參數>

示例:

[root@Ansible ~]# ansible web -m service -a "name=httpd state=restarted"
192.168.8.66 | SUCCESS => {
    "changed": true,
    "name": "httpd",
    "state": "started",
    "status": {
     ……
    }
}

這裏是Ansible對web組內的主機來進行遠程重啓httpd服務。
其中web就是Patterns部分,而之所以上面說Pattern(模式)可以理解爲正則,主要針對下面經常用到的用法而言的。

1、所有的主機

表示所有的主機

all
*

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

one.example.com
one.example.com:two.example.com
192.168.8.50
192.168.8.*

示例:

[root@Ansible ~]# ansible all -m ping   --所有的客戶端執行ping
[root@Ansible ~]# ansible '*' -m ping
192.168.8.66 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.8.55 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2、通配符或邏輯符

在Patterns指定要操作的主機可以使用不同的方法表示:

web[0] #表示web主機組中的第一臺主機
web:data #表示web和data主機組中的所有主機
web[0:25] #表示匹配web組的第1個到第25個主機
.51cto.com #表示所有的以51cto.com結尾的主機
.com #表示所有的以.com結尾的主機

Patterns可以分別表示一個或多個組,多組之間用冒號分開,意味着一個主機可以屬於多個組

[root@Ansible ~]# vim /etc/ansible/hosts
[web]
Client
Server
192.168.8.55
[server]
a=192.168.8.66
b=192.168.8.8
[root@Ansible ~]# ansible web:server -m ping
Client | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.8.55 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

3、邏輯非!與邏輯and

(1)排除特定的主機
web:!servers #目標主機必須在web組中但不在servers組中

ansible web:!server -m ping

(2)執行交集的主機
web:&servers #目標主機必須既在web組中又在servers組中

ansible web:&servers -m ping

(3)更復雜的表達式

ansible web: servers:&python:!data -m ping

上面這個複雜的表達式最後表示的目標主機必須滿足:在web或者servers組中,必須還存在於python組中,但是不在data組中。

4、混合高級用法

*.51cto.com:*.org

還可以在開頭的地方使用”~”,用來表示這是一個正則表達式:

~(web|server).*\.51cto\.com

以下是ansible-playbook中具體可能用的用法:
(1)在ansible-palybook命令中,你也可以使用變量來組成這樣的表達式,但是你必須使用“-e”的選項來指定這個表達式(通常這種方法不常用)

ansible-palybook -e webservers:!{{excluded}}:&{{required}}

(2)在Ansible和ansible-playbook中,還可以通過一個參數”--limit”來明確指定排除某些主機或組

ansible-playbook site.yml --limit group

(3)從Ansible1.2開始,如果想排除一個文件中的主機可以使用"@"

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

Ansible官方文檔:
http://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章