如何在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
相关产品推荐
相关产品推荐

