改进了 saltstack 中的缩放方式

Improved way of scaling in saltstack

我对 Jinja2 模板有疑问,在编写 statesalt [我的确切的情况是指尝试一个接一个地写一个机器列表,在一个列表中,而不是在一个很长的行中。

我想说的是我想达到的目的:

nodegroups:
  - group: 'L@adsdasdadas' +
            'dasdasdasdas'
             .............->imagine 10.000 names coming here
             'adsasdasddsa'

与我现在必须做的方法相比:

nodegroups:
  - group: 'L@adsdasdadas,dasdsadasdsa,dasdsadasdsa,......,asdqwe'

有更好的方法吗?有没有更好的方法来处理数千台机器?

你可以说 grains,我考虑了一下,但我想知道是否有更好更优雅的方法。

任何想法或意见都会对我有很大帮助

[编辑1]: 我写了一个脚本,它获取主机名列表并将它们添加到节点组中的主配置文件 section.For 现在它可能工作

数据源的选择

我会推荐targeting with pillars because they are managed centrally from Master = convenient, rather than static custom grains (which are configured distributively on each Minion) = inconvenient - see comparison summary here

配置文件的限制

nodegroups 是在 Salt 配置文件 /etc/salt/master 中指定的,它不是 Jinja 模板(它具有纯 YAML 格式)。因此,您无法选择 use Jinja to join 带有字符串列表的外部输入。

可能的解决方案

为什么还要提到加入?您可以立即将 "breaking a one line string over multiple lines" 的问题转化为使用列表的解决方案 - 无需中断(如果您需要 "one line string" 在某个地方,加入列表项很容易)。

换句话说,您可以通过 pillar 定义 nodegroups(避免像您的示例中那样使用长字符串)。反过来,支柱 是由 Jinja 渲染的。因此,使用在某处定义的相同 Minion 列表,您可以通过 Jinja 在支柱中生成派生产品(无论是连接它们的字符串还是按原样列出)。有一个技巧允许 reusing the same external data in multiple pillars files.

首先感谢uvsmtid的精彩idea.Sorry也造成了混乱

所以,我所做的是用每个 minion 的名字创建一个支柱 [这恰好是它的 id] 然后在一个状态下我所做的是将该列表中的值与 minion 的实际 id 进行比较

{%for item in salt['pillar.get']('info') %}
  {%if grains['id'] == item %}
    something:
      cmd.run:
         - name: touch something

  {%endif%}
{%endfor%}

我希望这个解决方案能像帮助我一样帮助别人