Ansible技术咨询:如何用双循环与合理数据结构合并多任务?
Ansible任务合并优化方案建议
现有场景说明
你目前有4组文件与对应条件的映射关系:
1. file_1 when condition_1 2. file_2 when condition_2 3. file_3 when condition_3 4. file_4 when condition_4
其中每个condition_1至condition_4都由两个子条件逻辑与组成,比如condition_1 = (condition_a and condition_b),且你已经预先将子条件组合好,在任务中可以直接使用组合后的条件:
when: - condition_a [an ansible fact] - condition_b [another ansible fact]
当前你为每种情况单独编写了任务,示例如下:
- name: task 1 copy: src: file_x dest: /some/place when: - condition_x
优化思路:循环合并任务
不需要写4个重复的任务,通过构建字典列表的方式就能把文件和对应条件绑定,用loop循环执行即可,这是最清晰直观的方案,比zip过滤器更易维护。
具体实现步骤
- 定义一个包含文件路径和对应条件的列表变量,每个元素是一个字典,用语义明确的键名:
vars: file_deploy_list: - src_file: file_1 dest_path: /some/place/file_1 apply_condition: condition_1 - src_file: file_2 dest_path: /some/place/file_2 apply_condition: condition_2 - src_file: file_3 dest_path: /some/place/file_3 apply_condition: condition_3 - src_file: file_4 dest_path: /some/place/file_4 apply_condition: condition_4
- 编写单个循环任务,遍历列表动态引用元素属性:
- name: 复制对应文件到目标路径 copy: src: "{{ item.src_file }}" dest: "{{ item.dest_path }}" when: "{{ item.apply_condition }}" loop: "{{ file_deploy_list }}"
为什么不用zip过滤器?
zip过滤器适合将两个独立列表(比如单独的文件列表和单独的条件列表)合并,但如果后续需要调整某个文件的目标路径、新增额外参数,字典列表的扩展性更强,可读性也更好,更适合长期维护。
补充:直接使用子条件组合的方式
如果不想预先定义condition_1这类组合条件,也可以在字典里直接存放子条件列表,任务中直接引用:
vars: file_deploy_list: - src_file: file_1 dest_path: /some/place/file_1 apply_conditions: - condition_a - condition_b # 其他文件同理
对应的任务:
- name: 复制对应文件到目标路径 copy: src: "{{ item.src_file }}" dest: "{{ item.dest_path }}" when: "{{ item.apply_conditions }}" loop: "{{ file_deploy_list }}"
Ansible的when列表默认是逻辑与的关系,和你之前写的when: [cond1, cond2]效果完全一致。
内容的提问来源于stack exchange,提问作者Adam Gold
相关产品推荐
相关产品推荐

