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
相关产品推荐
相关产品推荐

