改进的盐栈缩放方式

时间:2015-07-21 14:54:59

标签: yaml state salt-stack jinja2

我对Jinja2模板有疑问,在state编写salt或其他任何内容时,问题是在多行上打破一行字符串[我的确如此是指尝试在列表中一个接一个地写一个机器列表,而不是仅仅在一个非常长的行中。

我想说的是我想实现这个目标:

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

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

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

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

你可以说grains,我想到了,但我想知道是否有一种更好,更优雅的方式。

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

[EDIT1]: 我写了一个脚本,它接受一个主机名列表,并将它们添加到nodegroups部分的主配置文件中。现在它可能有效

2 个答案:

答案 0 :(得分:3)

数据源的选择

我建议 targeting with pillars ,因为它们是从Master =方便的集中管理,而不是静态自定义谷物(在每个Minion上分配配置)=不方便 - see comparison summary here

配置文件的限制

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

可能的解决方案

为什么甚至会提到加入?您可以将"将多行上的一行字符串" 分解为使用列表的解决方案 - 无需中断(如果您需要&# 34;一行字符串" 某处,加入列表项很容易)。

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

答案 1 :(得分:2)

首先,我要感谢uvsmtid的精彩创意。也为此造成了混乱

所以,我所做的是创建一个带有每个小兵名称的支柱[恰好是它的id],然后在一个状态下,我所做的是将该列表中的值与实际的id进行比较仆从

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

  {%endif%}
{%endfor%}

我希望这个解决方案可以像帮助我一样帮助某人