自動化運維-Ansible (第三部:Playbook 介紹)
之前有兩篇文章分別講了 Ansible 的部署、Ansible 的 模塊使用,對 Ansible 有了最初的了解,這篇文章最主要是要介紹 Playbook。
需要了解 Ansible 的部署請點擊:Ansible 第一部 :部署
需要了解 Ansible 的模塊慶典節:Ansible 第二部:模塊使用
Playbook 介紹
Playbook 是由一個或多個play 組成的列表,主要功能是將task 定義好的角色歸並為一組進行統一管理,也就是通過task 調用 Asible 的模板將多個 play 組織在一個 Playbook 中運行。
playbook 由以下各部分組成: (1)Tasks :任務,即調用模塊完成的一個操作; (2)Variables:變量; (3)Templates:模板; (4)Handlers:處理器,當一個條件滿足時,觸發執行的操作; (5)Roles:角色。
YAML 介紹
YAML 是一種用來表達資料順序的格式,它由於餐卡了其他多種語言,所以具有很高的可讀性。可以認為它就是一種語言格式,必須按照它的這種格式來寫語言,才能生效。
它的特性:
1)具有很好的可讀性,易於實現;
2)表達能力強,擴展性好;
3)和腳本語言的交互性好;
4)有一個一致的信息規模;
5)可以居於流來處理。
官網地址:http://www.yaml.org
YAML 常用的數據類型
YML 中有兩種常用的數據類型,分別是:list 和 dictionary。
(1)list
列表(list)的所有元素均使用 “ - ” 開頭,列如:
-Apple -Orange -strawberry -Mango
(2)dictionary
字典(dictionary)通過 key 與 value 進行標識,如:
name: chenglong
Job: xuexi
Skill: Elite
也可以使用 key:value 的形式放置於 { } 中進行標識,如:
{ name: Exanple Developer,Job: Developer,Skill: Elite }
Ansilble 基礎元素介紹
(1)Inventory(主機清單)
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
Hosts 和 Users 介紹
palybook 的設計目的就是為了讓某些主機以某個用戶的身份去執行相應的任務。其中用於執行任務的主機用 hosts 定義,執行用戶用 remote_user 來定義。如下:
- hosts: aaa
remote_user: root
remote_user 可以定義指定用戶通過 sudo 的方法在被管理主機上運行執行
- hosts: aaa
remote_user: root
become: yes
become_user: oracle 切換用戶為Oracle
任務列表和 action 介紹
- > play 的主體是 任務列表(Tasks list)。任務列表中的任務按照次序逐個在hosts 中指定的所有主機上執行,在順序執行這些任務時,如果有錯誤發生將會回滾。
- > task 的任務是按照指定的參數去執行模塊,每個 task 都使用 name 輸出 palybook 的運行結果,一般輸出的內容為描述該任務執行的步驟,如果沒有提供將輸出 action 的運行結果。
-
列如:
- 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 介紹
Handlers 用於當關註的資源變化的時候采取的操作。在 notify 中累出的操作便成為 handler,也就是在 notify 中需要條用 handler 中定義的操作。而 notify 這個動作 在每個 play 的最後被觸發,僅在所有的變化發生完成後一次性地執行指定操作。
Templates 介紹
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
Tages 介紹
如果多次執行修改 playbook 會涉及到一些沒有變化的代碼,可以使用tags 讓用戶選擇跳過沒有變化的代碼,只運行 tags 標記的代碼。它就是一個 “ 標簽 ” 。
自動化運維-Ansible (第三部:Playbook 介紹)