如何在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
相关产品推荐
相关产品推荐

