问题描述
正在使用Ansible 2.2,但发现在管理1000个用户时,串行运行任务耗时较长。用户希望能够并行运行这些任务,以提高效率。此外,用户提到了在循环中使用async执行时的一些问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:使用async模式的”Execute and poll”
在Ansible中,可以使用async模式来实现任务的并行执行。根据任务的具体需求,可以选择不同的async模式。以下是使用”Execute and poll”模式的示例任务:
- name: My long running task
some_module_name:
ip: "{{item.fabric}}"
username: "{{user}}"
password: "{{password}}"
secret: "{{secret}}"
loop: "{{zoning_list}}"
register: _alias_vc_0
async: 60 # 设置异步执行的超时时间为60秒
poll: 5 # 设置每5秒轮询一次任务状态
在上述示例中,我们使用了”Execute and poll”模式,任务会以异步方式执行,并且每隔5秒轮询一次任务状态。这样可以节省一些时间。
方案2:使用async模式的”Fire and forget”
另一种快速的并行执行方式是”Fire and forget”,它在任务启动后立即继续执行下一个任务,不等待任务完成。这种模式下,任务的结果(例如”changed: True/False”)无法得知,适用于不关心任务反馈的情况。以下是”Fire and forget”模式的示例:
- name: My long running task
some_module_name:
ip: "{{item.fabric}}"
username: "{{user}}"
password: "{{password}}"
secret: "{{secret}}"
loop: "{{zoning_list}}"
register: _alias_vc_0
async: 60 # 设置异步执行的超时时间为60秒
poll: 0 # 使用"Fire and forget"模式,不进行轮询
方案3:使用async模式的”Fire and forget with async_status”
“Fire and forget with async_status”模式结合了”Fire and forget”和async_status任务,可以在一定程度上同时享受并行执行和任务反馈。以下是使用”Fire and forget with async_status”模式的示例:
- name: My long running task
some_module_name:
ip: "{{item.fabric}}"
username: "{{user}}"
password: "{{password}}"
secret: "{{secret}}"
loop: "{{zoning_list}}"
register: _alias_vc_0
async: 60 # 设置异步执行的超时时间为60秒
poll: 0 # 使用"Fire and forget"模式,不进行轮询
- name: Wait for My long running task to finish
async_status:
id: "{{ item.ansible_job_id }}" # 使用async模式返回的任务ID
register: _jobs_alias_vc_0
retries: 20 # 最大尝试次数
delay: 2 # 每次轮询间隔2秒
until: _jobs_alias_vc_0.finished
loop: "{{_alias_vc_0.results}}" # 循环等待每个任务完成
在上述示例中,我们首先使用”Fire and forget”模式启动异步任务,然后通过async_status任务轮询任务状态,直到任务全部完成。
注意事项:
– async模式的选择要根据具体任务和需求来决定,不是所有任务都适合并行执行。
– 如果任务涉及到多个主机,async模式的效果可能会更显著,因为可以在多个主机上并行执行任务。
以上方案可以根据实际情况选择使用,以提高Ansible任务的执行效率。希望能对您有所帮助!