SaltStack Mine - 怎样管理和利用那些grains的数据变化

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,按以下顺序搜索:

  1. Roster data
  2. Pillar
  3. 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

猜你喜欢

转载自blog.csdn.net/watermelonbig/article/details/91353767