首页 > 解决方案 > 根据主机 ID 是否存在于列表中设置值

问题描述

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

我是怎么做的:

/srv/支柱 hosts1.sls,host2.sls,host3.sls,...host1000

cluster:
  name: cluster_one
  server: 1.1.1.1
  setting: foo

/srv/支柱 hosts4.sls,host5.sls,host6.sls,...

cluster:
  name: cluster_two
  server: 2.2.2.2
  setting: bar

是否可以使用支柱甚至 map.jinja 文件执行类似的操作,然后在状态文件中使用 Jinja 并说“如果我的奴才名称在成员列表中,则设置这些服务器、设置和集群名称”?

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

主机 4,主机 5,主机 6 /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
 

标签: python-3.xyamlsalt-stack

解决方案


我们可以通过组织支柱数据并使用 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

神社模板

然后有一个模板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

然后我有一个简单file.managedtest.sls渲染上面的模板:

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

推荐阅读