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

如何在Ansible中保留Shell输出的颜色信息

解决Ansible展示带颜色命令输出的方法

核心问题分析

ls --color这类命令默认仅在TTY终端环境下才会输出ANSI颜色转义序列,而Ansible执行shell命令时默认是非TTY环境,所以首先要强制命令输出颜色;其次,Ansible的debug模块默认会转义特殊字符,需要保留原始输出才能让终端解析颜色。

方法1:强制命令输出颜色 + 使用raw过滤器保留转义序列

修改Playbook如下:

---
- name: 展示彩色输出
  hosts: all
  gather_facts: false
  tasks:
    - name: 执行带颜色的命令
      shell:
        cmd: ls --color=always
      register: output

    - name: 输出彩色内容
      debug:
        msg: "{{ output.stdout | raw }}"
  • --color=always:强制ls输出颜色转义序列,无论是否在TTY环境
  • | raw过滤器:告诉Ansible不要转义ANSI转义序列,让终端直接解析显示颜色

方法2:让命令在伪终端环境执行

如果某些命令必须依赖TTY环境才能输出颜色,可以使用ansible.builtin.shell的pty: yes参数(需Ansible 2.5+):

---
- name: 展示彩色输出
  hosts: all
  gather_facts: false
  tasks:
    - name: 在伪终端执行命令
      shell:
        cmd: ls --color
      register: output
      args:
        pty: yes

    - name: 输出彩色内容
      debug:
        msg: "{{ output.stdout | raw }}"
  • pty: yes:为命令创建伪终端环境,模拟真实终端场景,让命令自动输出颜色
  • 同样需要| raw过滤器确保转义序列不被转义

方法3:调整Ansible全局配置配合debug模块

如果不想用过滤器,可以修改ansible.cfg配置文件,添加或修改以下内容:

[defaults]
stdout_callback = debug
display_ok_hosts = yes
display_failed_hosts = yes

然后Playbook中使用debug模块的var参数,同时命令强制输出颜色:

---
- name: 展示彩色输出
  hosts: all
  gather_facts: false
  tasks:
    - name: 执行带颜色的命令
      shell: ls --color=always
      register: output

    - name: 输出彩色内容
      debug:
        var: output.stdout

该配置会让debug回调直接输出原始内容,但全局配置可能影响其他Playbook的输出格式。


内容的提问来源于stack exchange,提问作者mugiseyebrows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:52:37