Grains

本章节参考《SaltStack技术入门与实践》,感谢该书作者: 刘继伟、沈灿、赵舜东

  前几章我们已经了解SaltStack各个组件以及通过一个案例去熟悉它的各种应用,从这章开始我们通过Python语言去扩展SaltStack组件。虽然SaltStack自带的各种组件在功能上已经很成熟了,但是有时候无法满足企业各种复杂的环境。本章的主要内容就是如何去扩展SaltStack各个组件。

一、查看Grains相关的命令及用法

[root@saltmaster ~]# salt 'irora200' sys.list_functions grains
www.361way.com:
- grains.append
- grains.delval
- grains.fetch
- grains.filter_by
- grains.get
- grains.get_or_set_hash
- grains.has_value
- grains.item
- grains.items
- grains.ls
- grains.remove
- grains.set
- grains.setval
- grains.setvals

  每个命令的帮助信息又可以通过sys.doc查看,如下:

[root@saltmaster ~]# salt 'irora200' sys.doc grains

二、获取主机item信息

2.1、查看可以获取的items项

[root@saltmaster ~]# salt 'irora200' grains.ls
www.361way.com:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- disks
- dns
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gid
- gpus
- groupname
………………省略

2.2、查看所有的itmes项

[root@saltmaster ~]# salt 'irora200' grains.items
www.361way.com:
----------
SSDs:
biosreleasedate:
01/01/2011
biosversion:
0.5.1
cpu_flags:
- fpu
- de
- pse
……… 省略
cpu_model:
Intel Xeon E312xx (Sandy Bridge)
cpuarch:
x86_64
……… 省略

  这里的输出是上面grains.ls 一一对应,输出结果较上面更详细。

2.3、查看某项或多项item值

[root@saltmaster ~]# salt 'irora200' grains.item ipv4
www.361way.com:
----------
ipv4:
- 10.211.1.10
- 127.0.0.1
- 192.168.0.222
# 一次查看多项
[root@saltmaster ~]# salt 'irora200' grains.item os osrelease osfinger
www.361way.com:
----------
os:
RedHat
osfinger:
Red Hat Enterprise Linux Server-6
osrelease:
6.6

  默认定义好的Granis 的取值可以参看salt grains core.py文件

三、自定义Grains

  三种自定义Grains的方法,这里一一说明下:

  1. 通过Minion配置文件配置
  2. 通过Grains模块定义Grains
  3. 使用自定义python脚本获取grains信息

3.1、通过Minion配置文件配置

  在Minion端我们可以通过查看/etc/salt/minion配置文件中,查找grains可以查看到相关注释的示例。不过便于配置管理,我们不一般不会选择在该文件上进行修改,而在minion include的目录下/etc/salt/minion.d目录下单独创建grains.conf文件。就以官方给出的示例,将minion配置文件中配置示例复到/etc/salt/minion.d/grains.conf中,并将注释去掉,如下:

[root@361way.com ~]# cat /etc/salt/minion.d/grains.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15

  配置增加完成后重启salt-minion服务生效。通过saltmaster端查看结果如下:

[root@saltmaster ~]# salt 'irora200' grains.item roles
www.361way.com:
----------
roles:
- webserver
- memcache

  这里有两点一定需要注意:1、grains.conf 里的配置需要是YAML格式;2、配置修改后需要重启salt-minion服务才能生效。

3.2、通过Grains模块定义Grains

  上面使用list_functions 列出所有的函数时,对应的是有grains.append、grains.setval等方法,这里就是利用该方法进行的操作。示例如下:

[root@saltmaster ~]# salt 'irora200' grains.append hosttype 'online'
irora200:
----------
hosttype:
- online
[root@saltmaster ~]# salt 'irora200' grains.item hosttype
irora200:
----------
hosttype:
- online
[root@saltmaster ~]# salt 'irora200' grains.setvals "{'idc':'ZJ','city':'hangzhou'}"
irora200:
----------
city:
hangzhou
idc:
ZJ
[root@saltmaster ~]# salt 'irora200' grains.item idc city
irora200:
----------
city:
hangzhou
idc:
ZJ

  这样配置后,会在minion主机端生成配置文件grains ,如下:

