Ansible如何遍历嵌套列表实现实例名与对应路径配对
问题核心原因
你当前的db2_store数据结构是将实例名列表和路径列表作为两个独立元素拼接,没有按索引配对,所以无法直接遍历拿到每组对应的实例+路径组合。
修正方案
步骤1:调整db2_store组装逻辑,使用zip过滤器配对数据
Ansible 自带的zip过滤器可以将两个等长列表按位置一一配对,刚好匹配你的场景,把原来的set_fact任务替换为如下写法:
- name: 组装实例与对应DIAGPATH配对列表 set_fact: db2_store: "{{ instance_db | zip(kud_path.results | map(attribute='stdout') | list) | list }}"
调整后db2_store的结构会变成:
[ ["db2inst1", "/db2home/db2inst1/sqllib/db2dump/DIAG0000/"], ["db2inst2", "/home/db2inst2/sqllib/db2dump/DIAG0000/"] ]
每个子元素就是一组对应的实例名+路径。
步骤2:调整template任务循环逻辑
原来的循环把整个db2_store当成单个元素包裹了一层,直接循环db2_store本身即可:
- name: Creating silent config template: src: template.txt.j2 dest: '/tmp/template{{ item[0] | lower }}.txt' mode: '0775' loop: "{{ db2_store }}"
步骤3:调整模板变量引用
直接用索引取值即可,不需要[*]通配符:
################## Database connection config ################## INSTANCE={{ item[0] }} DIAGLOG_PATH={{ item[1] }}db2diag.log
更易维护的升级方案
如果不想记索引含义,可以组装成带明确字段的字典列表,调整set_fact如下:
- name: 组装实例与对应DIAGPATH字典列表 set_fact: db2_store: >- {{ db2_store | default([]) + [{ 'instance_name': item.0, 'diag_path': item.1 }] }} loop: "{{ instance_db | zip(kud_path.results | map(attribute='stdout') | list) | list }}"
后续模板里就可以用语义化的字段名,可读性更强:
################## Database connection config ################## INSTANCE={{ item.instance_name }} DIAGLOG_PATH={{ item.diag_path }}db2diag.log
对应的生成文件路径也可以写成dest: '/tmp/template{{ item.instance_name | lower }}.txt',避免索引写错的问题。
内容的提问来源于stack exchange,提问作者Luis Henrique
相关产品推荐
相关产品推荐

