ansbile-playbook是一系列ansible命令的集合,利用yaml 語言編寫。playbook命令根據自上而下的順序依次執行。同時,playbook開創了不少特性,它能夠容許你傳輸某個命令的狀態到後面的指令,如你能夠從一臺機器的文件中抓取內容並附爲變量,而後在另外一臺機器中使用,這使得你能夠實現一些複雜的部署機制,這是ansible命令沒法實現的。node
playbook經過ansible-playbook命令使用,它的參數和ansible命令相似,如參數-k(–ask-pass) 和 -K (–ask-sudo) 來詢問ssh密碼和sudo密碼,-u指定用戶,這些指令也能夠經過規定的單元寫在playbook 。linux
ansible-playbook的簡單使用方法: ansible-playbook example-play.yml 。web
下面是一個簡單的ansible-playbook示例,能夠了解其構成:shell
# cat user.yml
- name: create user
hosts: all
user: root
gather_facts: false
vars:
user:"test"
tasks:
- name: create user
user: name="{{ user }}"
上面的playbook 實現的功能是新增一個用戶:apache
name參數對該playbook實現的功能作一個概述,後面執行過程當中,會打印 name變量的值 ;centos
hosts參數指定了對哪些主機進行參做;安全
user參數指定了使用什麼用戶登陸遠程主機操做;併發
gather_facts參數指定了在如下任務部分執行前,是否先執行setup模塊獲取主機相關信息,這在後面的task會使用到setup獲取的信息時用到;ssh
vars參數,指定了變量,這裏指定一個user變量,其值爲test ,須要注意的是,變量值必定要用引號引住;memcached
task指定了一個任務,其下面的name參數一樣是對任務的描述,在執行過程當中會打印出來。user提定了調用user模塊,name是user模塊裏的一個參數,而增長的用戶名字調用了上面user變量的值。
一樣,若是想實現把這個新增的用戶刪除,只需將該playbook文件的最後一行替換爲以下行再執行相應的playbook便可:
user: name="{{ user }}" state=absent remove=yes
經過ansible-playbook實現對多臺主機同時同時安裝apache。須要注意的是,多臺被管理主機的操做系統可能不相同,而致使apache包名不一樣,假設同時存在CentOS和Debian兩種操做系統,具體playbook內容以下:
# cat install_apache.yml
- hosts: all
remote_user: root
gather_facts:True
tasks:
- name: install apache on CentOS
yum: name=httpd state=present
when: ansible_os_family =="CentOS"
- name: install apache on Debian
yum: name=apache2 state=present
when: ansible_os_family =="Debian"
上面使用了when語句,同時也開啓了gather_facts setup模塊,這裏的ansible_os_family變量和就是直接使用的setup模塊獲取的信息。若是有大量主機,就在運行的時候加上-f而後選擇一個合適的併發主機數量便可。
playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中便可以讓它們聯同起來按事先編排的機制同唱一臺大戲。其主要有如下四部分構成:
playbooks組成:
Target section: 定義將要執行 playbook 的遠程主機組
Variable section: 定義 playbook 運行時須要使用的變量
Task section: 定義將要在遠程主機上執行的任務列表
Handler section: 定義 task 執行完成之後須要調用的任務
而其對應的目錄層爲五個,以下:
通常所需的目錄層有:(視狀況可變化)
vars 變量層
tasks 任務層
handlers 觸發條件
files 文件
template 模板
playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
hosts:用於指定要執行指定任務的主機其能夠是一個或多個由冒號分隔主機組。
remote_user :用於指定遠程主機上的執行任務的用戶。不過remote_user也可用於各task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務其可用於play全局或某任務。此外甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶。
user:於remote_user相同
sudo:若是設置爲yes,執行該任務組的用戶在執行任務的時候,獲取root權限
sudo_user:若是設置user爲breeze,sudo爲yes,sudo_user爲bernie時,則breeze用戶在執行任務時會得到bernie用戶的權限
connection:經過什麼方式鏈接到遠程主機,默認爲ssh
gather_facts:除非明確說明不須要在遠程主機上執行setup模塊,不然默認自動執行。若是確實不須要setup模塊傳遞過來的變量,則能夠將該選項設置爲False
示例:
- hosts: webnodes
tasks:
- name: test ping connection:
remote_user: test
sudo: yes
play的主體部分是任務列表。
任務列表中的各任務按次序逐個在hosts中指定的全部主機上執行即在全部主機上完成第一個任務後再開始第二個。在自上而下運行某playbook時若是中途發生錯誤,全部已執行任務都將回滾所以在更正playbook後從新執行一次便可。
task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。每一個task都應該有其name用於 playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name則action的結果將用於輸出。
定義task的可使用"action: module options"或"module: options"的格式,推薦使用後者以實現向後兼容。若是action一行的內容過多也可以使用在行首使用幾個空白字符進行換行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
#在衆多模塊中只有command和shell模塊僅須要給定一個列表而無需使用「key=value」格式例如
tasks:
- name: disable selinux
command: /sbin/setenforce 0
#若是命令或腳本的退出碼不爲零可使用以下方式替代
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
#使用ignore_errors來忽略錯誤信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
用於當關注的資源發生變化時採起必定的操做。
"notify"這個action可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之僅在全部的變化發生完成後一次性地執行指定操做。
在notify中列出的操做稱爲handler也即notify中調用handler中定義的操做。
注意:在notify中定義內容必定要和tasks中定義的 - name 內容同樣,這樣才能達到觸發的效果,不然會不生效。
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
#handler是task列表這些task與前述的task並無本質上的不一樣。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
tags用於讓用戶選擇運行或略過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時若是確信其沒有變化就能夠經過tags跳過這些代碼片段。
一個安裝httpd web服務的示例:
# cat /etc/ansible/playbook/install_web.yml
- hosts: webservers
remote_user: root
gather_fasks:False
vars:
packages: httpd
tasks: - name:Install httpd yum: name={{ packages }} state=present- name:Cofiguration httpd copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: httpd_conf notify: - restart httpd- name:Start httpd service: name=httpd state=started enabled=no tags: start- name:Add centos user user: name={{ item }} state=absent tags: adduser with_items: - centos - admin handlers: - name: restart httpd service: name=httpd state=restart
本文出自 「無名小卒」 博客,請務必保留此出處http://breezey.blog.51cto.com/2400275/1757624