Ansible循环任务中如何仅打印_repostatus结果里的stdout_lines内容
Ansible循环任务中如何仅打印_repostatus结果里的stdout_lines内容
我完全懂你遇到的困扰——当用loop循环执行任务并通过register捕获结果时,返回的变量结构和单任务执行时完全不一样,直接访问_repostatus.stdout_lines肯定会报“dict object没有这个属性”的错误。
问题根源
当你在带loop的任务里用register,得到的变量(这里是_repostatus)是一个汇总字典,真正的每一次循环执行的细节都存在它的results字段里——也就是你看到的那个包含每个repo启用结果的数组。每个数组元素里才会有stdout、stdout_lines这些你需要的字段,顶层的_repostatus本身并没有这些属性。
解决方案:遍历results列表
只需要把你的debug任务改成遍历_repostatus.results,然后从每个子项里提取stdout_lines即可:
- name: Enabling the repository shell: subscription-manager repos --enable={{ item }} register: _repostatus loop: "{{ repo_id }}" - debug: msg: "{{ item.stdout_lines }}" loop: "{{ _repostatus.results }}"
这样执行后,就会逐个打印出每个repo启用操作对应的stdout_lines内容,不会再输出那些你不需要的额外变量信息。
进阶:一次性输出所有结果
如果你想把所有repo的stdout_lines合并成一个列表一次性打印,还可以用Ansible的过滤器来实现:
- debug: msg: "{{ _repostatus.results | map(attribute='stdout_lines') | list }}"
这个写法会把results里每个元素的stdout_lines提取出来,整合成一个大列表输出,适合需要批量查看结果的场景。
备注:内容来源于stack exchange,提问作者OmiPenguin
相关产品推荐
相关产品推荐

