发布网友 发布时间:2022-04-23 20:23
共3个回答
懂视网 时间:2022-04-10 03:06
随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)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配置自动发现
标签:数据架构 采集 无法 服务器 大致 并集 json格式 传输 复杂
热心网友 时间:2022-04-10 00:14
怎样定义Pillar数据?
master配置文件中定义
默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。如果要禁用这一默认值,可以在master配置文件中添加如下数据,重启服务后生效:
pillar_opts: False
使用SLS文件定义Pillar
Pillar使用与State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定义的目录下。示例如下:
pillar_roots:
base:
- /srv/pillar
这段代码定义了base环境下的Pillar文件保存在/srv/pillar/目录下。与State相似,Pillar也有top file,也使用相同的匹配方式将数据应用到minion上。示例如下:
/srv/pillar/top.sls:
base:
'*':
- data
- packages
/srv/pillar/packages.sls:
{% if grains['os'] == 'RedHat' %}
apache: httpd
git: git
{% elif grains['os'] == 'Debian' %}
apache: apache2
git: git-core
{% endif %}
/srv/pillar/data/init.sls:
role: DB_master
这段代码表示,base环境中所有的minion都具有packages和data中定义的数据。Pillar采用与file server相同的文件映射方式,在本例中,packages映射到文件/srv/pillar/packages.sls,data映射到/srv/pillar/data/init.sls。注意key与value要用冒号加空格分隔,没有空格的话将解析失败。
Pillar还可以使用其他的匹配方式来选择minion,下面的例子中,servers只应用到操作系统是Den的机器:
dev:
'os:Debian':
- match: grain
- servers
如何知道minion拥有哪些Pillar数据?
使用执行模块pillar。pillar模块有两个funtion:pillar.data和pillar.raw。示例如下:
# salt '*' pillar.data
在master上修改Pilla文件后,需要用以下命令刷新minion上的数据:
salt '*' saltutil.refresh_pillar
如果定义好的pillar不生效,建议刷新一下试试。
Pillar中数据如何使用?
Pillar解析后是dict对象,直接使用Python语法,可以用索引(pillar['pkgs']['apache'])或get方法(pillar.get('users', {}))。详见下面的例子。
示例
targeting
使用-I选项表示使用Pillar来匹配minion.
salt -I 'role:DB*' test.ping
在Pillar中使用列表
Pillar的key/value结构中的value可以是string,也可以是一个list。Pillar文件定义如下:
/srv/pillar/users/init.sls:
users:
thatch: 1000
shouse: 1001
utahdave: 1002
redbeard: 1003
在top.sls中引用Pillar文件,对所有的minion应用users中的内容:
/srv/pillar/top.sls:
base:
'*':
- data
- users
现在所有的minion都具有了users数据,可以在state文件中使用:
/srv/salt/users/init.sls:
{% for user, uid in pillar.get('users', {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
利用Pillar处理平台差异
不同的操作系统不仅管理资源的方式不同,软件包的名字、配置文件的路径也有有可能不一样。Salt的执行模块屏蔽了系统管理资源的差异。其他的差异可以根据grains中的的os、cpuarch等信息来处理,这些条件判断可以写在State文件中,但会使得State文件的逻辑不清晰。Pillar可以很好地解决这个问题。下面的例子中,在不同的os上安装对应的软件包,但state file完全一样,不需要针对os作修改,灵活方便。
/srv/pillar/pkg/init.sls:
pkgs:
{% if grains['os_family'] == 'RedHat' %}
apache: httpd
vim: vim-enhanced
{% elif grains['os_family'] == 'Debian' %}
apache: apache2
vim: vim
{% elif grains['os'] == 'Arch' %}
apache: apache
vim: vim
{% endif %}
/srv/pillar/top.sls:
base:
'*':
- data
- users
- pkg
/srv/salt/apache/init.sls:
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
还可以在state file中设置默认值: srv/salt/apache/init.sls:
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
热心网友 时间:2022-04-10 01:32
salt 英[sɔ:lt] 美[sɔlt]
n. 盐; 风趣; 机智,讽刺; 药用盐,泻盐;
vt. 撒盐; 用盐渍; 加盐以调味; 为…增加趣味;
adj. 含盐的; 有咸味的; 盐渍的;
[网络] 盐值; 语音应用语言标记; 塩;
[例句]Season lightly with salt and pepper.
略微加点盐和胡椒调味。
[其他] 第三人称单数:salts 现在分词:salting 过去式:salted 过去分词:salted
双语例句 柯林斯词典 英英释义 百度百科
相关单词:
SALT abbr. *战略武器会谈
Salt [词典] [人名] [英格兰人姓氏]索尔特 Salter的变体,或住所名称,盐井所在地
pillar 英[ˈpɪlə(r)] 美[ˈpɪlɚ]
n. 柱,台柱,顶梁柱; 墩,柱脚; (组织、制度、信仰等的) 核心;
[网络] 柱体; 柱状; 中流砥柱;
[例句]The pillar of her economic policy was keeping tight control over money supply.
她经济*的核心是严格控制货币的供应。
[其他] 复数:pillars 形近词: gillar piller dillar
双语例句 柯林斯词典 英英释义 百度百科
相关单词:
Pillar [词典] [人名]皮勒