grains

介绍:
  作为获取系统底层信息的一个接口,可收集大量的系统基础信息。
  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
View Code

 (2)配置在单独的文件中,不需要顶层的grains

1 cat /etc/salt/grains
2 roles:
3   - webserver
4   - memcache
5 deployment: datacenter4
6 cabinet: 13
7 cab_u: 14-15
View Code

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
View Code

优化版示例:

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 %}
View Code

说明:使用模板的方式比上面类似硬编码的方式要简略些,可以根据实际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字段类型即可
View Code

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     ... 
View Code

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
View Code

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


原文地址:https://www.cnblogs.com/solitarywares/p/7449781.html