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

如何在Ansible YAML中遍历集合并执行多任务?

在Ansible中遍历多任务的简洁实现方式

你需要遍历环境集合并为每个环境执行一组任务,最简洁的方式有两种,推荐使用**外部任务文件+include_tasks**的方式(易维护),也可以用block配合loop实现内联多任务循环。

方法1:外部任务文件(推荐)

这种方式把重复执行的任务逻辑拆分到单独文件,主Playbook更简洁,也方便后续维护。

步骤1:修正并定义变量

先调整你的变量格式(原envs的嵌套列表冗余,改为直接的环境对象列表):

vars:
  artifactPath: 'C:/artifacts/artifact'
  envs:
    - name: 'ENV1'
      path: 'C:/site/env1'
      config: 'env1.config'
    - name: 'ENV2'
      path: 'C:/site/env2'
      config: 'env2.config'

步骤2:创建单独的任务文件(如env_deploy_tasks.yml)

把需要循环执行的三个任务放在这个文件里,用item引用当前遍历的环境对象:

# env_deploy_tasks.yml
- name: "{{ item.name }} Task1 Clean down target directory {{ item.path }}"
  win_file:
    path: "{{ item.path }}"
    state: absent

- name: "{{ item.name }} Task2 Copy files"
  win_copy:
    remote_src: yes
    src: "{{ artifactPath }}"
    dest: "{{ item.path }}"

- name: "{{ item.name }} Task3 Override config"
  win_copy:
    remote_src: yes
    src: "{{ artifactPath }}/{{ item.config }}"
    dest: "{{ item.path }}/config.json"

步骤3:主Playbook中引用并循环

用include_tasks配合loop遍历envs集合,每个环境会依次执行这三个任务:

- name: 遍历所有环境执行部署任务
  hosts: windows_servers
  vars:
    artifactPath: 'C:/artifacts/artifact'
    envs:
      - name: 'ENV1'
        path: 'C:/site/env1'
        config: 'env1.config'
      - name: 'ENV2'
        path: 'C:/site/env2'
        config: 'env2.config'
  tasks:
    - name: 为每个环境执行部署任务组
      include_tasks: env_deploy_tasks.yml
      loop: "{{ envs }}"

方法2:内联Block循环(无需外部文件)

如果不想拆分文件,可以用block包裹三个任务,直接在block上使用loop:

- name: 遍历所有环境执行部署任务
  hosts: windows_servers
  vars:
    artifactPath: 'C:/artifacts/artifact'
    envs:
      - name: 'ENV1'
        path: 'C:/site/env1'
        config: 'env1.config'
      - name: 'ENV2'
        path: 'C:/site/env2'
        config: 'env2.config'
  tasks:
    - name: 处理单个环境的部署流程
      block:
        - name: "{{ item.name }} Task1 Clean down target directory {{ item.path }}"
          win_file:
            path: "{{ item.path }}"
            state: absent

        - name: "{{ item.name }} Task2 Copy files"
          win_copy:
            remote_src: yes
            src: "{{ artifactPath }}"
            dest: "{{ item.path }}"

        - name: "{{ item.name }} Task3 Override config"
          win_copy:
            remote_src: yes
            src: "{{ artifactPath }}/{{ item.config }}"
            dest: "{{ item.path }}/config.json"
      loop: "{{ envs }}"

关键注意点

  • 两种方式都通过loop: "{{ envs }}"遍历环境集合,每个item对应一个环境对象,通过item.name/item.path/item.config引用属性
  • 修正了你原任务中的语法错误:win_file后添加冒号、remote_src: yes补全空格、任务名称使用正确的变量插值格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:05:23