gy13100892256
作者gy13100892256·2021-05-19 16:25
系统管理员·电信

SaltStack数据系统之Grains

字数 2355阅读 2181评论 0赞 0

什么是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的客户端,并执行命令:

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

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

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

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

因为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: ngin

是不是觉得系统自带的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脚本会存放在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模块

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广