巧用Salt,实现CMDB配置自动发现

随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)IT时代,信息化环境越来越复杂,既有IOE三层架构,也有VCE、Openstack等云虚拟化架构和互联网化的分布式大数据架构。所以,企业急需建立一套合适的配置管理库(CMDB),像人类“大脑”一样统一存储从基础架构到业务应用各层面的配置信息,以便协调“身体”(运维系统)各部分完成复杂的运维工作。
CMDB如此重要,但又是运维中最难建设好的部分,就连很多IT运维界大佬都感叹CMDB是运维人的最痛点,他们总结CMDB建设有3大难点,而保证配置数据的准确性更是难中之难。当前业界主要靠流程控制、人工维护和自动发现解决数据鲜活、准确的问题。流程控制和人工维护都脱不了人的参与,既然我们是人、不是“神”,就意味着会“偷懒”、会出错。在这个信息爆炸的大数据时代,再依靠人肉运维,我们已经伤不起。所以,要想数据准确,关键还是要靠自动发现。
今天,笔者就来谈一种配置信息的自动发现方案,望能解放运维人的双手和大脑,这样我们可以干一些更有意义的事,比如喝喝咖啡、陪陪家人。
一、采集工具的选型
要实现配置自动发现,需要有一个好用的基础采集工具(功若善其事、必先利其器嘛)。有些大佬可能会说:容易,自己写一个呗。但现在是互联网分享时代,前辈们已经踩过很多坑,并贡献出自己的心血,我们就不必要再重复造轮子了,大可以“拿来主义”,找一个最适合自己的开源工具来用。
谈到开源的自动化配置管理工具,就不得不说Puppet、Chef、Ansible和SaltStack这四驾马车。互联网上对这四款工具有很多详细的介绍和对比,这里不再详谈,主要说说我们选型的理由和结论。
首先,这四款工具的实现技术分两大派别:Ruby(Puppet、Chef)和Python(Ansible、SaltStack)。很多前辈都说过,要真正应用好一项开源技术,你必须要真正掌控它。所以技术类型的选择是至关重要的,Python号称是运维人的语言,其简洁统一、运行高效的特性更适合运维人使用。另外最重要的是Python有很多完善强大的OS、网络编程方面的第三方库,这些是Ruby无法比拟的。所以,从技术实现角度讲,Ansible和SaltStack这两个工具更适合我们运维人玩。
第二,Ansible和SaltStack两者最大的差别是代理技术的采用,当然SaltStack也可以通过salt-ssh命令实现类似Ansible的无代理执行能力,只是SaltStack的设计理念是通过执行代理(Minion)来实现高效和可扩展的配置管理体系。
总结下来,有代理和无代理对比优势主要有:
1) 无需保存账户密码等敏感信息,避免信息泄露,也便于管理员定期更换密码;
2) 可采集更丰富的配置信息和关联关系,比如可通过配置文件分析获取深层次配置信息;
3) 可快速感知配置变化,无代理模式只能定时轮询,增加了网络流量的消耗;
4) 可以实现快速的文件传输,比如可方便实现配置文件的收集。

通过以上分析对比,我们选择SaltStack作为配置自动采集的基础工具。
二、采集框架的搭建
SaltStack是一款强大的、集中化的配置自动化管理工具,它可以通过grains、pillar实现上千台服务器的配置自动收集和管理(关于SaltStack我就不普及了,大家自行问问谷哥或者度娘吧)。不过现在它只提供了比较好的命令行工具,当然官方也提供了一个名叫halite的简单WEB UI,只是这个WEB界面长得实在是挫了点,功能也有限,对不起SaltStack这个配置自动化管理“神器”的称号啊!
所以,我们的目标是利用SaltStack的框架和扩展能力来实现配置自动化采集,采集到数据后可以输送到配置管理库或者集中管理。整个采集框架逻辑设计如下图所示:

SaltStack从部署上包含Master和Minion两大部分。一个网络域内只需要部署一个Master实现集中发现调度和管理,Minion安装在各个被管主机上负责接收和执行脚本,并将采集结果反馈给Master。因为本文不是重点介绍SaltSatck,所以其安装部署就不介绍了,大家还是可以去问问无所不知的谷哥和度娘。
三、自动发现的实现
框架确定了,那么我们接下来的主要任务就是编写一个自动发现调度脚本(框架图中的“自动发现Discovery”),定时从Master收集数据并进行集中处理。
脚本用什么写?当然就选运维人专用语言Python了,其可与SaltStack天然集成,脚本的主要逻辑就是定时通过grains模块从Master获取配置信息并集中存储或推送给其他需要的系统。在命令行下,我们可以用:
salt '*' grains.items
或
salt '*' grains.item {key1} {key2} …
获取所有配置信息或者指定关键字名称的配置信息,比如下图获取Tomcat_8080配置信息:

各位亲可能会觉得奇怪,常规的grains.item {Key} 命令获取到的数据只有1项,但这里得到一个多属性的复杂对象。这是因为实际环境中在一个主机上会安装多个服务,也就是存在多个配置项,所以我们采用Python的字典类型(dict)来存储每个配置项的属性信息,这样只要通过一个Key就能获取到配置项的所有信息。
注:如何进行配置信息的发现采集,如何让grains按字典格式存储配置项的采集结果会在第五节“信息采集的扩展”里细说。
我们也可以通过:salt '*' grains.ls 获取有哪些Key:

既然我们用了强大的Python,在实际开发时就没必要再通过Shell去调用SaltStack的命令行了,直接用salt.client模块调用就可以获得一个字典类型(dict)的返回结果,Python字典类型可直接输出成JSON格式字符串,在对这个JSON串进行解析处理即可。
代码示意如下:
四、配置采集的扩展

