优云实践:巧用Salt,实现CMDB配置自动发现

banner.jpg

随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)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)    可以实现快速的文件传输,比如可方便实现配置文件的收集。

1.jpg

通过以上分析对比,我们选择SaltStack作为配置自动采集的基础工具。

二、采集框架的搭建

SaltStack是一款强大的、集中化的配置自动化管理工具,它可以通过grains、pillar实现上千台服务器的配置自动收集和管理(关于SaltStack我就不普及了,大家自行问问谷哥或者度娘吧)。不过现在它只提供了比较好的命令行工具,当然官方也提供了一个名叫halite的简单WEB UI,只是这个WEB界面长得实在是挫了点,功能也有限,对不起SaltStack这个配置自动化管理“神器”的称号啊!

所以,我们的目标是利用SaltStack的框架和扩展能力来实现配置自动化采集,采集到数据后可以输送到配置管理库或者集中管理。整个采集框架逻辑设计如下图所示:

2.jpg

SaltStack从部署上包含Master和Minion两大部分。一个网络域内只需要部署一个Master实现集中发现调度和管理,Minion安装在各个被管主机上负责接收和执行脚本,并将采集结果反馈给Master。因为本文不是重点介绍SaltSatck,所以其安装部署就不介绍了,大家还是可以去问问无所不知的谷哥和度娘。

三、自动发现的实现

框架确定了,那么我们接下来的主要任务就是编写一个自动发现调度脚本(框架图中的“自动发现Discovery”),定时从Master收集数据并进行集中处理。

脚本用什么写?当然就选运维人专用语言Python了,其可与SaltStack天然集成,脚本的主要逻辑就是定时通过grains模块从Master获取配置信息并集中存储或推送给其他需要的系统。在命令行下,我们可以用:

salt '*' grains.items

salt '*' grains.item {key1} {key2} …

获取所有配置信息或者指定关键字名称的配置信息,比如下图获取Tomcat_8080配置信息:

3.jpg

各位亲可能会觉得奇怪,常规的grains.item {Key} 命令获取到的数据只有1项,但这里得到一个多属性的复杂对象。这是因为实际环境中在一个主机上会安装多个服务,也就是存在多个配置项,所以我们采用Python的字典类型(dict)来存储每个配置项的属性信息,这样只要通过一个Key就能获取到配置项的所有信息。

注:如何进行配置信息的发现采集,如何让grains按字典格式存储配置项的采集结果会在第五节“信息采集的扩展”里细说。

我们也可以通过:salt '*' grains.ls 获取有哪些Key:

4.jpg

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

代码示意如下:

5.jpg

四、配置采集的扩展

有了配置自动采集框架后,我们需要的便是不断的添砖加瓦,也就是根据管理需求和配置模型不断扩展丰富SaltStack的grains采集脚本,并将脚本文件放在Salt Master的grains目录下(默认为/srv/salt/_grains),然后通过“salt '*' saltutil.sync_grains ”命令将脚本文件同步到所有Minion主机端就行。

我们以Tomcat服务的配置发现为例,收集安装路径、WEB服务端口、Tomcat版本信息、最大线程数等信息,脚本大致如下:

6.jpg

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

7.jpg

是不是感觉如点读机一样so easy!其他更多配置信息的获取就留个各位亲去大展手脚了。当然,SaltStack的应用并不只是实现配置发现这么简单,大家可以深入挖掘,发挥其最大的潜力,实现双态IT下的自动化运维!

作者简介:庞辉富

优云软件 (全栈运维服务平台:https://uyun.cn) 资深架构师

•10多年IT运维管理软件的研发经验

•致力于自动化运维解决方案的研究和推广

更多运维技术文章请关注优云官方微信(broada_ops)

原创文章,作者:uyunops,如若转载,请注明出处:http://www.178linux.com/25995

(0)
uyunopsuyunops
上一篇 2016-07-26
下一篇 2016-07-26

相关推荐

  • 关于 LVM 逻辑卷管理

                  逻辑卷管理 (LVM)    允许对卷进行方便操作的抽象层,包括从新设定文件系统的大小   允许在多个设备间重新组织文件系统将设备指定为物理卷用一个或者多个物理卷来创建一个卷组物理卷是用固定大小的物理区…

    系统运维 2016-09-02
  • 小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复

    故事背景:前面大胆的选择了innodb,接下来就要考虑数据库的备份和恢复。俗话说“常在河边走,哪能不湿鞋“,自从接触数据这块,使我一直对它保持敬畏之心。在这里使用了percona公司的xtrabckup工具来实现数据库备份和恢复。操作步骤记录如下: 1、安装软件仓库(不要问我为什么不用源码安装,好吧,其实我懒。) wget https://www.…

    数据库运维 2015-12-19
  • WEB 常见故障与处理

    一、应用故障 HTTP 502 故障 502 Bad Gateway 故障检测: 首先定位到前端故障服务器节点,在前端服务器(Telnet)上访问后端服务端口响应时间。如发现响应时间超时>10s。说明后端应用程序出现故障。需要到后端服务器查看,并查明情况。 PS:HTTP 502 Bad Gateway 故障一般分为以下2种情况: 网络问题:前端无法连…

    2016-06-03
  • Centos 7 快速进入图形界面

    Centos 7 快速进入图形界面.pdf

    系统运维 2016-04-05
  • 关于文件权限管理了解和使用

                    文件权限管理   文件属性格式              文件属性操作 chown          设置文件的所有者…

    系统运维 2016-08-05
  • mysql or条件可以使用索引而避免全表

    在某些情况下,or条件可以避免全表扫描的。 1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行。 1)myisam表:  CREATE TABLE IF NOT EXISTS `a` (   `id` int(1)&nb…

    Linux干货 2015-04-13