Ansible中如何实现两个不等长列表的逐元素配对迭代?
解决Ansible中列表配对迭代的问题
你的核心问题是用product过滤器会生成全笛卡尔积,导致static_variable的每个元素和first_commmand_output.results的所有结果(两个任务执行结果)配对,而你需要的是:static_variable的每个元素只和自己触发的第一个任务产生的25个输出行逐个配对。
修正后的Playbook代码
--- - name: 获取第一个命令的输出列表 shell: ./mqcli.py -a {{ item }} "some command" | awk -F"[()]" '{print $2}' loop: "{{ static_variable }}" register: first_commmand_output # 第一个任务执行正常,每个static元素对应一个结果,结果里包含25行输出的stdout_lines - name: 根据第一个命令的输出执行第二个命令 shell: ./mqcli.py -a {{ item.0.item }} "listcert -m {{ item.1 }}" loop: "{{ first_commmand_output.results | subelements('stdout_lines') }}" register: second_command_output
关键说明
first_commmand_output.results的结构:第一个任务loop遍历static_variable,所以results列表里的每个元素对应一个static_variable项,每个元素包含:item:对应的static_variable元素stdout_lines:该元素触发命令后得到的25行输出
subelements过滤器的作用:它会把results里的每个元素,和其内部stdout_lines列表的每个元素拆分成配对项。比如:- 对
results[0](对应static_variable[0]),会生成25个配对:(results[0], stdout_lines[0])、(results[0], stdout_lines[1])...(results[0], stdout_lines[24]) - 对
results[1](对应static_variable[1]),同样生成25个配对
- 对
- 任务中的变量引用:
item.0.item:取到当前配对对应的static_variable元素item.1:取到当前配对对应的stdout_lines中的单个元素
这样就完全符合你的需求:每个static_variable元素分别和自己对应的25个输出行逐个配对执行第二个命令。
内容的提问来源于stack exchange,提问作者Raj87
相关产品推荐
相关产品推荐

