You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:23:14