本篇主要是根據官方翻譯而來,從而使簡單的翻譯,並無相關的實驗步驟,之後文章會補充爲實驗步驟,此篇主要是相關理論的說明,能夠稱之爲中文手冊之一,具體內容以下:git
本文檔主要闡述如何來寫最好的playbook,在以下網址中能找到相關的例子,以下:github
https://github.com/ansible/ansible-examplesweb
在使用playbooks的最佳路徑中,最好的方法是使用roles,這是最好的方法,在官方文檔中,至少強調了三篇,從而在使用playbooks的時候,最好就是使用roles來進行組織playbook。centos
在使用roles進行組織的時候,是具備目錄結構的,目錄結構的使用也是將playbooks進行組織,在使用include的時候,主要是爲了重用的目的,從而將複雜的playbook進行分割成小的,從而達到重用的目的,以下所示,表示爲roles的目錄組織結構。服務器
production # 生產環境服務器的列表(inventory file)架構 staging # 測試環境服務器列表(inventory file)app
group_vars/工具 group1 # 對特定的組分配變量佈局 group2 # ""測試 host_vars/ hostname1 # 主機特定變量 hostname2 # ""
library/ # 客戶端模塊(可選) filter_plugins/ # 客戶端過濾模塊(可選)
site.yml # master playbook webservers.yml # webserver 的playbook dbservers.yml # dbserver 的playbook
roles/ common/ # 此層表示爲一個 "role" tasks/ # main.yml # <-- 任務文件 handlers/ # main.yml # <-- handlers文件 templates/ # <-- 模板文件位置 ntp.conf.j2 # <------- 模板後綴符 .j2 files/ # bar.txt # <-- 拷貝文件資源 foo.sh # <-- script文件腳本資源 vars/ # main.yml # <-- 本role相關聯的變量 defaults/ # main.yml # <-- 默認狀況下優先級比較低的變量 meta/ # main.yml # <-- role的依賴
webtier/ # webtier的role,和comman的role結構相同 monitoring/ # "" fooapp/ # ""
|
在使用雲的時候,能夠不使用靜態的inventory文件,可使用動態的inventory文件。
在測試環境和生產環境的管理中,主要用不一樣的inventory文件來進行區分。
在進行使用playbook的時候,最好在測試環境中進行測試,而後再在生產環境中進行執行。
在管理靜態的inventory文件的時候,若是來區分生產環境和測試環境,主要就是使用前綴名,以下所示
# file: production [atlanta-webservers] www-atl-1.example.com www-atl-2.example.com [boston-webservers] www-bos-1.example.com www-bos-2.example.com [atlanta-dbservers] db-atl-1.example.com db-atl-2.example.com [boston-dbservers] db-bos-1.example.com # webservers in all geos [webservers:children] atlanta-webservers boston-webservers # dbservers in all geos [dbservers:children] atlanta-dbservers boston-dbservers # everything in the atlanta geo [atlanta:children] atlanta-webservers atlanta-dbservers # everything in the boston geo [boston:children] boston-webservers boston-dbservers
|
在上圖中,都使用相同的前綴名,從而來區分各個主機。
在進行管理不一樣環境的主機的時候,推薦的作法是使用不一樣的前綴名來進行區分主機環境,從而作到可讀性比較強
組是比較容易管理的,可是並非全部組都是這樣的,一樣能夠對組的變量進行設置,在下面例子中,atlanta有其本身的變量,從而定義以下:
--- # file: group_vars/atlanta ntp: ntp-atlanta.example.com backup: backup-atlanta.example.com
|
在進行設置組變量的時候,能夠根據不一樣組的屬性從而來劃分各個不一樣的變量,當具備默認屬性的時候,那麼能夠將變量值設置在一下目錄中,group_vars/all,以下所示:
--- # file: group_vars/all ntp: ntp-boston.example.com backup: backup-boston.example.com
|
也能夠在目錄host_vars中定義具體的系統變量,可是應當儘可能避免此種狀況的發生,以下圖所示:
--- # file: host_vars/db-bos-1.example.com foo_agent_port: 86 bar_agent_port: 99
|
在site.yml中,可使用include一個playbook來表述一個總體的結構,注意在整個裏面是很簡短的,以下所示,playbooks是包含一系列的playbook:
--- # file: site.yml - include: webservers.yml - include: dbservers.yml
|
在文件webserver.yml中,也就是配置這個組所對應的role,以下所示:
--- # file: webservers.yml - hosts: webservers roles: - common - webtier
|
在進行運行的時候,咱們可使用site.yml來進行或者使用單獨的webserver.yml來運行,以下就是來進行明確運行哪一個playbook:
ansible-playbook site.yml --limit webservers ansible-playbook webservers.yml
|
如下例子中演示如何使用一個role來進行工做,在這裏能夠作不少,以下所示:
--- # file: roles/common/tasks/main.yml - name: be sure ntp is installed yum: name=ntp state=installed tags: ntp - name: be sure ntp is configured template: src=ntp.conf.j2 dest=/etc/ntp.conf notify: - restart ntpd tags: ntp - name: be sure ntpd is running and enabled service: name=ntpd state=running enabled=yes tags: ntp |
下面的例子中,表示爲一個handler,以下所示:
--- # file: roles/common/handlers/main.yml - name: restart ntpd service: name=ntpd state=restarted
|
在上面的roles組織中,如何開啓這種佈局結構
若是要從新配置組織架構,只要執行下面的命令便可:
ansible-playbook -i production site.yml
|
若是要從新配置NTP,執行下面命令便可:
ansible-playbook -i production site.yml --tags ntp
|
若是要從新配置webservers,以下:
ansible-playbook -i production webservers.yml
|
若是要從新配置boston的webservsers,以下:
ansible-playbook -i production webservers.yml --limit boston
|
若是要從新配置前十個和下十個,以下:
ansible-playbook -i production webservers.yml --limit boston[0-10] ansible-playbook -i production webservers.yml --limit boston[10-20]
|
若是要執行臨時任務,以下:
ansible boston -i production -m ping ansible boston -i production -m command -a '/sbin/reboot'
|
比較有用的指令以下:
# confirm what task names would be run if I ran this command and said "just ntp tasks" ansible-playbook -i production webservers.yml --tags ntp --list-tasks # confirm what hostnames might be communicated with if I said "limit to boston" ansible-playbook -i production webservers.yml --limit boston --list-hosts |
在有的模塊中,state是有默認值得,可是在playbook中最好是明確的標示state的狀態是present仍是absent,而且在state還有其餘值得時候,明確指定state的值有利於可讀性。
若是是針對的是不一樣操做系統的變量,最好的方法是使用group_by模塊。這樣會對動態的主機進行確認,雖然不在inventory文件中,以下:
--- # talk to all hosts just so we can learn about them - hosts: all tasks: - group_by: key=os_{{ ansible_distribution }} # now just on the CentOS hosts... - hosts: os_CentOS gather_facts: False tasks: - # tasks that only happen on CentOS go here
|
這樣會造成將全部的系統造成一個動態組,基於操做系統的名稱。
若是須要特殊的設置組,那麼以下所示:
--- # file: group_vars/all asdf: 10 --- # file: group_vars/os_CentOS asdf: 42
|
上例中,表示出了centos的機器得到的值爲10,centos的機器得到值爲42
也能夠設置如下的變量:
- hosts: all tasks: - include_vars: "os_{{ansible_distribution}}.yml" - debug: var=asdf
|
此種變量是基於操做系統的名稱
在使用的時候,注意用空格來進行分割不一樣的內容;
使用#來進行註釋;
在書寫playbook的時候,name最好是寫上,從而代表相關的目的;
儘可能保持playbook的簡潔性;
控制版本。
在進行變量設置的時候,最好放在相關的目錄中,而且可使用grep等相關的工具來查找到變量位置。