CMDB和运维自动化
IT运维,指的是对已经搭建好的网络,软件,硬件进行维护。运维领域也是细分的,有硬件运维和软件运维
硬件运维主要包括对基础设施的运维,比如机房的设备,主机的硬盘,内存这些物理设备的维护
软件运维主要包括系统运维和应用运维,系统运维主要包括对OS,数据库,中间件的监控和维护,这些系统介于设备和应用之间,应用运维主要是对线上业务系统的运维
这里讨论的主要是软件运维的自动化,包括系统运维和应用运维的自动化
为什么需要运维自动化,运维自动化需要哪些工具,CMDB在运维自动化中的作用是怎样的呢 ?
一. 传统运维痛点
先来看一下传统运维的痛点
1.1 日常工作繁琐
日常运维工作是比较繁琐的,研发同学会经常需要到服务器上查日志,重启应用,或者是说今天上线某个产品,需要部署下环境。这些琐事是传统运维的大部分工作
1.2 应用运行环境不统一
在部署某应用后,应用不能访问,就会听到开发人员说,在我的环境运行很好的,怎么部署到测试环境后,就不能用了,因为各类环境的类库不统一
还有一种极端情况,运维人员习惯不同,可能凭自己的习惯来安装部署软件,每种服务器上运行软件的目录不统一
1.3 运维及部署效率低下
想想运维人员需要登陆到服务器上执行命令,部署程序,不仅效率很低,并且非常容易出现人为的错误,一旦手工出错,追溯问题将会非常不容易
1.4 无用报警信息过多
经常会收到很多报警信息,多数是无用的报警信息,造成运维人员经常屏蔽报警信
另外如果应用的访问速度出了问题,总是需要从系统、网络、应用、数据库等一步步的查找原因
1.5 资产管理和应用管理混乱
资产管理,服务管理经常记录在excel、文本文件或者wiki中,不便于管理,老员工因为比较熟,不注重这些文档的维护,只有靠每次有新员工入职时,资产才能够更正一次
二. 自动化运维平台应该有哪些特性
针对传统运维的痛点,我们可以知道自动化运维需要支持哪些功能
2.1 标准化一切
运维自动化最重要的就是标准化一切
- OS的选择统一化,同一个项目使用同样的OS系统部署其所需要的各类软件
- 软件安装标准化,例如JAVA虚拟机,php,nginx,mysql等各类应用需要的软件版本,安装目录,数据存放目录,日志存放目录等
- 应用包目录统一标准化,及应用命名标准化
- 启动脚本统一目录和名字,需要变化的部分通过参数传递
- 配置文件标准化,需要变化的部分通过参数传递
- 日志输出,日志目录,日志名字标准化
- 应用生成的数据要实现统一的目录存放
- 主机/虚拟机命名标准化,虚拟机管理使用标准化模板
- 使用docker比较容易实现软件运行环境的标准化
2.2 资产管理系统(CMDB)
CMDB是所有运维工具的数据基础
如果用开源工具(openstack,jenkins,ansible,saltstack,zabbix)来搭建自动化运维平台,如何将各个工具之间的数据统一起来就非常重要,如果这些工具的数据不统一记录,那么意味着每增加一台服务器,需要将这个服务器的数据在所有的工具系统中增加一遍,那么这些数据的统一就需要CMDB,那么如何获取和更新CMDB中的数据呢,API无疑是一种非常好的方法
另外现在越来越多的公司选择将自己的服务器迁移到云上,云其实就是虚拟化的一种高级应用,这些公有云(阿里云,腾讯云,aws等)、私有云(openstack,Vmware等)都拥有比较完备的资源管理的API,这些API也就是构建一个云服务器的CMDB的基础。自动化运维平台可以基于这些云平台的API来管理和维护服务器、存储、网络、负载均衡等资源。
通过API对资源的操作需要日志记录,以备后续操作审计。
2.3 集中化批量运维工具
当你维护的服务器从几台,到几十台,再到几百台,集中化运维就势在必行了。现在有不少开源的集中化批量运维工具,比如puppet、chef、ansible、saltstack。
我们主要使用ansible和saltstack,这两个系统都是python写的,而且现在大多数运维人员都有一定的python开发能力,这两个工具提供的API或者SDK来来实现更为复杂的功能
2.4 持续集成和部署工具
集成和部署工具,一般用jenkins的比较多,把打好的包发布至各台服务器,可以通过批量运维工具或者自定义脚本,软件应用从立项开始就需要定义好业务线,项目等,如果某个项目对,服务器的资源需求增多,只需要在对应的项目集群中增加对应的资源,这些需要和CMDB联系起来
软件发布包括文件的上传、分发、版本管理、回滚等各种操作,推荐使用SVN或者GIT对打包好的文件进行管理,然后通过脚本在各台服务器上进行发布操作,利用SVN或GIt来完成文件的上传、分发、版本管理、回滚等各种操作,这些操作对需要进行日志记录,需要在记录中来确保
另外使用docker镜像来进行持续交付会更加高效,因为docker镜像可以轻松解决环境依赖的问题
2.5 监控及应用性能分析工具
资源性能监控和应用性能监控,有很多重叠的地方,如CPU或者内存的使用率增高往往和应用的性能有关
常使用开源资源监控系统有Zabbix、Nagios,OpenFalcon,这些软件主要是服务器的资源性能监控(例如CPU,磁盘、网络、内存等)和服务软件的性能监控(例如JAVA虚拟机,中间件,数据库等)
APM关注于对应用程序内部及应用程序之间调用的性能分析,比如能精确定位到某应用的URL的访问速度快慢,SQL执行速度的快慢,这可以帮助开发和运维人员定位程序的应用性能瓶颈
2.6 日志集中分析工具
应用系统的问题定位方式,主要就是日志分析。但是随着业务和服务器的增长,日志的分析定位也会比较困难,系统一旦出故障,发生哪个应用,引用所在服务器以及应用的代码。日志集中分析和APM一起使用,同时可以根据CMDB中记录的应用服务相关信息,应用定位问题会更加高效。
2.7 安全漏洞扫描工具
安全漏洞更多的是安全工程师的来做,运维工程师更多是去解决这些漏洞,关于安全漏洞扫描如何与CMDB结合起来使用,可以使用提供API的漏洞扫描工具,针对CMDB中记录中对安全要求很高的应用来进行扫描。
三. 资源管理系统的功能
从上面可以知道,所有的运维工具都离不开CMDB的支持,那么CMDB应该有哪些数据,可以实现什么样的功能,如何确保CMDB的准确性 ?
3.1 CMDB管理什么数据
- 用户信息管理,记录测试,开发,运维人员的用户表
- 业务信息线管理,需要记录业务的详情
- 项目信息管理,指定此项目用属于哪条业务线,以及项目详情
- 应用信息管理,指定此应用的开发人员,属于哪个项目,和代码地址,部署目录,部署集群,依赖的应用,软件等信息
- 集群信息管理,指定集群属于哪个项目,以及集群的Level(开发,测试,生产)
- 主机信息管理,包括云主机,物理机,主机属于哪个集群,运行着哪些软件,主机管理员,连接哪些网络设备,云主机的资源池,存储等相关信息
- 主机信息变更管理,主机的一些信息变更,例如管理员,所属集群等信息更改,连接的网络变更等
- 网络设备信息管理,主要记录网络设备的详细信息,及网络设备连接的上级设备
- IP信息管理,IP属于哪个主机,哪个网段, 是否被占用等
数据库表如下图所示:
3.2 基于CMDB实现哪些功能
基于CMDB,可以实现采集资源信息自动化,软件安装自动化,应用部署自动化,告警信息更加详细准确,应用关系拓扑图,网络拓扑图更加清晰,这些工具对运维会有很高的价值
在公司业务层面上,基于CMDB我们也可以做很多事情,最直接的就是IT资源的成本控制,另外还有集群容量弹性缩扩容,应用平台的稳定性,应用的持续交付等功能
3.3 确保CMDB数据的准确性
CMDB存储管理企业IT架构中设备的配置信息,它是所有的应用运行和应用交付的提供相关的资源的数据基础,所以保证CMDB数据的准确性显得非常重要
想要确保CMDB的准确性,根据自己各个公司的业务不同,来制定CMDB数据的录入流程必不可少
我们如何确保CMDB的数据准确性,公司所有的IT应用(数据库除外)全部运行在VMware虚拟机中
- 硬件设备的资产管理,在采购服务器或者网络设备后,需要将相关的设备手工录入CMDB系统,并且指定连接的上级网络设备,负责人
- 服务器需要安装的VMware软件后,通过Vcenter来管理虚拟机
- 新项目确立,申请服务器资源时,需要填写业务线,开发人员,git库, 测试人员,应用依赖的相关环境等详细信息,CMDB系统会关联相关的数据
- 运维人员在分配IP,主机名等相关信息后,将开发,测试,生产等服务器记录入CMDB, 且关联相关的数据
- 创建虚拟机时使用标准的模板,自动化创建,初始化虚拟机,包括安装salt客户端,监控客户端
- 在准备开发环境时,编写salt SLS文件,存入git库,方便安装测试和生产环境
- 创建jenkins job,实现自动化部署及自动化打包的相关部分的定义
我们的CMDB还有哪些不足:
- 网络关系拓扑图没有在CMDB中显示
- 没有实现应用关系拓扑图,希望可以通过APM工具来完善
- 资源监控做的不够到位,造成资源浪费,以及Vcenter虚拟机分配不合理
- 没有实现应用集成部署流水线
- 系统告警后,没有自动化处理相关的事件,更多的是在用人工解决
- CMDB没有提供API,提供给别的系统调用