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

