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