繁体   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