1.非同步操作和輪詢
預設情況下,劇本中的任務會一直處於開啟狀態,直到任務在每個節點上完成。
這樣可以會造成阻塞和超時,因此我們可以使用非同步模式一次執行所有任務,然後輪詢直到它們完成為止。
Ansible本身就是採用的多執行緒來操作多個主機節點,可以使用-P來非同步操作。
現在所說的非同步操作和輪詢是針對單個任務來說的。
(1)超時
如果你想避免因為連線超時問題導致任務執行失敗,可以指定poll輪詢次數,
這樣就不會因為一次沒連上就報錯。
--- - hosts: all tasks: - name: "預設長時間執行操作,最多等待45秒,輪詢5次" command: /bin/sleep 15 async: 45 poll: 5
async是非同步時長,如果沒有指定就是同步操作。
poll代表輪詢次數,預設值15.
執行結果:
(2)併發
如果poll為0,Ansible啟動任務之後會立即轉到下一個任務,這樣就會併發執行任務。
透過指定poll為0,可以來非同步執行任務。
如果使用--forks來執行非同步任務,效率會更高。
如果希望非同步任務執行並稍後檢查,可以這樣
- name: 'YUM - async task' yum: name: docker-io state: present async: 1000 poll: 0 register: yum_sleeper - name: 'YUM - check on async task' async_status: jid: "{{ yum_sleeper.ansible_job_id }}" register: job_result until: job_result.finished retries: 30
2.滾動更新
你現在有100個節點,你想分批次操作,比如一次操作10臺,就可以使用serial引數來定製。
現在我有兩個節點:
常規方式來執行任務:
serial1.yaml
--- - hosts: all gather_facts: False tasks: - name: task one command: hostname - name: task two command: hostname
執行結果:
執行一次,執行了兩個任務。
現在新增serial=1,在此檢視結果:
我們發現,現在是分兩次執行了。
我們不僅可以指定沒批執行的數量,還可以指定比率。
serial: "30%"
還可以指定一個列表:
serial:
- 1
- 5
- 10
第一批1臺,第二批執行5臺,這樣迴圈著來。
當然可以將多個批次使用百分比列出:
serial:
- "10%"
- "20%"
- "100%"
混合定義也是可以的:
serial:
- 1
- 5
- "20%"
這個功能有什麼用了,現在有10個任務,常規做法是所有的機器執行完task1之後,再執行task2,
如果task2有問題,那麼這批操作不就作廢嗎,如果第一批只執行一臺,那麼就立刻檢測出task2任務的異常了。
這樣可以大大提高效率。
3.最大故障率
預設情況下,只要批處理中存在尚未失敗的主機,Ansible就將繼續執行。
我們可以透過max_fail_percentage引數來指定故障了。
max_fail_percentage: 30
如果10臺中有3臺出現問題,操作即結束。
4.跑一次
在某些情況下,可能只需要對一批主機執行一次任務,可以透過run_one引數來實現。
run_once: true
該指令強制任務在當前批次的第一個主機上執行任務,然後將所有結果同步給同一批次的其它主機。
5.本地劇本
如果要在本機上執行劇本,只需要:
ansible-playbook playbook.yml --connection=local
或者在劇本中指定:
- hosts: 127.0.0.1
connection: local