在Ansible中如何并行运行with_items循环任务

89次阅读
没有评论

问题描述

正在使用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任务的执行效率。希望能对您有所帮助!

正文完