異步和輪詢
Ansible 有時(shí)候要執(zhí)行等待時(shí)間很長(zhǎng)的操作, 這個(gè)操作可能要持續(xù)很長(zhǎng)時(shí)間, 設(shè)置超過(guò)ssh的timeout. 這時(shí)候你可以在step中指定async 和 poll 來(lái)實(shí)現(xiàn)異步操作
async 表示這個(gè)step的最長(zhǎng)等待時(shí)長(zhǎng), 如果設(shè)置為0, 表示一直等待下去直到動(dòng)作完成.
poll 表示檢查step操作結(jié)果的間隔時(shí)長(zhǎng).
例1:
---
- name: Test
hosts: localhost
tasks:
- name: wair for
shell: sleep 16
async: 10
poll: 2
結(jié)果:
TASK: [wair for] **************************************************************
ok: [localhost]
<job 207388424975.101038> polling, 8s remaining
ok: [localhost]
<job 207388424975.101038> polling, 6s remaining
ok: [localhost]
<job 207388424975.101038> polling, 4s remaining
ok: [localhost]
<job 207388424975.101038> polling, 2s remaining
ok: [localhost]
<job 207388424975.101038> polling, 0s remaining
<job 207388424975.101038> FAILED on localhost
這個(gè)step失敗, 因?yàn)椴僮鲿r(shí)間超過(guò)了最大等待時(shí)長(zhǎng)
例2:
---
- name: Test
hosts: localhost
tasks:
- name: wair for
shell: sleep 16
async: 10
poll: 0
結(jié)果:
TASK: [wair for] **************************************************************
<job 621720484791.102116> finished on localhost
PLAY RECAP ********************************************************************
poll 設(shè)置為0, 表示不用等待執(zhí)行結(jié)果, 該step執(zhí)行成功
例3:
---
- name: Test
hosts: localhost
tasks:
- name: wair for
shell: sleep 16
async: 0
poll: 10
結(jié)果:
# time ansible-playbook xiama.yml
TASK: [wair for] **************************************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
real 0m16.693s
async設(shè)置為0, 會(huì)一直等待直到該操作完成.
Play執(zhí)行時(shí)的并發(fā)限制
一般情況下, ansible會(huì)同時(shí)在所有服務(wù)器上執(zhí)行用戶定義的操作, 但是用戶可以通過(guò)serial參數(shù)來(lái)定義同時(shí)可以在多少太機(jī)器上執(zhí)行操作.
- name: test play
hosts: webservers
serial: 3
webservers組中的3臺(tái)機(jī)器完全完成play后, 其他3臺(tái)機(jī)器才會(huì)開始執(zhí)行
serial參數(shù)在ansible-1.8以后就開始支持百分比
最大失敗百分比
默認(rèn)情況下, 只要group中還有server沒(méi)有失敗, ansible就是繼續(xù)執(zhí)行tasks. 實(shí)際上, 用戶可以通過(guò)"max_fail_percentage" 來(lái)定義, 只要超過(guò)max_fail_percentage臺(tái)的server失敗, ansible 就可以中止tasks的執(zhí)行
- hosts: webservers
max_fail_percentage: 30
serial: 10
ps: 實(shí)際失敗機(jī)器必須大于這個(gè)百分比時(shí), tasks才會(huì)被中止. 等于時(shí)是不會(huì)中止tasks的
委托
通過(guò)"delegate_to", 用戶可以把某一個(gè)任務(wù)放在委托的機(jī)器上執(zhí)行.
- 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
上面的task會(huì)在跑ansible的機(jī)器上執(zhí)行, "delegate_to: 127.0.0.1" 可以用local_action來(lái)代替
tasks:
- name: take out of load balancer pool
local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}
委托者的facts
默認(rèn)情況下, 委托任務(wù)的facts是inventory_hostname中主機(jī)的facts, 而不是被委托機(jī)器的facts. 在ansible 2.0 中, 設(shè)置delegate_facts為true可以讓任務(wù)去收集被委托機(jī)器的facts.
- hosts: app_servers
tasks:
- name: gather facts from db servers
setup:
delegate_to: "{{item}}"
delegate_facts: True
with_items: "{{groups[‘dbservers‘}}"
該例子會(huì)收集dbservers的facts并分配給這些機(jī)器, 而不會(huì)去收集app_servers的facts
RUN ONCE
通過(guò)run_once: true來(lái)指定該task只能在某一臺(tái)機(jī)器上執(zhí)行一次. 可以和delegate_to 結(jié)合使用
- command: /opt/application/upgrade_db.py
run_once: true
delegate_to: web01.example.org
指定在"web01.example.org"上執(zhí)行這
如果沒(méi)有delegate_to, 那么這個(gè)task會(huì)在第一臺(tái)機(jī)器上執(zhí)行