我想根据角色向 minion 添加一些通用支柱数据,同时也提供一种根据主机名(minion id)定制每台机器的方法。
在我的 pillar/top.sls 文件中,我有
base:
'*':
- pkgs/common-ubuntu-pkg
- fail2ban/config
'runit:True':
- runit/package
'is_virtual:True':
- users/vmuser
'role:database':
- match: grain
- mysql/defaults
然后我想添加这样的内容:
{% for host in pillar %}
'{{host}}':
include:
- {{host}}/passwords
{% endfor %}
它可以工作,但只会打印出“master”。我使用的是无 master salt-ssh,所以我相信这就是为什么名单中的 minions 尚未进入 pillar。我想用另一种方式循环遍历已定义的 minions,但我似乎无法轻松查看 salt 字典中的内容。
{% for key in salt %}
'{{key}}':
include:
- foobar
{% endfor %}
尝试使用类似上述方法进行调试会导致 KeyError
答案1
解决方案不是依赖于在 pillar.top 文件中使用 jinja,而是依赖于使用外部 pillar 插件。
外部 pillar 插件“file_tree”在 root_dir 下查找目录主机和节点组。将 minion_ids 与 root_dir/hosts/ 下的目录匹配,它会将所有 .sls 文件作为 pillar 数据添加到该主机/minion。
#in /etc/salt/master
ext_pillar:
- file_tree:
root_dir: /srv/salt/my-pillars/
follow_dir_links: False
raw_data: False
#on disk
/srv/salt/my-pillars/hosts/mydbserver/passwords.sls