实现目标:
将在后台运行(非tty终端环境)的ansible输出结果作为日志转换为html在浏览器显示:
技术背景:
我司使用的运维平台,使用flask框架搭建。对各个操控主机使用ansible进行操作,采用ansible_runner调用ansible
使用方式有两种:
- 运维人员使用flask cli方式在终端操作。
- 业务人员使用web页面在浏览器操作。
以上两种方式最大的区别就是ansible的运行环境:
- 在linux终端上操作,可以直接看到ansible的输出。
- 浏览器上是无法直接将ansible运行结果展示给用户的,首先要将在后台运行的ansible输出内容捕获然后交给浏览器渲染。
要解决的问题:
- 捕获后台运行ansible的输出内容。
- 色彩信息转换。
- 后台运行ansible无彩色输出问题。
处理流程:
ansible_runner是一个稳定抽象的Python语言ansible接口,他的操作、参数、结果在不同版本的ansible下保持一致。
为了获取ansible的运行输出结果可以查看其源码可知,ansible_runner的Runner类有两个方法 stdout和 stderr:
这两个方法可以获取写有ansible的标准输出stdout和错误输出stderr的文件句柄。
通过获取文件句柄,就可以将ansible的输出内容写入到我们自己的所需要的文件中,以方便后续的查看。
在调试这部分内容的时候,一直使用的是命令行形式进行处理,所得到的文件内容通过cat方式可以直接输出彩色文职与格式,通过vim打开可以得到如下格式:
如果熟悉使用'echo -e'命令在终端输出彩色文字,那么对红框圈了起来的 ^[[0;33m 应该会十分熟悉,这其实是转义字符esc。倘若直接将其发送给浏览器,那么不仅没有彩色输出,也会把这些看起来无意义的符号显示出来。为了解决这个问题,我这里使用了一个比较简单粗暴的方式来处理。就是用Python的replace来将这些转义字符进行替换。
首先写一个颜色与css代码的对应列表
# bash颜色 与 颜色替换表
replace_color = (['\x1b[1;31m', '<span style="color:red">'],
['\x1b[1;32m', '<span style="color:green">'],
['\x1b[0;33m', '<span style="color:gold">'],
['\x1b[1;34m', '<span style="color:blue">'],
['\x1b[1;35m', '<span style="color:purple">'],
['\x1b[0;31m', '<span style="color:red">'],
['\x1b[0;32m', '<span style="color:green">'],
['\x1b[1;33m', '<span style="color:gold">'],
['\x1b[0;34m', '<span style="color:blue">'],
['\x1b[0;35m', '<span style="color:purple">'],
)
# 结束符
replace_end = ['\x1b[0m', '</span>']
然后对原始文本进行替换。要注意替换顺序,先替换空格,再替换回车,最后使用循环方式替换转义字符。
以下代码中的字符串i得到就是包含色彩信息的css代码,使用模板或者直接传递给前端等方式就可以渲染出有颜色的html页面。
f = open(log_file_path, 'r')
i = f.read()
i = i.replace(' ', " ")
i = i.replace('\n', '<br>')
for j in replace_color:
i = i.replace(j[0], j[1])
i = i.replace(replace_end[0], replace_end[1])
注意,以上的操作都是在命令行终端下执行的。
如果是在后台(非tty终端)下运行,ansible的stdout日志将不含有包含颜色输出的转义字符。这是由于在后台模式运行,ansible会关闭彩色字符输出。此部分说明可以参考官方文档:
https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-force-color
文档支出,在默认环境下,非TTY终端或‘nocolor’配置为真的情况下,ansible是不会输出彩色文字的。要修改这个配置可以通过修改ansible配置文件,或者系统环境变量来完成。在这里我选择了对系统原有配置较少的方案,通过修改环境变量来处理,而非修改ansible的配置文件。
运维平台使用flask框架,使用supervisord进行管理,在supervisord的配置文件中可以使用environment来制定运行环境的环境变量。只要在supervisord的配置中添加如下一行即可。
environment=ANSIBLE_FORCE_COLOR=True
完成以上操作就完成了最初的目标。