一、ansible-playbook介紹:
?playbook是由一個或多個”play”組成的列表。play的主要功能在于將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來將,所謂的task無法是調用ansible的一個module。將多個paly組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制同唱一臺大戲。
1、playbook基礎組件:
hosts?playbook中的每一個paly的目的都是為了讓某個或某些以某個指定用戶的身份執行任務。hosts用于指定要執行指定任務的主機,其可以是一個或多個由冒號分割主機組。
user?remote_user則用于指定遠程主機上的執行任務的用戶。
任務列表:
play的主體部分是task?list.?task?list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后再開始第二個。
action
任務執行過程
handlers
用于當前關注的資源發生變化時采取一定指定的操作
2、實例:
[root@node1?playbook]#?cat?web.yml
-?hosts:?test??\\主機組,在/etc/ansible/hosts定義
??remote_user:?root??\\遠端執行任務的用戶
??tasks:?\\任務
??-name:?install?httpd??\\任務描述
???command:?yum?-y?install?httpd??\\調用ansible的command模塊安裝httpd
??-name:?provide?httpd.conf?\\任務描述
copy:src="/root/httpd.conf"?dest="/etc/httpd/conf/httpd.conf"?\\調用ansible的copy模塊,httpd安裝完成后將事先準備好的httpd.conf文件復制到/etc/httpd/conf目錄下
????tags:?conf??\\給此任務打標記,可單獨執行標記的任務,使用?ansible-playbook?-C?命令執行
????notify:??\\文件內容變更通知
????-?server?restart??\\通知到指定的任務
??-?name:?server?start??\\任務描述
????service:?name=httpd?state=started?enabled=true?\\調用ansible的service模塊的屬性定義安裝完成httpd以后httpd服務的管理
??handlers:?\\定義接受關注的資源變化后執行的動作
??-?name:?server?restart??\\任務描述
????service:?name=httpd?state=restarted???\\當關注的資源發生變化后調用service模塊,采取的響應的動作
執行過程如下:
[root@node1?playbook]#?ansible-playbook?web.yml?
PLAY?[test]?*******************************************************************?
GATHERING?FACTS?***************************************************************?
ok:?[172.16.2.13]
TASK:?[install?httpd]?*********************************************************?
changed:?[172.16.2.13]
TASK:?[provide?httpd.conf]?****************************************************?
changed:?[172.16.2.13]
TASK:?[server?start]?**********************************************************?
changed:?[172.16.2.13]
NOTIFIED:?[server?restart]?****************************************************?
changed:?[172.16.2.13]
PLAY?RECAP?********************************************************************?
172.16.2.13????????????????:?ok=5????changed=4????unreachable=0????failed=0
二、ansible的roles介紹:
ansible的roles用于層次性、結構化地組織palybook。roles能夠根據層次型結構自動裝載變量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。
rules的組成:
root@node1?playbook]#?tree??roles/
roles/?\\ansible所有的信息都放到此目錄下面對應的目錄中
└──?nginx??\\角色名稱
????├──?default??\\為當前角色設定默認變量時使用此目錄,應當包含一個main.yml文件;
????├──?files??\\存放有copy或script等模塊調用的文件
????├──?handlers?\\此目錄總應當包含一個main.yml文件,用于定義各角色用到的各handler
????├──?meta?\\應當包含一個main.yml,用于定義角色的特殊設定及其依賴關系;1.3及以后版本支持
????├──?tasks?\\至少包含一個名為main.yml的文件,定義了此角色的任務列表,可使用include指令
????├──?templates?\\template模塊會自動在此目錄中尋找Jinja2模板文件
????└──?vars??\\應當包含一個main.yml文件,用于定義此角色用到的變量
roles介紹完了,那么我們就利用ansible的roles來配置nginx
1、首先按照上面的要求創建要用到的目錄
[root@node1?playbook]#?mkdir?-pv?roles/nginx/{tasks,files,templates,handlers,vars,meta,default}
2、準備nginx配置文件
準備nginx.conf配置文件,使用模板文件配置
[root@node1?playbook]#?cd?roles/nginx/templates/
[root@node1?~]#?ansible?all?-m?setup?|?grep?ansible_processor_cores
????????"ansible_processor_cores":?1,??\\獲取ansible的要調用的相關函數
[root@node1?playbook]#?cd?roles/nginx/templates/???\\模板文件一定要放到此目錄?????
[root@node1?templates]#?vim?nginx.conf?
worker_processes?{{??ansible_processor_cores?}};??\\調用獲取到的函數
準備nginx的default.conf文件
[root@node1?playbook]#?ls?-l?roles/nginx/files/
-rw-r--r--.?1?root?root?1290?Nov?12??2014?default.conf
3、準備nginx的rpm包
[root@node1?playbook]#?ls?-l??roles/nginx/files/
-rw-r--r--.?1?root?root???1290?Nov?12??2014?default.conf
-rw-r--r--.?1?root?root?319456?Mar?29?20:44?nginx-1.4.7-1.el6.ngx.x86_64.rpm
4、在tasks目錄中配置任務列表
[root@node1?playbook]#?cd??roles/nginx/tasks/
[root@node1?tasks]#?vim??main.yml?
??-?name:?copy?nginx.rpm
????copy:?src=nginx-1.4.7-1.el6.ngx.x86_64.rpm??dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
??-?name:?install?nginx
????shell:?yum?-y??install?/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
??-?name:?provides?nginx.conf
????template:?src=nginx.conf??dest=/etc/nginx/nginx.conf
????tags:?nginxconf
????notify:
????-?server?restart
??-?name:?provides?default.conf
????copy:?src=default.conf?dest=/etc/nginx/conf.d/default.conf?
????tags:?nginxconf
??-?name:?server?start
????service:?name=nginx?enabled=true?state=started
5、在handlers目錄中配置定義handler信息
[root@node1?playbook]#?cd?roles/nginx/handlers/
[root@node1?handlers]#?vim??main.yml?
-?name:?server?restart
??service:?name=nginx??state=restarted
6、在roles同一級目錄中創建site.yml文件
[root@node1?playbook]#?cat?site.yml?
-?hosts:?nginx
??remote_user:?root
??roles:
??-?nginx
7、應用配置:
[root@node1?playbook]#?ansible-playbook?site.yml?
PLAY?[nginx]?******************************************************************?
GATHERING?FACTS?***************************************************************?
ok:?[172.16.2.13]
TASK:?[nginx?|?copy?nginx.rpm]?************************************************?
ok:?[172.16.2.13]
TASK:?[nginx?|?install?nginx]?*************************************************?
changed:?[172.16.2.13]
TASK:?[nginx?|?provides?nginx.conf]?*******************************************?
changed:?[172.16.2.13]
TASK:?[nginx?|?provides?default.conf]?*****************************************?
changed:?[172.16.2.13]
TASK:?[nginx?|?server?start]?**************************************************?
changed:?[172.16.2.13]
NOTIFIED:?[nginx?|?server?restart]?********************************************?
changed:?[172.16.2.13]
PLAY?RECAP?********************************************************************?
172.16.2.13????????????????:?ok=7????changed=5????unreachable=0????failed=0
8、在node2主機上查看nginx是否已啟動
[root@node2?~]#?ss?-tpln?|?grep?80
LISTEN?????0??????128???????????????????????*:80???????????????????????*:*??????users:(("nginx",8934,8),("nginx",8936,8))
9、roles目錄總體結構:
[root@node1?playbook]#?tree?roles/
roles/
└──?nginx
????├──?default
????├──?files
????│??├──?default.conf
????│??└──?nginx-1.4.7-1.el6.ngx.x86_64.rpm
????├──?handlers
????│??└──?main.yml
????├──?meta
????├──?tasks
????│??└──?main.yml
????├──?templates
????│??└──?nginx.conf
????└──?vars
到此ansible常用的知識已介紹完畢,僅個人學習總結,大家有疑問的話可以一起交流。
原創文章,作者:馬行空,如若轉載,請注明出處:http://www.www58058.com/7001
最近也在研究ansible,有問題一塊探討, http://www.www58058.com/doc/ansible/ 翻譯項目有興趣的話也可以共同玩耍
@stanley:好的,Ansible中文權威qq全已添加,謝謝