You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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按需指定的灵活性:

  1. 主文件folder/site/pillar.sls(集中所有核心配置):
global_test1:
  test1: |
    blabla

global_test2:
  test2: |
    bloblo
  1. 创建两个小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 }}
  1. top.sls恢复成你之前的写法:
base:
  '*':
    - folder.site.test1
    - folder.site.test2

这种方法把核心配置集中在一个文件维护,同时保留了top.sls按需指定的能力,小SLS文件只是起到“转发”作用,不需要修改核心内容。

补充说明

Salt的top.sls本质是指定要加载的SLS文件列表,不能直接指定Pillar的某个键。你之前的错误是把Pillar键当成了SLS文件路径引用,导致Salt找不到文件。上面两种方案可以根据你的实际场景选择。

内容的提问来源于stack exchange,提问作者AskaComu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:43:13