[root@irora200 salt]# cat /etc/salt/grains
city: hangzhou
hosttype:
- online
idc: ZJ

  如下图所示,我们做了一个实验,如果/etc/salt/minion.d/grains.conf中已经存在的自定义items ,再通过执行grains.append 或 grains.setval 去执行时,发现会以grains.conf中的为准,虽然在/etc/salt/grains中也有内容生成。而且执行grains.append操作后,/etc/salt/minion.d/grains.conf中已存在的值会覆盖/etc/salt/grains中的重复值。即下例中deployment的值在/etc/salt/grains中的变化为datacenter1(setval操作后) --datacenter4(append操作后,并没有变成datacenter5)。

  所以会上例中不难看出,/etc/salt/minion.d/grains.conf (或/etc/salt/minion)  > /etc/salt/grains配置中的优先级。

  注:该处也适用通过分发文件到minion的/etc/salt/grains ,不过分发文件和命令执行的区别是,分发文件必须要minion端重启salt-minion服务后才能生效。而通过grains 命令执行是立即生效的。

四、扩展Grains

  在前面我们已经了解了Grains组件的相关知识,在SaltStack案例章节中也了解了如何去使用它。虽然Grains呢个收集得到minion的各种静态信息,但是为了满足更加复杂应用,系统Grains能根据我们的需求去采集一些信息,例如在大批量机器中我们区分每台机器的业务角色,这个时候我们就可以自定义一个Grains,让Minion通过外部数据(CMDB)去采集自己的业务汇报给Master。在大规模的配置中我们就可以利用这个Grains去更加方便地管理配置各个角色的设备。

4.1、理解扩展Grains流程

  首先我们了解扩展Grains流程。第1步,我们需要在Master上编写一个Python脚本。这个脚本的主要内容就是去定义如何收集你想要的信息。在脚本的最后把采集到的各种信息返回。第2步,需要把这个脚本sync同步到所有的Minions上。如果你采用前面章节使用的静态文件Grains同步方式,接下来我们重启Minions服务。因为sync同步Griains脚本的时候Minion就会去采集刷新Grains。所以我们这里就不需要重启Minions服务就可以收集到最新的Grains值了。

下面我们来看一个例子:

[root@salt-master-1 ~]# cat /srv/salt/_grains/example.py
#!/usr/bin/env python
def grains():
local = {}
test = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }
local['list'] = [1,2,3,4]
local['string'] = 'str'
local['dict'] = test
return local

  下面我们把这个脚本同步到minion上去:

[root@salt-master-1 salt]# salt 'salt-minion-1' saltutil.sync_grains

  然后我们可以去Minion上查看这个脚本,这个脚本会同步到Minion配置文件里面定义的cachedir目录extmods/grains下:

[root@salt-master-1 salt]# salt 'salt-minion-1' cmd.run 'ls /var/cache/salt/minion/extmods/grains/'

  如果你想在Master上查看使用脚本定义的Grains信息,可以通过如下命令:

[root@salt-master-1 salt]# salt 'salt-minion-1' grains.item list string dict

4.2、扩展Grains案例

  下面我们通过一个我曾经在实际工作中使用的自定义Grains案例吧。下面案例的内容可能对大家工作中没多大影响。这里引入这个案例只是为了大家能更好低理解扩展Grains的流程:

cat /srv/salt/_grains/get_time.py
#!/usr/bin/python
#coding: utf-8
from datetime import datetime
def get_server_time():
grains = {}
grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return grains
# 使用sync_grains命令同步脚本到minion主机上去
salt '*' saltutil.sync_grains
salt '*' grains.item server_time

  执行同步命令后,自定义脚本会上传到minion的/var/cache/salt/minion/extmods/grains目录下。

