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

如何在Ansible中实现多组主机并行执行任务(组内串行)

当然支持啦!Ansible原生就有完美适配你需求的配置方式,完全能实现「组内串行执行、组间并行推进」的高效执行模式,下面给你详细拆解两种常用的实现思路:

方式一:静态分组 + Serial + Forks 参数(最直接)

这是最常用的方案,完全依赖Ansible原生参数就能实现,步骤如下:

  1. 提前定义好主机组:确保你的Inventory里已经按需求把主机分成了10个左右的组,比如app_group1、app_group2...app_group10,每组包含2-8台主机。

  2. 编写Playbook:在Play中指定所有目标组,同时设置serial: 1确保组内串行(每次只执行组内一台主机的任务):

- name: 统一执行通用任务,组内串行、组间并行
  hosts: app_group1:app_group2:app_group3:app_group4:app_group5:app_group6:app_group7:app_group8:app_group9:app_group10
  serial: 1
  tasks:
    - name: 引入你需要运行的通用角色
      ansible.builtin.include_role:
        name: your_common_role
    # 或者直接写具体任务
    # - name: 执行具体命令
    #   ansible.builtin.command: your_command
  1. 运行时设置Forks参数:执行Playbook时,把--forks值设置为你的组数量(比如10),这样Ansible会同时启动10个并行进程,每个进程处理一个组的一台主机。当某个组的一台主机任务完成后,会自动拉起该组的下一台主机继续执行,而其他组的进程会同时推进自己的任务,完美实现你要的效果。
ansible-playbook -i inventory.yml your_playbook.yml --forks=10
方式二:动态分组 + 异步任务(适配动态场景)

如果你的主机组是动态生成的(比如根据主机标签自动分组),可以结合group_by模块先完成动态分组,再用异步任务机制实现并行:

  1. 动态分组:先通过group_by按主机属性分组,比如按主机类型标签host_type分组:
- name: 动态分组主机
  hosts: all
  tasks:
    - name: 按主机类型创建动态组
      ansible.builtin.group_by:
        key: "host_type_{{ hostvars[inventory_hostname]['host_type'] }}"
  1. 异步执行组内任务:针对每个动态组,使用async和poll参数让组内任务串行,组间任务并行:
- name: 针对每个动态组串行执行任务
  hosts: host_type_*
  serial: 1
  tasks:
    - name: 异步执行通用任务(组内串行)
      ansible.builtin.include_role:
        name: your_common_role
      async: 3600  # 任务超时时间
      poll: 0      # 立即返回,不等待完成
    - name: 等待所有异步任务完成
      ansible.builtin.async_status:
        jid: "{{ item.ansible_job_id }}"
      register: job_result
      until: job_result.finished
      retries: 100
      delay: 10
      loop: "{{ ansible_play_batch | map('extract', hostvars, 'ansible_job_id') | list }}"

这种方式更灵活,适合主机组不固定的场景,但配置稍复杂一些。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:08:12