簡單來說,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其他系統有不同之處,且非常适合于複雜應用的部署.
官方提供了大量的例子:https://github.com/ansible/ansible-examples
1、playbook語言示例
Playbooks 的格式是YAML,詳見:http://www.ansible.com.cn/docs/YAMLSyntax.html
playbook 由一個或多個 ‘plays’ 組成.它的内容是一個以 ‘plays’ 為元素的清單.
在 play 之中,一組機器被映射為定義好的角色.在 ansible 中,play 的内容,被稱為 tasks,即任務.在基本層次的應用中,一個任務是一個對 ansible 子產品的調用。
這裡有一個 playbook,其中僅包含一個 play:
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
2、主機與使用者
(1) 可以為 playbook 中的每一個 play,個别地選擇操作的目标機器
hosts 行的内容是一個或多個組或主機的 patterns,以逗号為分隔符,remote_user 就是賬戶名:
---
- hosts: webservers
remote_user: root
(2) 在每一個 task 中,可以定義自己的遠端使用者:
---
- hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
remote_user: yourname
(3) 支援從 sudo 執行指令:
---
- hosts: webservers
remote_user: yourname
sudo: yes
3、Task清單
每一個play包含了一個task清單.一個task在其所對應的所有主機上(通過 host pattern 比對的所有主機)執行完畢之後,下一個task 才會執行.在一個 play 之中,所有 hosts 會擷取相同的任務指令,也就是将一組選出的hosts映射到task.
每個 task 的目标在于執行一個 moudle, 通常是帶有特定的參數來執行.在參數中可以使用變量(variables).modules 具有”幂等”性,意思是如果你再一次地執行 moudle,moudle 隻會執行必要的改動,隻會改變需要改變的地方.是以重複多次執行 playbook 也很安全.
每一個 task 必須有一個名稱 name,這樣在運作 playbook 時,從其輸出的任務執行資訊中可以很好的辨識出是屬于哪一個 task 的. 如果沒有定義 name,‘action’ 的值将會用作輸出資訊中标記特定的 task.
(1)基本的 task 的定義,service moudle 使用 key=value 格式的參數,這也是大多數 module 使用的參數格式:
tasks:
- name: make sure apache is running
service: name=httpd state=running
(2)比較特别的兩個 modudle 是 command 和 shell ,它們不使用 key=value 格式的參數,而是這樣:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
使用 command module 和 shell module 時,我們需要關心傳回碼資訊,如果有一條指令,它的成功執行的傳回碼不是0, 你或許希望這樣做:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者是這樣:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
(3)如果 action 行看起來太長,你可以使用 space(空格) 或者 indent(縮進) 隔開連續的一行:
tasks:
- name: Copy ansible inventory file to client
copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
owner=root group=root mode=0644
(4)在 action 行中可以使用變量.假設在 ‘vars’ 那裡定義了一個變量 ‘vhost’ ,可以這樣使用它:
tasks:
- name: create a virtual host file for {{ vhost }}
template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}
這些變量在 tempates 中也是可用的
4、Handlers: 在發生改變時執行的操作
當發生改動時)’notify’ actions 會在 playbook 的每一個 task 結束時被觸發,而且即使有多個不同的 task 通知改動的發生, ‘notify’ actions 隻會被觸發一次.
一個例子,當一個檔案的内容被改動時,重新開機兩個 services:
tasks:
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
‘notify’ 下列出的即是 handlers.
Handlers 也是一些 task 的清單,通過名字來引用,即通過Handlers定義的name名字辨別來識别的,比如上面notify中的“restart apache"和下面handlers中的”name: restart apache".Handlers 是由通知者進行 notify, 如果沒有被 notify,handlers 不會執行.不管有多少個通知者進行了 notify,等到 play 中的所有 task 執行完成之後,handlers 也隻會被執行一次.
這裡是一個 handlers 的示例:
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
5、執行playbook
執行playbook通過ansible-playbook指令實作,格式如下;
ansible-playbook playbook.file(.yml) [參數]
例如:ansible-playbook playbook.yml -f 10
ansible-playbook指令參數:
Usage: ansible-playbook playbook.yml
Options:
-u REMOTE_USER, --user=REMOTE_USER ssh連接配接的使用者名,ansible.cfg中可以配置
-k, --ask-pass 提示輸入ssh登入密碼,當使用密碼驗證登入的時候用
-s, --sudo sudo運作
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個使用者,預設為root
-K, --ask-sudo-pass 提示輸入sudo密碼,當不是NOPASSWD模式時使用
-T TIMEOUT, --timeout=TIMEOUT ssh連接配接逾時時間,預設10秒
-C, --check 指定該參數後,執行playbook檔案不會真正去執行,而是模拟執行一遍,然後輸出本次執行會對遠端主機造成的修改
-c CONNECTION 連接配接類型(default=smart)
-D, --diff 如果file和template子產品改變,會顯示改變的内容,應該和--check一起
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 設定額外的變量如:key=value or YAML/JSON,以空格分隔變量,或用多個-e
-f FORKS, --forks=FORKS fork多少個程序并發處理,預設5
-i INVENTORY, --inventory-file=INVENTORY 指定hosts檔案路徑,預設default=/etc/ansible/hosts
-l SUBSET, --limit=SUBSET 指定一個pattern,對- hosts:比對到的主機再過濾一次
--list-hosts 隻列印有哪些主機會執行這個playbook檔案,不是實際執行該playbook
--list-tasks 列出該playbook中會被執行的task
-M MODULE_PATH, --module-path=MODULE_PATH 子產品所在路徑,預設/usr/share/ansible/
--private-key=PRIVATE_KEY_FILE 私鑰路徑
--start-at-task=START_AT start the playbook at the task matching this name
--step 同一時間隻執行一個task,每個task執行前都會提示确認一遍
--syntax-check 隻檢測playbook檔案文法是否有問題,不會執行該playbook
-t TAGS, --tags=TAGS 當play和task的tag為該參數指定的值時才執行,多個tag以逗号分隔
--skip-tags=SKIP_TAGS 當play和task的tag不比對該參數指定的值時,才執行
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)