THE SALT MINE
Salt Mine用于从Minions收集任意数据并将其存储在Master上。 然后通过salt.modules.mine
模块将所有数据提供给所有Minions。
Mine数据在Minion上收集并发送回Master,其中仅维护那些最新的数据(如果需要长期历史数据则建议使用returners或外部作业缓存)。
简单地说,Salt Mine是用于管理那些更新机会多或频率高的grains数据的。按常识,grains数据是minions的静态数据,基本上会是从创建到消失,都不太可能发生变化。但事情总是会有一些例外,比如说有时需要根据使用需求调整一些minions节点的系统ip地址,我们希望这些变化信息可以快点生效,而且那些使用了这些信息的管理命令或states状态也能够早点使用上更新后的数据。Salt Mine可以说,就是为这样的场景所设计的,当然,除了实效性考虑外,也兼顾到了部分性能需求。
而当有一些我们需要使用的grains数据会有比较大的机率出现变化时,我们使用Salt Mine来管理它们。
也可以通过github上的这份资料了解Salt Mine的使用知识:The Salt Mine
MINE VS GRAINS
Mine数据的设计目的旨在比grain数据更新的更及时。 Grains在非常有限的基础上更新,而且主要是静态数据。 当Minions需要来自其他Minions的数据时,Mines旨在取代速度缓慢的对等发布调用。 不再是让Minion与所有其他Minions联系获取一条数据,而是由在Master上运行的Salt Mine从所有Minions在每个Mine Interval收集它,在任何给定时间产生更新鲜的数据, 同时减少开销。
MINE FUNCTIONS
要启用Salt Mine,需要将mine_functions
选项应用于Minion。 此选项可以通过Minion的配置文件或Minion的Pillar应用。 mine_functions
选项指示正在执行的函数,并允许传入参数。salt.module
中提供了函数列表。 如果没有传递参数,则必须添加一个空列表,如下例中的test.ping
函数所示:
mine_functions:
test.ping: []
network.ip_addrs:
interface: eth0
cidr: '10.0.0.0/8'
在上面的示例中,salt.modules.network.ip_addrs
具有其他过滤器以帮助缩小结果范围。 在上面的示例中,仅当IP地址位于eth0接口和10.0.0.0/8 IP范围内时,才会返回IP地址。
MINE FUNCTIONS ALIASES
函数别名可用于提供更友好的名称、使用意图或允许使用不同参数多次调用相同函数。 传递位置和键值参数有不同的语法。 不支持混合位置和键值参数。
New in version 2014.7.0.
mine_functions:
network.ip_addrs: [eth0]
networkplus.internal_ip_addrs: []
internal_ip_addrs:
mine_function: network.ip_addrs
cidr: 192.168.0.0/16
ip_list:
- mine_function: grains.get
- ip_interfaces
MINE INTERVAL
Salt Mine功能在Minion启动时执行,并由调度程序以给定间隔执行。 默认间隔是每60分钟,可以通过minion配置中的mine_interval
选项为Minion调整:
mine_interval: 60
MINE IN SALT-SSH
从2015.5.0版本起, salt-ssh 支持 mine.get
函数。
因为Minions不能提供他们自己的mine_functions
配置,所以我们在三个地方之一中检索指定的mine函数的args,按以下顺序搜索:
- Roster data
- Pillar
- Master config
mine_functions
的格式与普通salt中的格式完全相同,只是存储在不同的位置。 以下是包含mine_functions
的roster名单的示例:
test:
host: 104.237.131.248
user: root
mine_functions:
cmd.run: ['echo "hello!"']
network.ip_addrs:
interface: eth0
注:由于salt-ssh架构的不同,
mine.get
的调用效率有些低。 Salt必须对相关的每个Minions进行一次新的salt-ssh调用,以检索所请求的数据,就像发布调用一样。 但是,与publish不同,它必须将所请求的函数作为包装函数运行,因此我们可以从相关Minion的pillar中检索函数args。 这导致检索所请求数据的明显延迟。
MINIONS TARGETING WITH MINE
mine.get
函数支持Minions目标定位的各种方法,以从特定主机获取Mine数据,例如在Minion id(名称)、grain、pillars和复合匹配上的glob或正则表达式匹配。 请参阅salt.modules.mine模块文档以获取参考。
注意:Pillar数据需要缓存在Master上,以便结合使用pillar定位与Mine。 阅读相关章节中的注释。
例子
使用Mine数据的一种方法是在一个state状态文件中。 可以通过Jinja检索这些值并在SLS文件中使用。 以下示例是部分HAProxy配置文件,并从具有“web” grain粒度的所有Minions中提取IP地址,以将它们添加到负载平衡服务器池中。
/srv/pillar/top.sls
:
base:
'G@roles:web':
- web
/srv/pillar/web.sls
:
mine_functions:
network.ip_addrs: [eth0]
接下来触发minions刷新pillar数据:
salt '*' saltutil.refresh_pillar
通过执行以下操作并检查输出中的network.ip_addrs
,验证结果是否显示在minions的pillar中:
salt '*' pillar.items
我们可以看到,返回结果中应该显示该Mine函数存在于minion上,但不包括实际值的输出:
minion1.example.com:
----------
mine_functions:
----------
network.ip_addrs:
- eth0
Mine数据通常每60分钟仅在master上更新一次,这可以通过设置修改:
/etc/salt/minion.d/mine.conf
:
mine_interval: 5
手动强制立即刷新一次Mine数据:
salt '*' mine.update
在 /srv/salt/haproxy.sls
中配置一个salt.states.file.managed
状态:
haproxy_config:
file.managed:
- name: /etc/haproxy/config
- source: salt://haproxy_config
- template: jinja
创建Jinja模板文件/srv/salt/haproxy_config
:
<...file contents snipped...>
{% for server, addrs in salt['mine.get']('roles:web', 'network.ip_addrs', tgt_type='grain') | dictsort() %}
server {{ server }} {{ addrs[0] }}:80 check
{% endfor %}
<...file contents snipped...>
在上面的示例中,server
将会由minion_id替代。
注:在2017.7.0版本的Salt中,expr_form参数将重命名为
tgt_type
。