如何通过top.sls从单个pillar.sls文件调用多个子pillar
解决Salt单个Pillar文件按需加载子Pillar的问题
错误原因
你在top.sls里写的folder.site.pillar.test1是无效的——Salt的top.sls指定的是完整的SLS文件路径,但你实际只有folder/site/pillar.sls这个文件,不存在pillar/test1.sls,所以Salt会报错找不到对应的SLS文件。
解决方案
方案1:单个文件内用Jinja条件控制加载
把所有子Pillar内容合并到同一个pillar.sls,通过Jinja模板根据节点标识(比如grains ID、分组)决定加载哪些子Pillar,既合并文件又实现按需分配:
pillar.sls内容:
global: {% if grains['id'] matches '*-1' %} test1: | blabla {% endif %} {% if grains['id'] matches '*-2' %} test2: | bloblo {% endif %}
top.sls只需加载这个单个文件:
base: '*': - folder.site.pillar
这样X-1节点会加载test1的Pillar内容,X-2节点加载test2的,和你之前多文件的效果完全一致,但核心配置只需要维护一个文件。
方案2:SLS分片+引用实现按需加载
如果不想用Jinja条件,也可以把核心配置集中在主文件,用小SLS文件引用对应部分,保留top.sls按需指定的灵活性:
- 主文件
folder/site/pillar.sls(集中所有核心配置):
global_test1: test1: | blabla global_test2: test2: | bloblo
- 创建两个小SLS文件,用来引用主文件的对应片段:
folder/site/test1.sls:
{% from 'folder/site/pillar.sls' import global_test1 with context %} global: {{ global_test1 }}
folder/site/test2.sls:
{% from 'folder/site/pillar.sls' import global_test2 with context %} global: {{ global_test2 }}
top.sls恢复成你之前的写法:
base: '*': - folder.site.test1 - folder.site.test2
这种方法把核心配置集中在一个文件维护,同时保留了top.sls按需指定的能力,小SLS文件只是起到“转发”作用,不需要修改核心内容。
补充说明
Salt的top.sls本质是指定要加载的SLS文件列表,不能直接指定Pillar的某个键。你之前的错误是把Pillar键当成了SLS文件路径引用,导致Salt找不到文件。上面两种方案可以根据你的实际场景选择。
内容的提问来源于stack exchange,提问作者AskaComu
相关产品推荐
相关产品推荐

