Playbool 是由一個或多個 play 組成的列表,主要功能是將 task 定義好的角色歸併爲一組進行統一管理,也就是經過 task 調用 Ansible 的模板將多個 play 組織在一個 Playbook 中運行。php
playbooks自己由如下各部分組成mysql
(1)Tasks:任務,即調用模塊完成的某操做;
(2)Variables:變量
(3)Templates:模板
(4)Handlers:處理器,當某條件知足時,觸發執行的操做;
(5)Roles:角色。nginx
下面是一個 playbook 的示例web
在編輯劇本時,對格式要求較爲嚴格,須要注意一下幾點,否則會出現語法上的錯誤。
sql
1.第一行 「-「 與 「hosts」 之間有空格,冒號後也要空格。vim
2.各層級之間要首行對其,如 hosts 、user、tasks、handlers.ssh
3.tasks 中執行的任務是 tasks 的子項,須要首行縮進,並保持對齊。ide
執行一個 playbook 格式以下:測試
ansible-playbook [yaml 文件名]spa
例如:ansible-playbook test.yml
參數:-k(–ask-pass) 用來交互輸入ssh密碼
-K(-ask-become-pass) 用來交互輸入sudo密碼
-u 指定用戶
補充命令:
ansible-playbook nginx.yaml --syntax-check #檢查yaml文件的語法是否正確
ansible-playbook nginx.yaml --list-task #檢查tasks任務
ansible-playbook nginx.yaml --list-hosts #檢查生效的主機
ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf' #指定從某個task開始運行
接下來介紹 Playbook 的基本組件。
一.Hosts 和 Users 介紹
Playbook 的設計目的是爲了讓某個或某些主機以某個或者用戶的身份去執行相應的任務。其中用於指定要指定任務的主機用 hosts 定義,能夠是一個主機名也但是由冒號分割的多個主機組;用於指定被管理主機上執行任務的用戶 remote_user 來定義。
- hosts: webserver #指定主機組,能夠是一個或多個組。
remote_user: root #指定遠程主機執行的用戶
remote_user 也能夠定義指定用戶經過 sudo 的方法在被管理主機上運行指令,還可指定遠程主機sudo 切換用戶:
- hosts: mysql
remote_user: root
become: yes #2.6版本之後的參數,以前是sudo,意思爲切換用戶運行
become_user: mysql #指定sudo用戶爲mysql
二.tasks列表和action
Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在全部主機上完成第一個任務後再開始第二個任務。在運行playbook時(從上到下執行),若是一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,而後從新執行便可。
task 的任務是按照指定的參數去執行模塊。每一個 task 都使用 name 輸出 Playbook 的運行結果。
簡單示例以下:
[root@bogon .ssh]# vim a.yml
執行 Playbook
在被管理主機 webserver 上查看安裝狀況
三.Handlers 介紹
Handlers 用於當關注的資源發生變化是所採起的操做,在 notify 中列出的操做便稱爲 handler ,也就是在 notify 中須要調用 handler 中定義的操做。而 notify 這個動做在每一個 play 的最後被觸發,僅在全部的變化發生完成後一次性地執行指定操做。
事例:
- hosts: webserver
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf //複製配置文件
notify: //調用 handler 中定義的操做
-restart httpd
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: 若是沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
- name: restart httpd
service: name=httpd state=restarted
也能夠引入變量
在 Ansible 中變量名僅能有字母、數字、下劃線組成,而且只能以字母開頭。
- hosts: webserver
remote_user: root
vars: //定義變量
- package: httpd //變量名:變量值
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest //引用第一個變量值,使用兩個{}
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
-restart httpd
- name: start httpd service
service: enabled=true name={{service}} state=started //引用第二個變量值
handlers:
- name: restart httpd
service: name={{service}} state=restarted
在 playbook 中使用變量的方法有如下幾種:
(1)經過 ansible 命令傳遞
例如:編輯以下 yaml
vi a.yml
---
- hosts: mysql
remote_user: root
vars: //定義變量
- user:
tasks:
- name: add new user
user: name={{user}} //使用 user 模塊調用
而後執行命令: ansible-playbook a.yml -e "user=testvar"
能夠執行命令查看:ansible mysql -m command -a 'tail /etc/passwd'
(2)直接在 yaml 中定義變量。(如 hanndlers 事例)
(3)直接引用一些變量
如:引用ansible的固定變量
vi test.yml
---
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt//此變量是查看主機網卡 ipv4 地址的固定變量
執行命令:ansible-playbook test.yml
再如:引用主機變量
vi /etc/ansible/hosts
在mysql組的主機後面添加以下
[mysql]
192.168.66.148 testvar="66.148" #定義testvar變量的值爲66.148
vi test.yml #添加{{testvar}}主機變量
---
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt
執行命令:ansible-playbook test.yml
四. 條件測試
若是須要根據變量、facts(setup)或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
(1)在task後添加when子句便可使用條件測試:when子句支持jinjia2表達式或語法,例如:
vi when.yml
---
- hosts: mysql
remote_user: root
tasks:
- name: "shutdown CentOS"
command: /sbin/shutdown -h now //調用 command 模塊關閉主機
when: ansible_distribution == "CentOS" //條件判斷當被管理主機版本爲 Centos 時,關機。其它版本不關機
(2)多條件判斷 (判斷語句爲且的關係,條件都要知足)
vi when.yml
---
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOS 7 systems"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"//判斷條件爲版本爲 Centos 且版本號爲 7
(3)組條件判斷
vi when.yml
---
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOS 6 and Debian 7 systems"
command: /sbin/shutdown -t now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")//判斷條件爲:只要是 Centos 6 或者 Debian 7 都關機
(4)自定義變量進行條件測試
vim when.yml
---
- hosts: all
vars: //定義變量
exist: "True" //存在值爲 True
tasks:
- name: creaet file
command: touch /tmp/test.txt
when: exist | match("True") //判斷條件當存在值匹配爲 True ,建立 /tmp/test.txt 文件
- name: delete file
command: rm -rf /tmp/test.txt
when: exist | match("False") //判斷條件當存在值匹配爲 Fales , 刪除 /tmp/test.txt 文件
五. 迭代
須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句指明迭代的元素列表便可。例如:
- hosts: webserver
remote_user: root
tasks:
- name: "Install Packages"
yum: name={{ item }} state=latest //其使用格式爲將須要迭代的內容定義爲item變量引用
with_items: //經過with_items語句指明迭代的元素列表 - httpd - mysql-server - php