根据列表中是否存在主机 ID 来设置值

Setting values based upon whether the host ID exists in a list

我正在尝试创建一种状态,无需为所有主机制作大量单独的支柱文件即可检索少量设置。这种方式看起来既乏味又不正确,但我不知道如何使用 Jinja 和 YAML 来实现它。

我是怎么做到的:

/srv/pillar hosts1.sls,host2.sls,host3.sls,...host1000

cluster:
  name: cluster_one
  server: 1.1.1.1
  setting: foo

/srv/pillar hosts4.sls,host5.sls,host6.sls,...

cluster:
  name: cluster_two
  server: 2.2.2.2
  setting: bar

是否可以用 pillar 甚至 map.jinja 文件做这样的事情,然后在状态文件中使用 Jinja 并说 'if my minion name is in the members list, then set these server, setting and cluster name'?

clusters:
  cluster_one:
    server: 1.1.1.1
    setting: foo
    members:
       - host1
       - host2
       - host3
  cluster_two
    server: 2.2.2.2
    setting: bar
    members:
      - host4
      - host5
      - host6

我想要的最终结果就是这样的文件中的那三行。

主机 1、主机 2、主机 3 /tmp/example.txt

name: cluster_one
server: 1.1.1.1
setting: foo

host4,host5,host6 /tmp/example.txt

name: cluster_two
server: 2.2.2.2
setting: bar

我的想法是,我希望能够将小兵添加到成员列表中,而不必为每个主机制作大量新的支柱文件。一台主机只会出现在一个集群中,无需担心匹配问题。

然后,如果我想添加新成员,我可以简单地编辑它(如果需要刷新)并应用,而无需为 host7、host8 和 host9 创建新的支柱文件。

clusters:
  cluster_one:
    server: 1.1.1.1
    setting: foo
    members:
       - host1
       - host2
       - host3
  cluster_two
    server: 2.2.2.2
    setting: bar
    members:
      - host4
      - host5
      - host6
 cluster_three
   server: 3.3.3.3
   setting: baz
   members:
     - host7
     - host8
     - host9
 

我们可以通过组织 pillar 数据并使用 Jinja 模板在 minions 上创建结果文件来实现这一点。

支柱

考虑支柱数据pillar/data.sls:

clusters:
  - name: cluster_one
    server: 1.1.1.1
    setting: foo
    members:
      - host1
      - host2
      - host3
  - name: cluster_two
    server: 2.2.2.2
    setting: bar
    members:
      - host4
      - host5
      - host6
  - name: cluster_three
    server: 3.3.3.3
    setting: baz
    members:
      - host7
      - host8
      - host9

Jinja 模板

然后为 test/example.txt.j2 创建一个模板,如下所示:

{%- for cluster in clusters -%}
{%- if grains['id'] in cluster.members -%}
name: {{ cluster.name }}
server: {{ cluster.server }}
setting: {{ cluster.setting }}
{%- endif -%}
{%- endfor -%}

状态 SLS

然后我在test.sls中有一个简单的file.managed来渲染上面的模板:

create_temp_file:
  file.managed:
    - name: /tmp/example.txt
    - source: salt://test/example.txt.j2
    - mode: 0644
    - template: jinja
    - defaults:
        clusters: {{ pillar['clusters'] }}