前言:

是不是觉得系统自带的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模块

Comments

2017-03-03