Ansible如何实现debug模块多行格式化输出易读的执行结果
Ansible debug输出挤成单行的解决方法
问题根因
当前写法把result.stdout_lines(本身是存储每行内容的列表类型)直接嵌套在msg的列表中,Ansible默认JSON序列化输出时不会自动对嵌套结构做换行缩进,因此所有内容会被压缩到单行显示。
可行方案
方案1:拼接换行符输出格式化文本(最贴合预期效果)
直接用Jinja2循环把所有错误行拼接为带换行的文本,同时因为任务本身是触发失败提示,直接用fail模块替代debug更符合场景,还能省去额外的失败判断逻辑,优化后代码:
- name: Read result # 去掉冗余的cat管道,grep可直接读取文件 shell: "grep 'REASON:-' result.txt" register: result - name: print checks fail. fail: msg: - "Check Failed!" - "{% for err_line in result.stdout_lines %}{{ err_line }}\n{% endfor %}"
执行后每条错误会自动单独占一行,和预期输出格式一致。
方案2:逐行遍历打印错误条目
如果需要每条错误单独作为独立输出项,可以通过循环逐行打印,代码示例:
- name: Read result shell: "grep 'REASON:-' result.txt" register: result - name: Print fail notice debug: msg: "Check Failed! List of errors:" - name: Print each error reason debug: msg: "{{ item }}" loop: "{{ result.stdout_lines }}"
方案3:全局修改Ansible输出格式
如果不想修改单个playbook代码,可以修改Ansible全局配置,让所有输出自动格式化换行:
- 找到Ansible配置文件
ansible.cfg - 在
[defaults]段添加如下配置:
[defaults] # 使用YAML格式输出,自动对嵌套结构做换行缩进 stdout_callback = yaml callback_result_format = yaml
配置生效后,所有列表、字典类型的输出都会自动缩进换行,不会再出现内容挤在单行的问题。
内容的提问来源于stack exchange,提问作者Aprilian8
相关产品推荐
相关产品推荐

