首页 编程技术SaltStack数据系统之Grains

SaltStack数据系统之Grains

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

什么是Grains

Grains是SaltStack的一个组件,存放着minion启动时收集的底层系统的静态信息。Grains中包含诸如运行的操作系统、内核版本、CPU个数、内存、主机名、IP地址、物理设备型号、甚至机器的SN号等非常多的信息。

Grains是存储在minion端的,当minion启动时,会进行Grains的采集工作,然后保存下来。在以后的生命周期(再次重启minion,会重新收集)是不会发生变化的,所以是静态数据。你可能已经想到这些数据可以用来做资产管理的信息收集。

Grains应用场景

  • Grains可以在state系统中使用,用于配置管理模块。
  • Grains可以target中使用,在用来匹配Minion,比如匹配操作系统,使用-G选项。
  • Grains可以用于信息查询,Grains保存着收集到的客户端的详细信息。

Grains使用案例

 1.Grains 信息查询

列出Minion上所有可用的grains的名称。

# salt ‘*’ grains.ls

列出Minion上所有grains的的名称及内容。

# salt ‘*’ grains.items

查询salt版本

# salt ‘*’ grains.get saltversion

查询eth0 所有IP 地址

# salt ‘*’ grains.get ip_interfaces:eth0

   2.使用Grains匹配Minion

匹配所有系统是CentOS的客户端,并执行命令:

SaltStack数据系统

3.在Top文件中使用Grains匹配

Grains

这样我们可以使用grains进行非常灵活的来选择对应的服务器。

4.在States文件中配合jinja模板使用Grains内容做判断

例如如果你的环境中有CentOS还有Debian系统,那么在快速入门中我们编写的apache.sls需要修改为下面的内容:

minion

因为CentOS和Debian的apache的包名称是不同的,我们可以通过grains的os获取到操作系统名称,然后进行判断。注意这个{% … %}{% elif … %}{% endif %}是jinja模版。

自定义Grains

内置的Grains不一定能满足所有需求,所以SaltStack支持在Minion的配置文件中静态定义Grains,或者在/etc/salt/grains中,推荐后者。比如我们将一台服务器打一个标签。说明它是一台Nginx,运行在OpenStack平台中。这样我们在以后做远程管理的时候,比如重启下所有的Nginx服务,就可以通过这个自定义的Grains来进行了。

# vim /etc/salt/grains

roles: nginx

dept: dev

cloud: openstack

还记得前面说的Grains的特点吗,必须重启Minion才会重新收集Grains。

# /etc/init.d/salt-minion restart

重启minion服务后,使用grains.item就可以列出roles等自定义的grains。

# salt ‘*’ grains.item roles

linux-node2.example.com:

roles: nginx

是不是觉得系统自带的Grains不够用,配置文件写Grains又不灵活,那么没关系,SaltStack支持你自己编写Grains。

编写Grains

在minion配置文件中定义的grains是静态的,不能够动态的在minion上生成。可以用Python非常方便的写动态的grains。minion启动时,会执行grains包所带的模块及自定义grains模块中的函数,返回的结果就是grains。grains模块中的函数必须返回一个dict,其中key是grains的名字,value是值。

这里的动态 grains 是指 minion 启动时动态生成,事先并不知道内容,在启动后,这些值依然是不变的。

自定义Grains

很明显,自定义的grains并不是直接放在minion上,而是放在master配置文件中定义的file_roots下的_grains目录中。执行state.highstate,saltutil.sync_grains,saltutil.sync_all时,会将_grains中的文件分发到客户端上。

假定file_roots为/srv/salt,增加自定义grain的操作如下:

# mkdir /srv/salt/_grains/

非常简单的案例

下面我们来编写grains,记住:必须返回一个字典!

grains

刷新grains

SaltStack

刷新后,我们自定义的grains脚本会存放在minion配置文件制定的cache目录下:

[root@linux-node1~]# ls -l /var/cache/salt/minion/extmods/grains

总用量 8

-rw-r–r– 1 root root 120 11月 6 17:39 my_grain.py

现在我们可以获取到我们自己编写的grains。同时,除了执行saltutil.sync_grains进行刷新外,也可以执行saltutil.sync_grains进行刷新操作。或者在我们执行state.highstate的时候也会自动进行刷新。

 Grains的优先级

到目前位置,我们知道Grains有四种存放的方法,或者说是位置:SaltStack自带的Grains,自定义的Grains和我们编写的grains的模块返回的Grains,如果grains的名称一样,到底以哪个为准呢?优先级从低到高如下:

  1. 系统自带grains
  2. /etc/salt/grains里面指定的grains
  3. /etc/salt/minion里面设置的grains
  4. 自已编写的grains模块

作者:赵舜东(赵班长)

来源:运维社区

 

本文链接:https://www.yunweipai.com/9395.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部