有了配置自动采集框架后,我们需要的便是不断的添砖加瓦,也就是根据管理需求和配置模型不断扩展丰富SaltStack的grains采集脚本,并将脚本文件放在Salt Master的grains目录下(默认为/srv/salt/_grains),然后通过“salt '*' saltutil.sync_grains ”命令将脚本文件同步到所有Minion主机端就行。
我们以Tomcat服务的配置发现为例,收集安装路径、WEB服务端口、Tomcat版本信息、最大线程数等信息,脚本大致如下:

通过自定义采集脚本,某个Tomcat实例的配置信息发现如下:

是不是感觉如点读机一样so easy!其他更多配置信息的获取就留个各位亲去大展手脚了。当然,SaltStack的应用并不只是实现配置发现这么简单,大家可以深入挖掘,发挥其最大的潜力,实现双态IT下的自动化运维!
作者简介:庞辉富
•资深架构师
•10多年IT运维管理软件的研发经验
•致力于自动化运维解决方案的研究和推广
巧用Salt,实现CMDB配置自动发现的更多相关文章
- zabbix配置自动发现,故障邮件告警
对网段内的主机进行自动发现,自动加入主机组,自定加入template 创建动作时,类型这里选择discovery 然后将发现的主机加入host group和template: 动作针对的是discov ...
- 【转】outlook 2016 配置自动发现
今天一部门经理换了高大上的终端,办公软件安装的是office 2016,在配置outlook的时候,懵逼了,没有exchange 选项,使用自动发现配置的时候,电脑没有加域,各种尝试,一直过不去,哎, ...
- zabbix3.4.8配置自动发现主机并监控
一. 自动发现功能简介 Zabbix服务器端通过网络或者主机名等方式进行客户端的扫描发现,从进行加入到监控的主机队列中,适用于批量加入多主机监控的场景. 二. 自动发现功能实施 ...
- CentOS7下搭建zabbix监控(五)——Web端配置自动发现并注册
好像有点问题,没法自动添加主机,我后期再测测 (1).自动发现主机并注册 1)创建发现规则 2)编辑自动发现规则信息(这两步不配置问题也不大,因为在动作中也有主机IP地址) 3)添加自动发现的动作 4 ...
- zabbix自动发现与自动注册及SNMP监控
自动发现与自动注册 自动发现:zabbix Server主动发现所有客户端,然后将客户端登记自己的小本本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册:zabb ...
- Zabbix实战-简易教程--动作(Actions)--自动发现
一.概述 Zabbix提供了有效和非常灵活的网络自动发现功能. 设置网络发现后你可以: 加快Zabbix部署(自动添加主机.添加模板) 简化管理(自动删除主机.删除模板.禁用主机) 无需过多管理就能在 ...
- 【Zabbix】Zabbix Server自动发现
Zabbix自动发现 由于有上百台的虚拟机需要监控,如果一个个去添加配置,费时费力.Zabbix的自动发现,可以自动发现需要监控的机器,监控相应指标. 前置条件 安装部署好Zabbix Server. ...
- zabbix自动发现
zabbix3.4 Discovery自动发现教程 Zabbix 创建发现规则创建发现规则配置 ---- 自动发现 ---- 创建发现规则 看一个例子 这样发现规则就没有问题了,下面让主机自动加入到某 ...
- 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口
一.Zabbix-3.0.3批量添加主机的配置如下: 0)被监控机上要安装zabbix_agent,并配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_serve ...
随机推荐
- 【Java面试题】55 说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false. ...
- PHP必备知识:如何下载样式文件中的图片
<?php header("content-type:text/html;charset=utf-8"); set_time_limit(0); $styleImg = fi ...
- Eclipse导入android项目包xml报错未生成R文件
最近很是头痛的就是项目带回家做的时候.导入各种问题.自从升级23以后. 生成的带appcompat_v7包.copy时不论是新建还是导入这个包,项目都会报错. 网上的方法试了各种clean各种fix等 ...
- github前端资源
摘要: 本文将分享我在github上常用的一些插件,可能在开发中你会用到它,希望能够帮助你! 前端技术总结 url : https://github.com/JacksonTian/fks 简述: ...
- Mysql课后思考题
1.请简述数据库.表和数据库服务器之间的关系? 知识点数据库存储结构 一个数据库服务器可以管理多个数据库,通常情况下开发人员会针对每个应用创建一个数据库,为保存应用中实体的数据,会在数据库中创建多个表 ...
- window 后台执行 redis(隐藏窗口)
方法是在知乎上看的,链接:https://www.zhihu.com/question/22771030 实现方法是利用一个vbe脚本去运行一个bat脚本,在bat脚本里启动exe软件 PS:要想启动 ...
- 使用keytool生成密钥对
1.首先要用KeyTool工具来生成私匙库:(-alias别名 –validity 3650表示10年有效) keytool -genkey -alias privatekey -keystore p ...
- Oracle的闪回操作
Oracle10g中引入了闪回技术,但这并不意味着所有的表都能闪回成功,当没有足够的磁盘空间,Oracle将使用回收站中的磁盘空间,而且位图连接索引和引用完整性约束也不受回收站的保护. recycle ...
- 关于android定位的坐标系问题
按照正常的思路,我们通过GPS或者基站定位等方式获取到经纬度信息后,把它放到地图上,就能够完成定位.但实际上,我们很有可能会在实际操作中发现,我们的定位出现了较大的偏移.这是因为我国出于国家安全(或者 ...
- Android 使用CheckBox实现多选效果
CheckBox:复选框1.有两种状态: 选中状态(true),未选中状态(false)2.属性: android:id="@+id/checkbox" android:layou ...