You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中并行调用角色以批量处理设备列表?

当然可以实现多设备并行调用角色,下面是两种最实用的解决方案:

方案1:用异步任务(async/poll)并行执行角色

在你的循环调用逻辑中添加async和poll参数,让每个角色实例在后台异步运行,无需串行等待前一个任务完成。async设置任务允许运行的最大时长(单位:秒),poll设置每隔多久检查一次任务状态。

修改后的Playbook示例(实时等待结果)

- name: 并行获取各节点报告
  include_role:
    name: reports
    tasks_from: get_reports_for_node
  vars:
    node_dn: "topology/{{ node_id }}"
  loop: "{{ node_list }}"
  loop_control:
    loop_var: node_id
  async: 300  # 允许任务最多运行5分钟
  poll: 5     # 每5秒检查一次任务状态

非阻塞式异步执行(后续手动收集结果)

如果不想一直等待任务完成,可以把poll设为0,之后用async_status模块统一收集结果:

- name: 异步启动各节点报告任务
  include_role:
    name: reports
    tasks_from: get_reports_for_node
  vars:
    node_dn: "topology/{{ node_id }}"
  loop: "{{ node_list }}"
  loop_control:
    loop_var: node_id
  async: 300
  poll: 0
  register: async_results

- name: 等待所有异步任务完成
  async_status:
    jid: "{{ item.ansible_job_id }}"
  loop: "{{ async_results.results }}"
  register: async_final_results
  until: async_final_results.finished
  retries: 30
  delay: 10
方案2:将节点作为独立主机并行处理

如果你的node_list对应实际的网络设备或主机,更高效的方式是把这些节点加入Ansible inventory,直接通过Play的hosts字段指定目标节点,利用Ansible原生的多主机并行能力(通过forks参数控制并行数量)。

步骤1:配置inventory

在inventory文件中添加目标节点:

[report_nodes]
node1 ansible_host=192.168.1.10
node2 ansible_host=192.168.1.11
# 按需添加更多节点

如果节点列表是动态生成的,也可以使用动态inventory脚本获取节点信息。

步骤2:修改Playbook并行执行角色

- name: 并行在各节点上获取报告
  hosts: report_nodes
  gather_facts: false
  roles:
    - role: reports
      tasks_from: get_reports_for_node
      vars:
        node_dn: "topology/{{ inventory_hostname }}"

运行Playbook时,通过--forks参数指定并行数,比如:

ansible-playbook your_playbook.yml --forks 10

默认forks值为5,可根据控制节点性能和目标设备承载能力调整。

注意事项
  • 异步任务要求目标主机支持后台进程(多数Linux/Unix系统默认支持,Windows主机需特殊处理)。
  • forks参数不要设置过大,避免控制节点或目标设备资源耗尽。
  • 若角色内任务存在全局依赖(比如需先完成某统一操作再处理节点),需确保并行执行不会引发冲突。

内容的提问来源于stack exchange,提问作者Christoph N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:55:20