python-3.x - 根据主机 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
解决方案
我们可以通过组织支柱数据并使用 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.managed
的test.sls
渲染上面的模板:
create_temp_file:
file.managed:
- name: /tmp/example.txt
- source: salt://test/example.txt.j2
- mode: 0644
- template: jinja
- defaults:
clusters: {{ pillar['clusters'] }}
推荐阅读
- sql - SYNTAX_ERROR: '"LastName"' 必须是聚合表达式或出现在 GROUP BY 子句中
- c++ - 寻找最短路径算法
- jms - SOAP 和 IBM MQ JMS
- parceljs - ReasonML 的 ParcelJS 未正确进行热加载
- bash - 如何从第一个元素中获取 csv 中的一整行并将其放入 bash 数组中?
- php - 如何使用 Google Analytics 制作特定页面的报告?
- python - Jupyter Notebook 单元格无法运行
- arrays - 将多维项添加到数组中,然后一次检索所有项
- laravel - Laravel:从多对多(多态)关系中检索所有关系
- c# - Application Insights - 使用数据数组作为属性跟踪自定义事件