介绍:
作为获取系统底层信息的一个接口,可收集大量的系统基础信息。
salt master可以通过grains获取minion端的具体信息,从而进行差异化的处理。
grains保存的是一个相对静态的数据,可以配置为定时刷新的方式。
grains不区分变量的大小写。
LISTING GRAINS
列出grains变量,master端执行
salt '*' grains.ls
salt '*' grains.items
GRAINS IN THE MINION CONFIG
在minion配置grains变量,可以使用以下几种方法:
(1)在minion的主配置文件中配置
1 grains: 2 roles: 3 - webserver 4 - memcache 5 deployment: datacenter4 6 cabinet: 13 7 cab_u: 14-15
(2)配置在单独的文件中,不需要顶层的grains
1 cat /etc/salt/grains 2 roles: 3 - webserver 4 - memcache 5 deployment: datacenter4 6 cabinet: 13 7 cab_u: 14-15
MATCHING GRAINS IN THE TOP FILE
在minion中正确的配置好grains之后,就可以在pillar的top文件中配置匹配grains
示例:
1 'node_type:webserver': 2 - match: grain 3 - webserver 4 5 'node_type:postgres': 6 - match: grain 7 - postgres 8 9 'node_type:redis': 10 - match: grain 11 - redis 12 13 'node_type:lb': 14 - match: grain 15 - lb
优化版示例:
1 {% set the_node_type = salt['grains.get']('node_type', '') %} 2 3 {% if the_node_type %} 4 'node_type:{{ the_node_type }}': 5 - match: grain 6 - {{ the_node_type }} 7 {% endif %}
说明:使用模板的方式比上面类似硬编码的方式要简略些,可以根据实际grains变量的值进行渲染,但是一定要确认好minion端设置了node_type
WRITING GRAINS
步骤:
(1)在file_roots里设置环境路径
/srv/salt/_grains
(2)在定义好的grains目录下编写自定义的函数
示例:
1 def yourfunction(): 2 # initialize a grains dictionary 3 grains = {} 4 # Some code for logic that sets grains like 5 grains['yourcustomgrain'] = True 6 grains['anothergrain'] = 'somevalue' 7 return grains 8 #函数名无所谓,确保返回的为python字段类型即可
WHEN TO USE A CUSTOM GRAIN
如何使用自定义的grains
出发点:如果存储的数据经常变更的话优先考虑将数据定义在pillar中。
在jinja模板中使用自定义的grains:
1 ... 2 ... 3 {{ salt['module.function_name']('argument_1', 'argument_2') }} 4 {{ pillar['my_pillar_key'] }} 5 ... 6 ...
LOADING CUSTOM GRAINS
如何加载自定义的grains文件,使用main函数的方式
示例:
1 #!/usr/bin/env python 2 def _my_custom_grain(): 3 my_grain = {'foo': 'bar', 'hello': 'world'} 4 return my_grain 5 6 7 def main(): 8 # initialize a grains dictionary 9 grains = {} 10 grains['my_grains'] = _my_custom_grain() 11 return grains
PRECEDENCE
minion端读取grains变量的优先级
1、Core grains.
核心的grains变量,包含系统的一些环境信息
2、Custom grains in /etc/salt/grains.
在/etc/salt/grains中编写的一些grains变量
3、Custom grains in /etc/salt/minion.
在minion主配置文件中编写的grains变量
4、Custom grain modules in _grains directory, synced to minions.
从master的_grains目录同步到minion端的grains变量
EXAMPLES OF GRAINS
参考:https://github.com/saltstack/salt/blob/develop/salt/grains/core.py
SYNCING GRAINS
同步grains变量,当以下命令被执行的时候被触发:
state.highstate
saltutil.sync_grains
saltutil.sync_all