首页 > 其他分享 >ansible彩色输出转换为html格式

ansible彩色输出转换为html格式

时间:2022-12-02 20:33:21浏览次数:63  
标签:输出 x1b ansible replace html 使用 格式 运行

实现目标:

将在后台运行(非tty终端环境)的ansible输出结果作为日志转换为html在浏览器显示:

技术背景:

我司使用的运维平台,使用flask框架搭建。对各个操控主机使用ansible进行操作,采用ansible_runner调用ansible

使用方式有两种:

  1. 运维人员使用flask cli方式在终端操作。
  2. 业务人员使用web页面在浏览器操作。

以上两种方式最大的区别就是ansible的运行环境:

  • 在linux终端上操作,可以直接看到ansible的输出。
  • 浏览器上是无法直接将ansible运行结果展示给用户的,首先要将在后台运行的ansible输出内容捕获然后交给浏览器渲染。

要解决的问题:

  • 捕获后台运行ansible的输出内容。
  • 色彩信息转换。
  • 后台运行ansible无彩色输出问题。

处理流程:

ansible_runner是一个稳定抽象的Python语言ansible接口,他的操作、参数、结果在不同版本的ansible下保持一致。

为了获取ansible的运行输出结果可以查看其源码可知,ansible_runner的Runner类有两个方法 stdout和 stderr:

ansible彩色输出转换为html格式_ansible_runner

这两个方法可以获取写有ansible的标准输出stdout和错误输出stderr的文件句柄。

通过获取文件句柄,就可以将ansible的输出内容写入到我们自己的所需要的文件中,以方便后续的查看。

在调试这部分内容的时候,一直使用的是命令行形式进行处理,所得到的文件内容通过cat方式可以直接输出彩色文职与格式,通过vim打开可以得到如下格式:

ansible彩色输出转换为html格式_ansible_runner_02

如果熟悉使用'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​

ansible彩色输出转换为html格式_flask_03

文档支出,在默认环境下,非TTY终端或‘nocolor’配置为真的情况下,ansible是不会输出彩色文字的。要修改这个配置可以通过修改ansible配置文件,或者系统环境变量来完成。在这里我选择了对系统原有配置较少的方案,通过修改环境变量来处理,而非修改ansible的配置文件。

运维平台使用flask框架,使用supervisord进行管理,在supervisord的配置文件中可以使用environment来制定运行环境的环境变量。只要在supervisord的配置中添加如下一行即可。

environment=ANSIBLE_FORCE_COLOR=True

完成以上操作就完成了最初的目标。


标签:输出,x1b,ansible,replace,html,使用,格式,运行
From: https://blog.51cto.com/quietguoguo/5907434

相关文章

  • vmware workstation SCSI磁盘格式虚拟机迁移到KVM之后无法启动的问题解决办法
    原文链接:https://blog.51cto.com/duron/2125821转换磁盘镜像格式之后导入KVM系统无法启动,但是可以进入恢复模式,可能是virtio的内核模块没有加载,把磁盘改为IDE模式后正常......
  • 分享45款高质量的免费(X)HTML/CSS模板
    ​​GreenPlanet​​(​​演示​​​|​​下载​​)​​​​​​CreativeStudio​​(​​演示​​​|​​下载​​)​​​​​​RestaurantWebsite​​(​​演示......
  • 你应该知道的10个奇特的 HTML5 单页网站
    网页设计师努力寻找新的方式来展现内容。其中一个大的趋势是单页网站,现在被世界上的一些大的品牌广泛采用,使用它们来为用户提供一个快速,干净和简单的而且美丽的网站。 ​​......
  • html5文件分片上传,断点续传
    ​ 1、介绍enctypeenctype 属性规定发送到服务器之前应该如何对表单数据进行编码。enctype作用是告知服务器请求正文的MIME类型(请求消息头content-type的作用一样)1、......
  • vscode的php代码格式化及相关配置
    在vscode的Extensions模块搜索PHPIntelephense,PHPServer,Prettier,LaravelBladeformatter,LaravelBladeSnippets并安装打开settings.json添加以下内容{......
  • vscode的python3代码格式化问题
    #安装python插件在vscode的Extensions模块中搜索python 安装python扩展打开settings设置,搜索python.linting.enabled设置python.linting.enabled为true搜索pyt......
  • tif文件拼接+转换成netcdf格式
     2022-11-1611:33 手上有若干个SRTM1V3.0的高程数据,为HGT格式,需要将其拼接并转换成netcdf格式,以让ncl能够进行读取步骤:gdal_translateA.hgtA.tifgdal_merge.py......
  • 645仪表以JSON格式上发方法
    1.概述之前我们已经介绍了ModbusRTU仪表实现JSON格式上发云服务器的方法,类似的现在也可以支持645协议的仪表通过JSON格式上发服务器。卓岚实现645仪表转JSON网关的特点......
  • 不同数据格式 一般按照后端的要求来写数据格式
    不同数据格式 一般按照后端的要求来写数据格式1.formData用newdata使用FormData包裹2.application/json会自动映射3.application/x-www-form-urlencodedurl......
  • 使用HTTPCLIENT去生成静态HTML页面
    一般生成HTML页时,都会用比如freemarker等去搞,但今天看到和学到一个还应该不错的方法,是使用httpclient的get方法,去读某个动态的URL,然后把读出的内容再......