[英]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.