什么是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: 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脚本会存放在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的名称一样,到底以哪个为准呢?优先级从低到高如下:
- 系统自带grains
- /etc/salt/grains里面指定的grains
- /etc/salt/minion里面设置的grains
- 自已编写的grains模块
作者:赵舜东(赵班长)
来源:运维社区
本文链接:http://www.yunweipai.com/9395.html
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/53238.html