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

Pillar与Jinja模板迭代报错:str对象无iteritems属性

解决Salt/Pillar Jinja模板迭代时出现的'str object'无属性'iteritems'错误

我最近把一套在旧环境运行正常的Salt/Pillar Jinja模板迁移到新环境,结果遇到了一个头疼的问题:渲染SLS base:pillar_lab_user时一直失败,报错信息是:

Jinja变量'str object'无属性'iteritems'

我尝试了好几种不同的迭代语法,但都没解决问题。

出错的Jinja模板代码

{% set users = salt['pillar.get']('XXXXXXX') %}
{% for user, args in users.iteritems() %}
{{ user }}:
  user.present:
    - fullname: {{ args.fullname }}
    - uid: {{ args.uid }}
    - gid_from_name: True
    - shell: {{ args.shell }}
    {% if not args.empty_password == true %}
    - password: {{ args.password }}
    {% else %}
    - empty_password: {{ args.empty_password }}
    {% endif %}
    {% if 'groups' in args %}
    - groups: {{ args['groups'] }}
    {% endif %}
{% endfor %}

对应的Pillar数据

users:
  user1:
    fullname: User1 Fullname
    uid: 951
    gid: 951
    shell: /bin/bash
    groups:
      - sudo
      - admin
    password: (REMOVED)
    pub_ssh_keys: (REMOVED)
  user2:
    fullname: User2 Fullname
    uid: 955
    gid: 955
    shell: /bin/bash
    groups:
      - sudo
      - admin
    password: (REMOVED)
    pub_ssh_keys: (REMOVED)

错误原因分析

这个报错的核心是:salt['pillar.get']('XXXXXXX')获取到的结果不是预期的字典类型,而是一个字符串。因为字符串没有iteritems()方法(哪怕是Python3中字典改用items(),这里连字典都不是),所以迭代时直接抛出了属性不存在的错误。

后续排查发现问题出在Pillar的配置格式上,用户的配置错误导致指定的XXXXXXX键对应的pillar数据没有正确加载为字典,反而变成了字符串类型。

解决步骤

我直接移除了模板中的{% set users = salt['pillar.get']('XXXXXXX') %}语句,改用pillar的top.sls来指定目标节点对应的pillar数据后,模板就正常渲染,功能恢复了。

另外给大家提个排查小技巧:遇到这类pillar数据类型不符的问题时,可以先通过Salt命令验证数据是否正确加载:

salt '*' pillar.get users

确保返回的是字典格式,而不是字符串或者其他异常类型。如果返回结果不对,优先排查pillar配置文件的格式、top.sls的匹配规则是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:10