簡體   English   中英

執行流程 - ansible play 是如何工作的?

[英]Execution flow - How ansible play works?

在以下機器場景中:

在此處輸入圖像描述

我試圖在文檔中理解這一點:“默認情況下,Ansible 在使用 5 個分叉在任何主機上開始下一個任務之前,在受播放影響的所有主機上運行每個任務。”

說, task1是遠程執行類型(不是本地執行類型)

如果play1需要在所有 4 台主機上運行task1 (上圖),那么

ansible是否只有在執行后才在host2上執行task1host1上的task1並檢索執行結果)? 如何使用 5 個分叉?

注意:每個任務執行都應該將 JSON 結果返回給 ansible 服務器。

Q: “ansible是否只有在host2上執行task1(task1在host1上並取回執行結果)?”

答:沒有。

問: “如何使用 5 個分叉?”

A:默認情況下,Ansible 在 5 個遠程主機上並行運行該播放。 請參閱設置分叉數

問: “試圖理解:默認情況下,Ansible 在受播放影響的所有主機上運行每個任務,然后在任何主機上開始下一個任務,...”

A:默認是線性策略“將同時執行每個任務”,即所有分叉必須完成一個任務才能移動到下一個任務。 其他策略見插件列表

問: “什么是鎖步?”

答: “鎖步”描述了線性策略,即所有分叉必須完成一個任務(步驟)才能移動到下一個任務(分叉被鎖定)。 報價

“鎖步系統是容錯的計算機系統,可以同時並行運行同一組操作。”

問: “分叉到底是什么?它是 python 線程嗎?”

答:沒有。Ansible 前叉不是 python 線程。 引用詞匯表

“分叉:Ansible 與遠程節點並行對話,可以通過傳遞 --forks 或編輯配置文件中的默認值來設置並行度。默認值是非常保守的五 (5) 個分叉,但如果您有大量 RAM,您可以輕松地將其設置為 50 之類的值以提高並行度。”

看看源代碼 部分代碼是線程化的。

$ grep -r "import threading" ansible
ansible/test/lib/ansible_test/_internal/thread.py:import threading
ansible/lib/ansible/galaxy/collection.py:import threading
ansible/lib/ansible/plugins/callback/cgroup_perf_recap.py:import threading
ansible/lib/ansible/plugins/callback/cgroup_memory_recap.py:import threading
ansible/lib/ansible/plugins/strategy/__init__.py:import threading

問:“如何使用 Python 實現並行性?

A: Ansible 中的並行度由策略插件控制。 例如線性插件:

“任務執行按 C(串行)定義的每個主機批次同步執行(默認全部)。主機的分叉限制將同時執行每個任務,然后執行下一系列主機,直到批處理完成,之前繼續下一個任務。”

查看線性插件中的元素

display.debug("building list of next tasks for hosts")
for host in hosts:
        host_tasks[host.name] = iterator.get_next_task_for_host(host, peek=True)
...

display.debug("counting tasks in each state of execution")
host_tasks_to_run = [(host, state_task)
                         for host, state_task in iteritems(host_tasks)
                         if state_task and state_task[1]]
...

for (k, v) in host_tasks_to_run:
...

class StrategyBase中的結果處理是線程化的。

# create the result processing thread for reading results in the background
self._results_thread = threading.Thread(target=results_thread_main, args=(self,))
self._results_thread.daemon = True
self._results_thread.start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM