[英]Execution flow - How ansible play works?
在以下機器場景中:
我試圖在文檔中理解這一點:“默認情況下,Ansible 在使用 5 個分叉在任何主機上開始下一個任務之前,在受播放影響的所有主機上運行每個任務。”
說, task1
是遠程執行類型(不是本地執行類型)
如果play1
需要在所有 4 台主機上運行task1
(上圖),那么
ansible是否只有在執行后才在host2
上執行task1
( host1
上的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.