运维管理平台-任务处理

python 调用ansible api

Posted by chaoxiaodi on March 15, 2021

前言

如果看过前面文章的,应该了解我正在做一个运维管理平台

关于运维管理平台的设计以及想法完全都是再摸着石头过河

今天这篇文章主要写一下关于运维管理平台任务管理的一些想法

运维管理平台前传

其实关于运维管理平台建设的想法也已经好久了

但苦于自己技术实力以及工作太繁忙,一直在搁置中

市面上我觉得最好的管理平台就属 jumpserver

但jumpserver是成熟的面向大众的通用型的平台

总会因为各个公司的情况不同,造成可能不太适用的情况

下面是我的一些个人想法,并不一定对;

1
2
3
4
5
6
7
8
9
首先要做运维平台就要有标准,有规范

比如:管理端口、机器命名、ip段、目录结构、基础环境等等

有了标准和规范后可以尝试做cmdb

这也是我现在完成到这个阶段,已经完成cmdb的功能

接下来就是任务管理平台或叫工作流管理平台 无所谓啦

关于任务管理平台的几个想法与最终选择

第一个是使用 python + paramiko 来实现

paramiko 库是python一个关于SSH的库,可以用来模拟SSH客户端的各种行为

现在大部分python做webssh的都是用的这个做连接

这个想法是当我开始有建设运维管理平台的想法时,第一个冒出来的想法

1
2
3
封装一个ssh功能的类

然后把任务管理平台需要执行的任务通过程序调用这个类去执行对应任务,并处理结果

第二个想法是来到一家游戏公司后开始产生的

游戏公司的业务与传统互联网业务又有所不同

业务是要划分项目划分地域的,基本每个游戏每个地域都要有一台单独的管理机

所以这个想法有些可能不太通用,更像为这个公司定制的一个方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
每台管理机有自己对应的一套运维脚本
如:开启游戏,关闭游戏,维护游戏,更新游戏,备份游戏库等等

所以这个方案的想法是 做一个任务处理server,一个任务处理client

server对接cmdb平台,从平台中获取要处理任务或者说是要执行的动作

然后server把任务提交到 队列,队列我用了rabbitmq 

插一句,这个方案我是试验过,做个小测试可行的;

可以认为server并不执行具体任务与脚本或者任何命令
只是一个任务调度管理平台

client的功能有两个
1、上报自己支持的动作到cmdb
如:开服脚本的执行方式以及路径等;
2、监听rabbitmq关于自己的消息,然后进行处理并发送结果到队列由server接收

这部分代码由于某些原因还不能公开,等后面有合适的机会会公开,并尝试写一篇单独的文章

第三个方案是使用python 调用 ansible的api

相比较上面的两种方式,这种方式更加的全面与合理

第一个方案只支持ssh无法管理windows机器

第二个方案说实话我对自己的代码能力不太认可,后面想要实现大批量任务管理的时候可能会比较麻烦

由于项目中有涉及到windows管理的机器,也在用ansible,并且稳定性还可以

所以最后选择此方法

github-pyansibleapi

具体的使用方式可以查看项目的README

ansible 是通过 python写的,官方文档给的一个api的例子,说实话,刚开始我是没看懂的

还是得靠国内大神美化后才能理解

1
2
3
4
5
6
7
8
9
10
11
12
代码封装了一个ansibleapi的类
通过引用这个类并传递对应的参数
可以利用ansible成熟的能力进行任务的管理

有了这个类之后
结合cmdb的能力;可以把想要执行的命令或脚本通过封装后
调用这个类来进行任务的执行
然后自行处理返回结果

项目中有对应的测试案例以及结果返回的结构

也欢迎各位进行测试反馈

后记

前文也提到了对于开发这个运维管理平台我也是摸着石头过河

好多想法和实现方法可能是一些最笨最低效率的实现

希望各位大佬如果有意见或建议欢迎讨论

Q:594934249

—我是超小弟·一名不误专业的秃头运维—

博客:blog.chaoxiaodi.tech

github:github:chaoxiaodi

微信公众号:老骥不伏枥只是近黄昏