根据列表中是否存在主机 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'] }}
我正在尝试创建一种状态,无需为所有主机制作大量单独的支柱文件即可检索少量设置。这种方式看起来既乏味又不正确,但我不知道如何使用 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'] }}