天天看點

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)

繼續閱讀