1. 程式人生 > >Ansible之playbook學習一

Ansible之playbook學習一

簡單來說,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)