五、总结

  1. grains组件在saltstack中是一个非常重要的组件,我们执行的时候主机的正则匹配,主机端信息的获取等都会用到该组件 。不过grains也有自身的局限性,就是主要存储静态数据,后面还会提到另一个组件pillar ,两者可以做一个很好的互补;
  2. 能过了解grains三个自定义方式的优化级配置,我们可以根据需要定义在哪一个文件中指定什么信息;
  3. 在/srv/salt/_grains目录下的自定义脚本,在执行完成后,强烈建议移到一个bak目录下。使该目录下是没有文件,并且再执行一次salt '*' saltutil.sync_grains操作。使minion主机上自定义模块目录是干净的,这样做的好处是可以避免和另外两个文件有配置冲突,也避免脚本之间有重复的名字定义,造成取回的结果不对。

《SaltStack技术入门与实践》—— Grains的更多相关文章

  1. 《SaltStack技术入门与实践》—— Mine

    Mine 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Mine是SaltStack收集Minion数据存储到Master的一个组件,它的功能与Gr ...

  2. 《SaltStack技术入门与实践》—— Renderer组件

    Renderer组件 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 前面我们已经提过使用Python语言编写state.sls文件.在SaltSta ...

  3. 《SaltStack技术入门与实践》—— 实践案例 <中小型Web架构>3 Memcached配置管理

    实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Me ...

  4. 《SaltStack技术入门与实践》—— Peer

    Peer 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Peer组件是SaltStack中Minion向Master发布任务的一个组件,使用Peer ...

  5. 《SaltStack技术入门与实践》—— Event和Reactor系统

    Event和Reactor系统 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Event是SaltStack里面的对每个事件的一个记录,它相比job ...

  6. 《SaltStack技术入门与实践》—— Job管理

    Job管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 在SaltStack里面执行任何一个操作都会在Master上产生一个jid号.Minion ...

  7. 《SaltStack技术入门与实践》——执行结果处理

    执行结果处理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Return组件可以理解为SaltStack系统对执行Minion返回后的数据进行存储或 ...

  8. saltstack技术入门与实践

    基本原理 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信. minio ...

  9. 读书笔记---《Docker 技术入门与实践》---为镜像添加SSH服务

    之前说到可以通过attach和exec两个命令登陆容器,但是如果遇到需要远程通过ssh登陆容器的场景,就需要手动添加ssh服务. 下面介绍两种方法创建带有ssh服务的镜像,commit命令创建和通过D ...

随机推荐

  1. 【ABAP系列】SAP ABAP OOALV 动态设置单元格可否编辑

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP OOALV 动 ...

  2. mariadb数据库基础

    1.数据库介绍 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据 ...

  3. python基础语法之集合set

    1 概念 集合是一个无需的,不重复的数组组合,它的主要作用如下: 去重,将一个列表装换成集合,会将其去重 关系测试,测试两组数据的交集,差集,并集等关系. 集合对象是一组无需排列的可哈希的值,集合成员 ...

  4. [开发技巧]·Python实现信号滤波(基于scipy)

    [开发技巧]·Python实现信号滤波(基于scipy) 个人网站--> http://www.yansongsong.cn GitHub主页--> https://github.com/ ...

  5. 应用安全 - 免杀 - 工具 - the-backdoor-factory - 使用|命令 - 汇总

    安装 Kali下方式一: git clone https://github.com/secretsquirrel/the-backdoor-factory方式二: apt-get install ba ...

  6. 1.LTE系统概述

    信息源:中国大学MOOC 中搜索 移动通信网络与优化 兰州交通大学 3GPP协议:https://www.3gpp.org/DynaReport/36-series.htm 可以在中国大学MOOC中搜 ...

  7. mysql——单表查询——聚合函数——示例

    ), km ), cj ) ); select * from score; ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ; 查询此同学的总成绩: ; ...

  8. Active Directory Users and Computers 安装与使用(win7&win10)

    一.         ADUC安装 根据自己电脑所使用的Windows操作系统,找到对应的ADUC管理工具补丁包点击下载后安装. Windows7补丁下载链接:https://www.microsof ...

  9. 阿里云安装filezilla

    1.连接服务器 ssh 或者 远程连接 到服务器: 2.安装相应软件 安装EPEL,EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件: yum -y install epel-relea ...

  10. 开启linux服务器防火墙

    启用ufwsudo ufw enablesudo ufw default deny运行以上两条命令后,开启了防火墙,并在系统启动时自动开启.关闭所有外部对本机的访问,但本机访问外部正常. 开启和禁用s ...