我正在使用SaltStack管理一些虚拟机。我正在寻找一种方法来渲染在top.sls文件中附加了指定.sls的minion的ID /主机名,或者在jinja模板启用的文件中的特定状态。我想这样做的原因是我可以轻松地在客户端的配置中引用服务器,而无需在任何地方硬编码值。例如;
/虽然V/salt/top.少林寺:
base:
'desktoppc01':
- generic.dns
'bind9server01':
- generic.dns
- bind9
/虽然V/salt/generic/DNS/init.少林寺:
/etc/resolv.conf:
file:
- managed
- source: salt://generic/dns/files/resolv.conf
- mode: 644
- template: jinja
最后,
/虽然V/salt/generic/DNS/files/热水哦率.conf:
domain {{ pillar['domain_name'] }}
search {{ pillar['domain_name'] }}
nameserver {{ list_minions_with_state['bind9'] }}
我具体的是与{{ list_minions_with_state['bind9'] }}
相同(我只是为了演示而制作)。我曾经认为这将是非常普遍需要的东西,但在搜索模块页面之后我还没有找到任何东西。
目前我让客户从支柱获取信息,但必须手动配置,这不会花费时间。
我希望我能用for
循环扩展这个想法,以便在创建服务器时动态添加它们。
编辑:
使用与top.sls具有相同数据和层次结构的文件,进行渲染
base:
{% for server_id in salt['pillar.get']('servers') %}
'{{ server_id }}':
{% for states in salt['pillar.get']('servers:{{ server_id }}') %}
- {{ states }}
{% endfor %}
{% endfor %}
给你
base:
'desktoppc01':
'bind9server01':
我尝试了{{ server_id }}
的一些变化,但没有成功。除非有一种简单的方法在该函数中使用支柱变量,否则我正在考虑制作一个功能请求并将其称为一天。
我认为这个问题的方法是使用jinja并有一个包含dns服务器列表的变量...由一个支柱变量填充
例如,你可以有一个支柱:bind:servers变量见http://docs.saltstack.com/en/latest/topics/tutorials/states_pt3.html和http://docs.saltstack.com/en/latest/topics/pillar/index.html#master-config-in-pillar
可以用来设置resolv.conf的名称服务器..还可以将 - bind9状态添加到服务器。所以最后你只有一个地方可以编辑:支柱中绑定服务器的minion列表
首先想到的是通过为state.apply或state.highstate设置test = True来使用测试状态方法。如果要应用零状态,那么您的服务器将完全应用您的高状态或特定sl。
salt '*' state.highstate test=True
使用salt-run的survey.diff可能会有所帮助(虽然diff补丁不像检查配置文件那样适合这种情况):
salt-run survey.diff '*' state.apply my.state test=True
虽然目前不适用于基于您的示例的问题,但另一种想到的方法是使用您所在州的盐粒。当您将状态应用于系统时,状态将附加到“状态”颗粒。谷物跟踪角色(例如网络,数据库等)之类的东西,谷物可以跟踪状态更多的是应用的内容,而不是应该是角色的逻辑。然后,您可以使用它们来定位和/或查询服务器。
以谷物为目标(仅显示minion id):
salt -G 'states:bind9' test.ping
salt -G 'states:generic.dns' test.ping
salt -G 'states:my_jinja_state' test.ping
查询谷物(每个小兵向我展示州粮食):
salt '*' grains.get states
谷物的差异(比较每个小兵状态谷物):
salt-run survey.diff '*' grains.get states