ansible高階操作 serial滾動更新

技术颜良發表於2024-06-10

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

相關文章