以前有兩篇文章分別講了 Ansible 的部署、Ansible 的 模塊使用,對 Ansible 有了最初的瞭解,這篇文章最主要是要介紹 Playbook。
須要瞭解 Ansible 的部署請點擊:Ansible 第一部 :部署
須要瞭解 Ansible 的模塊慶典節:Ansible 第二部:模塊使用mysql
Playbook 是由一個或多個play 組成的列表,主要功能是將task 定義好的角色歸併爲一組進行統一管理,也就是經過task 調用 Asible 的模板將多個 play 組織在一個 Playbook 中運行。linux
playbook 由如下各部分組成: (1)Tasks :任務,即調用模塊完成的一個操做; (2)Variables:變量; (3)Templates:模板; (4)Handlers:處理器,當一個條件知足時,觸發執行的操做; (5)Roles:角色。
YAML 是一種用來表達資料順序的格式,它因爲餐卡了其餘多種語言,因此具備很高的可讀性。能夠認爲它就是一種語言格式,必須按照它的這種格式來寫語言,才能生效。
它的特性:
1)具備很好的可讀性,易於實現;
2)表達能力強,擴展性好;
3)和腳本語言的交互性好;
4)有一個一致的信息規模;
5)能夠居於流來處理。sql
官網地址:http://www.yaml.orgapache
YML 中有兩種經常使用的數據類型,分別是:list 和 dictionary。
(1)list
列表(list)的全部元素均使用 「 - 」 開頭,列如:vim
-Apple -Orange -strawberry -Mango
(2)dictionary
字典(dictionary)經過 key 與 value 進行標識,如:oracle
name: chenglong Job: xuexi Skill: Elite
也可使用 key:value 的形式放置於 { } 中進行標識,如:運維
{ name: Exanple Developer,Job: Developer,Skill: Elite }
ssh
(1)Inventory(主機清單)ide
Ansible 爲了更加便捷的管理主機,在主機清單中將被管理主機進行分組命名,默認的主機清單位置爲:/etc/ansible/hosts 文件。工具
1)主機變量:
能夠在定義主機時添加主機變量,以便在後續的 playbook 中使用,如:
[aaa_servers] www1.baidu.com http_port=80 maxRequestsChild=800 www2.baidu.com http_port=8080 maxRequestsChild=900
2)組變量
組變量是指給指定主機設hi能夠在 palybook 中直接使用的變量,如:
[aaa-vars] net_server=ntp.example.org nfs_server=nfs.example.org
3)組嵌套
在 Inventory 中的組還能夠嵌套在其餘的組,也能夠向組中的主機指定變量,可是這些變量都只能在 ansible-playbook 工具中使用,直接使用 Ansible 工具並不會支持,如:
[aaa] www1.baidu.com http_port=80 maxRequestsChild=800 www2.baidu.com http_port=8080 maxRequestsChild=900 [bbb] 192.168.100.100 192.168.100.101 [ccc:ddd] aaa bbb
(2)變量
在 Ansible 中變量名僅能由字母、數字和下劃線組成,而且只能以字母開頭。可使用兩種方式來傳遞 Ansible 變量。
1)經過命令行來傳遞變量。
在運行 playbook 的時候,能夠經過命令行的方式傳遞變量,給 playbook 使用,如:
ansible-playbook test.yml -e "http_port=8080"
2)在寫 playbook 時定義,而且調用。
- hosts: aaa remote_user: root vars: ** //定義變量** - package: apache //變量定義 package - server: httpd //變量定義 server tasks: - name: check latest yum: name={{ package }} state=latest //調用變量 package - name: start apache service: name={{ server }} state=started //調用變量 server
(3)條件測試
1)when 就是條件判斷,你給與的條件成立,它就會執行 tasks 裏的任務,若是不知足就不執行。
- hosts: aaa remote_user: root tasks: - name: install apache yum: name=httpd when: - ansible_distribution == "CentOS" //知足條件 1 - ansible_distribution_major_version == "6" //知足條件 2
2)迭代,當須要執行重複任務時,若是一個一個寫,就很麻煩,這時就須要用到 迭代,把須要重複執行的動做,定義爲 item 變量並進行引用,而後經過 with_items 語句來指明元素。
- hosts: aaa remote_user: root tasks: - name: install pachages yum: name={{ item }} state=latest with_items: - httpd - openssh - mysql
palybook 的設計目的就是爲了讓某些主機以某個用戶的身份去執行相應的任務。其中用於執行任務的主機用 hosts 定義,執行用戶用 remote_user 來定義。以下:
- hosts: aaa remote_user: root
remote_user 能夠定義指定用戶經過 sudo 的方法在被管理主機上運行執行
- hosts: aaa remote_user: root become: yes become_user: oracle 切換用戶爲Oracle
列如:
- hosts: aaa remote_user: root tasks: - name: install pachages // name: 自定義名稱 yum: name=httpd state=latest // yum:安裝 httpd 服務,檢測是不是最新版本 - name: disable selinux command: /sbin/setenforce 0 //關閉selinux - name: disable firewall command: systemctl stop firewalld //關閉防火牆 - name: apache service: name=httpd enabled=true state=started //啓動httpd服務,設置爲開啓自啓 ansible-playbook -C aaa.yml 檢測語法與過程是否正確,不會正真的執行!
Handlers 用於當關注的資源變化的時候採起的操做。在 notify 中累出的操做便成爲 handler,也就是在 notify 中須要條用 handler 中定義的操做。而 notify 這個動做 在每一個 play 的最後被觸發,僅在全部的變化發生完成後一次性地執行指定操做。
Templates 能夠看做是一個編譯過的模板文件,用來產生目標文本,傳遞變量給模板去替換裏面中的標記。
準備一個配置文件模板,必須以 .j2 格式。再對模板進行編輯,統一模板。
[root@master ~]# vim /etc/httpd/conf/httpd.conf.j2
- hosts: aaa remote_user: root tasks: - name: install pachages yum: name=httpd state=latest - name: disable selinux command: /sbin/setenforce 0 - name: file to httpd template: src=/etc/httpd/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
若是屢次執行修改 playbook 會涉及到一些沒有變化的代碼,可使用tags 讓用戶選擇跳過沒有變化的代碼,只運行 tags 標記的代碼。它就是一個 「 標籤 」 。