委託,滾動更新,本地動作

由於設計初衷是作為多使用者,Anisible很擅長在某一個主機上代表另一個做事,或者參考遠端主機做一些本地工作.

這個特性對於架設連續實現某些設施或者0暫停滾動升級,這裡你可能會提到負載均衡或者監控系統.

更多的特性允許偵錯事情完成的順序,和設定一批視窗,來確定多少機器在一次中滾動更新.

這節會介紹所有這些特性.`詳情案例參見 <http://github.com/ansible/ansible-examples/>`_.這裡有很多案例來說明對於不同程式來實行,0暫停更新步驟

你也可以參考:doc:`modules`部分,很多模組例如 ‘ec2_elb’, ‘nagios’, ‘bigip_pool’, ‘netscaler’ 的一些概念會在這裡介紹.

你可能也想參考:doc:playbooks_roles,你可以找到類似’pre_task’和’post_task’的詳細介紹和呼叫方式.

Rolling Update Batch Size 滾動更新批量尺寸 `````````````````````

New in version 0.7.

預設來說,Anisble 可以使圖參考某一個play來並行操作所有主機.對於滾動更新案例, 你可以定義Ansible可以在一個特定時間同時控制多少主機,使用’‘serial’’ 關鍵詞:

- name: test play
  hosts: webservers
  serial: 3

在上面的例子,如果我們有100臺主機,3 臺主機定義在組’webservers’ 可以在下面3個主機開始之前完全完成

這個’‘serial’’ 關鍵詞在Ansible 1.8 以後可以被定義為百分數,用來定義每一次操作一個play中百分之多少主機:

- name: test play
  hosts: websevers
  serial: "30%"

如果主機數不能被passes數量整除,最後的pass將會包含提醒資訊

Note

不管多小的百分比,每個pass的主機數一定會大於等於1.

最大失敗百分比

New in version 1.3.

預設來說,Ansible 會持續執行行為只要在一個組中還有主機沒有宕機. 在有些情況下,例如之前提到的滾動更新,也許理想的情況是當一個失敗數上線達到時主動宕掉這個play.為了達到這個目的,在 1.3版本中,你可以設定最大失敗半分比:

- hosts: webservers
  max_fail_percentage: 30
  serial: 10

在上面的例子中,如果在10個伺服器中如果多餘3個,其它的play就會主動宕掉.

Note

這個百分比必須被超過,不僅僅是相等.例如如果serial值唄設定為4,並且你希望任務主動在2個系統失敗時候放棄.那麼這個百分比應該設定為49而不是50.

委任

New in version 0.7.

This isn’t actually rolling update specific but comes up frequently in those cases. 這個雖然不屬於滾動更新,但是在那些場景下經常會出現.

如果你想參考其它主機來在一個主機上執行一個任務,我們就可以使用’delegate_to’關鍵詞在你要執行的任務上. 這個對於把節點放在一個負載均衡池裡面活著從裡面移除非常理想. 這個選項也對處理視窗中斷非常有用. 使用’serial’關鍵詞來控制一定數量的主機也是一個好想法:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum: name=acme-web-stack state=latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1
這些命令可以在127.0.0.1上面執行,這個執行Ansible的主機.這個也是一個簡寫的語法用在每一個任務基礎(per-task basis): ‘local_action’.以上就是這樣一個playbook.但是使用的是簡化後的語法在172.0.0.1上面做代理::

# ...

tasks:

  • name: take out of load balancer pool local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  • name: add back to load balancer pool local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

A common pattern is to use a local action to call ‘rsync’ to recursively copy files to the managed servers. Here is an example:

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

注意你必須擁有不需要密碼SSH金鑰或者ssh-agent配置,不然的話rsync會需要詢問密碼.

Run Once

New in version 1.7.

有時候你有這樣的需求,在一個主機上面只執行一次一個任務.這樣的配置可以配置”run_once”來實現:

---
# ...

  tasks:

    # ...

    - command: /opt/application/upgrade_db.py
      run_once: true

    # ...

這樣可以新增在”delegat_to”選項對中來定義要執行的主機:

- command: /opt/application/upgrade_db.py
  run_once: true
  delegate_to: web01.example.org

當”run_once” 沒有喝”delegate_to”一起使用,這個任務將會被清單指定的第一個主機. 在一組被play制定主機.例如 webservers[0], 如果play指定為 “hosts: webservers”.

這個方法也很類似,雖然比使用條件更加簡單粗暴,如下事例:

- command: /opt/application/upgrade_db.py
  when: inventory_hostname == webservers[0]

本地Playbooks

在本地使用playbook有時候比ssh遠端使用更加有用.可以通過把playbook放在crontab中,來確保一個系統的配置,可以很有用. 在OS installer 中執行一個playbook也很有用.例如Anaconda kickstart.

要想在本地執行一個play,可以直接設定”host:” 與 “hosts:127.0.0.1”, 然後使用下面的命令執行:

ansible-playbook playbook.yml --connection=local

或者,一個本地連線也可以作為一個單獨的playbook play應用在playbook中, 即便playbook中其他的plays使用預設遠端 連線如下:

- hosts: 127.0.0.1
  connection: local

See also

Playbooks
An introduction to playbooks
Ansible Examples on GitHub
Many examples of full-stack deployments
User Mailing List
Have a question? Stop by the google group!
irc.freenode.net
#ansible IRC chat channel