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.0.162            #定義主機IP
192.168.0.163            #新定義一台主機IP

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

[root@ZFVM-APP-0-162 ansible]# ansible web -m command -a 'uptime'
192.168.0.163 | SUCCESS | rc=0 >>
 14:50:16 up  3:41,  2 users,  load average: 0.00, 0.01, 0.05

192.168.0.162 | SUCCESS | rc=0 >>
 14:50:16 up  3:54,  2 users,  load average: 0.24, 0.06, 0.06

2、端口與別名

ssh默認的端口是22(此時的Ansible主機配置文件可以省略),但是如果某些主機的ssh運行在自定義的端口上,Ansible使用Paramiko進行ssh連接時不會使用你ssh配置文件中列出的端口,但是如果修改ansible使用openssh進行ssh連接時將會使用:
在Client 192.168.0.163上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@ZFVM-APP-0-162 ansible]# ansible web -m command -a 'uptime'
192.168.0.163 | SUCCESS | rc=0 >>
 15:32:59 up  4:24,  2 users,  load average: 0.00, 0.01, 0.05

192.168.0.162 | SUCCESS | rc=0 >>
 15:32:59 up  4:37,  2 users,  load average: 0.00, 0.01, 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.0.162 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass='123456'
192.168.0.163

示例:

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

192.168.0.162 | 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.0.162
Client_01=192.168.0.163
[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.0.162 | 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.0.50
192.168.0.*

示例:

[root@Ansible ~]# ansible all -m ping   --所有的客戶端執行ping
[root@Ansible ~]# ansible '*' -m ping
192.168.0.163 | 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.0.162
[server]
a=192.168.0.163
b=192.168.0.8
[root@Ansible ~]# ansible web:server -m ping
Client | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.8.162 | 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM