如何去除Ansible输出中的ANSI颜色控制字符仅保留ACTIVE/DISABLED状态
Ansible去除返回结果中ANSI颜色控制字符的解决方法
原代码失效的核心原因
- 错误1:
results.stdout_lines是列表类型,replace过滤器仅能作用于字符串,直接对列表使用不会对列表内的每个字符串生效 - 错误2:你匹配的
\\u001b[32m是字面量的转义字符表示,实际Ansible获取到的输出中是二进制的ESC控制符,需要用\x1b匹配真实的ESC字符
推荐解决方案
方案1:从根源避免生成ANSI控制符(最优)
交互式shell默认会开启颜色输出,你当前的shell命令用了bash -i会强制启用终端颜色特性,直接去掉交互式参数,同时给grep加上禁用颜色的参数,直接就能拿到无控制符的结果:
--- - hosts: server become: yes become_user: user tasks: - name: Show certificates shell: 'kb | grep -i --color=never certificates' register: results - debug: msg: "{{ results.stdout_lines }}"
如果kb命令本身默认带颜色输出,可查找它的--no-color/--nocolor类参数加上,从源头避免控制符生成。
方案2:用正则过滤器批量替换所有ANSI控制符
如果没法修改上游命令的输出,就用regex_replace配合map过滤器对每一行的控制符做全局替换,以下正则可以匹配绝大多数常见的ANSI颜色、光标控制序列:
- debug: msg: "{{ results.stdout_lines | map('regex_replace', '\\x1b\\[[0-9;]*[mGK]', '') | list }}"
方案3:直接提取状态值(仅需保留ACTIVE/DISABLED时使用)
如果不需要保留证书前缀内容,只需要状态值,可以直接用正则匹配提取目标字符串,完全不需要处理控制符:
- debug: msg: "{{ results.stdout_lines | map('regex_search', 'ACTIVE|DISABLED') | list }}"
内容的提问来源于stack exchange,提问作者Slashlinux
相关产品推荐
相关产品推荐

