Ansible shell模块返回结果重复显示的原因及解决方法
Ansible debug模块重复输出result变量的原因及解决方法
问题背景
使用如下Ansible Playbook在localhost执行shell脚本,将输出注册到result变量后,用debug模块打印result时出现重复条目:
--- - name: Run shell script and display all keys in result hosts: localhost tasks: - name: Create the shell script copy: dest: /tmp/multi_output.sh content: | #!/bin/bash # Print multiple messages to STDOUT for i in {1..101} do echo "Message $i to STDOUT" done sync # Forces the buffer to be written to disk mode: '0755' - name: Run the shell script shell: "/tmp/multi_output.sh" register: result environment: PYTHONUNBUFFERED: 1 - name: Display unique lines from 'stdout_lines' debug: var: result.stdout_lines changed_when: false - name: Display all keys in 'result' debug: var: result
执行后debug模块输出示例(出现两条看似重复的result条目):
TASK [Visualizzare tutte le chiavi di 'result'] ******************************** ok: [localhost] => { "result": { "changed": true, "cmd": "/tmp/multi_output.sh", "delta": "0:00:00.016129", "end": "2025-03-19 17:17:17.259092", "failed": false, "msg": "", "rc": 0, "start": "2025-03-19 17:17:17.242963", "stderr": "", "stderr_lines": [], "stdout": "....", "stdout_lines": [ "Messaggio 1 su STDOUT", "Messaggio 2 su STDOUT", "Messaggio 82 su STDOU" } ok: [localhost] => { "result": { "changed": true, "cmd": "/tmp/multi_output.sh", "delta": "0:00:00.016129", "end": "2025-03-19 17:17:17.259092", "failed": false, "msg": "", "rc": 0, "start": "2025-03-19 17:17:17.242963", "stderr": "", "stderr_lines": [], "stdout": "....", "stdout_lines": [ "Messaggio 1 su STDOUT", "Messaggio 2 su STDOUT", "Messaggio 3 su STDOUT" ] } }
原因分析
这并非result字典内容重复,而是Ansible对过长的stdout_lines输出触发了自动分块截断。你的脚本输出了101行内容,超过了Ansible默认的display_limit阈值(默认100行),debug模块会将超长输出拆分成多段显示,造成重复条目的错觉。
解决方法
1. 调整Ansible全局输出阈值
在ansible.cfg中修改display_limit参数,设置为大于输出行数的值:
[defaults] display_limit = 200 # 例如设置为200,覆盖默认的100行限制
2. 针对性查看关键字段
如果不需要完整的result内容,直接打印所需字段,避免超长输出:
- name: 查看脚本执行关键信息 debug: msg: "返回码: {{ result.rc }}, 输出总行数: {{ result.stdout_lines | length }}"
3. 查看完整stdout文本
直接打印result.stdout字段,会以完整文本形式展示输出,不会被分块:
- name: 查看完整输出文本 debug: var: result.stdout
4. 逐行遍历输出
通过loop逐行打印stdout_lines,避免分块:
- name: 逐行输出脚本内容 debug: msg: "{{ item }}" loop: "{{ result.stdout_lines }}"
内容的提问来源于stack exchange,提问作者Vito Custodero
相关产品推荐
相关产品推荐

