Ansible 經過讀取默認的主機清單配置/etc/ansible/hosts,能夠同時鏈接到多個遠程主機上執行任務, 默認路徑能夠經過修改 ansible.cfg 的 hostfile 參數指定路徑。python
對於/etc/ansible/hosts最簡單的定義格式像下面:web
mail.yanruogu.com
[webservers]
web1.yanruogu.com
web2.yanruogu.com
[dbservers]
db1.yanruogu.com
db2.yanruogu.com
a、中括號中的名字表明組名,能夠根據本身的需求將龐大的主機分紅具備標識的組,如上面分了兩個組webservers和dbservers組;正則表達式
b、主機(hosts)部分可使用域名、主機名、IP地址表示;固然使用前二者時,也須要主機能反解析到相應的IP地址,通常此類配置中多使用IP地址;shell
若是某些主機的SSH運行在自定義的端口上,ansible使用Paramiko進行ssh鏈接時,不會使用你SSH配置文件中列出的端口,可是若是修改ansible使用openssh進行ssh鏈接時將會使用:ruby
192.168.1.1:3091
假如你想要爲某些靜態IP設置一些別名,能夠這樣作:ssh
web1 ansible_ssh_port = 3333 ansible_ssh_host = 192.168.1.2
上面的 web1別名就指代了IP爲192.168.1.2,ssh鏈接端口爲3333的主機。測試
[webservers]
www[01:50].yanruogu.com
[databases]
db-[a:f].yanruogu.com
上面指定了從web1到web50,webservers組共計50臺主機;databases組有db-a到db-f共6臺主機。ui
如下是Hosts部分中常常用到的變量部分:rest
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等其餘語言
示例以下:server
[test]
192.168.1.1 ansible_ssh_user=root ansible_ssh_pass='P@ssw0rd'
192.168.1.2 ansible_ssh_user=breeze ansible_ssh_pass='123456'
192.168.1.3 ansible_ssh_user=bernie ansible_ssh_port=3055 ansible_ssh_pass='456789'
上面的示例中指定了三臺主機,三臺主機的用密碼分別是P@ssw0rd、12345六、45789,指定的ssh鏈接的用戶名分別爲root、breeze、bernie,ssh 端口分別爲2二、2二、3055 ,這樣在ansible命令執行的時候就不用再指令用戶和密碼等了。
變量也能夠經過組名,應用到組內的全部成員:
[test]
host1
host2
[test:vars]
ntp_server=192.168.1.10
proxy=192.168.1.20
上面test組中包含兩臺主機,經過對test組指定vars變動,相應的host1和host2至關於相應的指定了ntp_server和proxy變量參數值 。
[wuhan]
web1
web2
[suizhou]
web4
web3
[hubei:children]
wuhan
suizhou
[hubei:vars]
ntp_server=192.168.1.10
zabbix_server=192.168.1.10
[china:children]
hubei
hunan
上面的示例中,指定了武漢組有web一、web2;隨州組有web三、web4主機;又指定了一個湖北組,同時包含武漢和隨州;同時爲該組內的全部主機指定了2個vars變量。設定了一個組中國組,包含湖北、湖南。
注:vars變量在ansible ad-hoc部分中基本用不到,主要用在ansible-playbook中。
把Patterns 直接理解爲正則實際是不徹底準確的,正常的理解爲patterns意味着在ansible中管理哪些主機,也能夠理解爲,要與哪臺主機進行通訊。在探討這個問題以前咱們先看下ansible的用法:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
直接上一個示例:
ansible webservers -m service -a "name=httpd state=restarted"
這裏是對webservers 組或主機重啓httpd服務 ,其中webservers 就是Pattern部分。而之因此上面說Pattern(模式)能夠理解爲正則,主要針對下面常常用到的用法而言的。
利用通配符還能夠指定一組具備規則特徵的主機或主機名,冒號表示or---邏輯或
web1.yanruogu.com
web1.yanruogu.com:web2.yanruogu.com
192.168.1.1
192.168.1.*
固然,這裏的*通配符也能夠用在前面,如:
*.yanruogu.com
*.com webservers1[0] #表示匹配 webservers1 組的第 1 個主機 webservers1[0:25] #表示匹配 webservers1 組的第 1 個到第 25 個主機(官網文檔是":"表示範圍,測試發現應該使用"-",注意不要和匹配多個主機組混淆)
上面的用法,在多個組之間一樣適用 ,如:
webservers
webservers:dbservers #表示兩個組中全部的主機
非的表達式,如,目標主機必須在組webservers但不在phoenix組中
webserver:!phoenix
交集的表達式,如,目標主機必須即在組webservers中又在組staging中
webservers:&staging
一個更復雜的示例:
webserver:dbservers:&staging:!phoenix
上面這個複雜的表達式最後表示的目標主機必須知足:在webservers或者dbservers組中,必須還存在於staging組中,可是不在phoenix組中 。
*.yanruogu.com:*.org
還能夠在開頭的地方使用」~」,用來表示這是一個正則表達式:
~(web|db).*\.yanruogu\.com
給兩個ansible-playbook中具體可能用的用法:
a、在ansible-palybook命令中,你也可使用變量來組成這樣的表達式,可是你必須使用「-e」的選項來指定這個表達式(一般咱們不這樣用):
ansible-palybook -e webservers:!{{excluded}}:&{{required}}
b、在ansible和ansible-playbook中,還能夠經過一個參數」--limit」來明確指定排除某些主機或組:
ansible-playbook site.yml --limit datacenter2
c、從Ansible1.2開始,若是想排除一個文件中的主機可使用"@":
ansible-playbook site.yml --limit @retry_hosts.txt
轉自
本文出自 「無名小卒」 博客,請務必保留此出處http://breezey.blog.51cto.com/2400275/1757643