如何简化Ansible控制台中循环item的冗长输出并优化循环遍历方式?
如何简化Ansible控制台中循环item的冗长输出并优化循环遍历方式?
嗨,我来帮你搞定这两个Ansible的小问题,其实都有很直接的解决方案,咱们分开来说:
一、简化控制台的冗长item输出
Ansible自带了控制循环输出显示的配置,就是loop_control里的label参数,它能让你自定义控制台里显示的item内容,不用默认输出整个庞大的结果字典。
修改你的「Create a file」任务,加上loop_control配置即可:
- name: Create a file with_items: "{{ workdir.results }}" shell: touch {{ item.stdout }}/test-file loop_control: label: "{{ item.stdout }}"
这样运行时,控制台就只会显示类似(item=/tmp/tmp.ancF0iBqzP)的简洁内容,再也不会被一大串无关信息干扰了。
二、优化循环遍历方式,直接提取stdout列表
你想要的workdir.results.*.stdout这种“直接提取所有stdout”的写法,用Ansible的map过滤器就能实现,它可以把results列表里每个元素的stdout属性提取出来,变成一个纯路径的列表:
- name: Create a file with_items: "{{ workdir.results | map(attribute='stdout') | list }}" shell: touch {{ item }}/test-file
这样item直接就是每个临时目录的路径,不仅控制台会自动显示这个简洁的路径(不用额外配置loop_control),代码逻辑也更清晰直观。
如果你习惯用Ansible推荐的新写法loop代替with_items,也可以这么写:
- name: Create a file loop: "{{ workdir.results | map(attribute='stdout') | list }}" shell: touch {{ item }}/test-file
三、其他小技巧补充
- 要是你还想进一步精简输出,也可以调整Ansible的运行verbosity等级(比如用
-v代替默认的无参数),但这会影响整个任务的输出信息量,不如用label或者过滤列表的方式精准。 - 另外,如果注册变量时只想收集
stdout,也可以在循环里用set_fact来构建列表,但相比map过滤器,这种写法会多一个任务步骤,效率稍低。
备注:内容来源于stack exchange,提问作者user3629081
相关产品推荐
相关产品推荐

