使用Jinja读取包含字典结构数组的Salt Pillar失败求助
问题根因
SaltStack要求SLS文件内所有状态ID全局唯一,你在for循环中硬编码了固定状态IDprint my data,遍历pillar中2个package元素时会重复生成同一个ID,直接触发编译冲突。
修复方案
将状态ID改为动态生成即可,两种常用实现方式:
方式1:用pillar唯一字段拼接ID
适合repo_name无特殊字符的场景:
{% for package in salt.pillar.get('deploy2:packages', []) %} print_{{ package.repo_name }}_data: cmd.run: - name: "echo {{ package.repo_name }}" {% endfor %}
方式2:用循环序号生成ID
无需依赖pillar字段,通用性更强:
{% for package in salt.pillar.get('deploy2:packages', []) %} print_my_data_{{ loop.index }}: cmd.run: - name: "echo {{ package.repo_name }}" {% endfor %}
以上两种写法都额外补充了
salt.pillar.get的默认空数组参数,避免pillar不存在deploy2:packages配置时循环报错。
验证步骤
修改前可先确认minion侧pillar数据是否正常同步:
salt <目标minion ID> pillar.get deploy2:packages
命令返回对应字典数组即说明pillar配置无误,修改后的state可正常执行。
内容的提问来源于stack exchange,提问作者Sujeet Padhi
相关产品推荐
相关产品推荐

