Ansible使用subelements循环报错:key item应指向字典
错误原因
报错由两处写法错误共同引发:
subelements过滤器的参数传入错误:该过滤器的作用是遍历列表元素下的指定子列表,参数只需要填写子列表对应的键名即可,你传入的sshkey.item属于多余拼接,过滤器会尝试查找每个用户字典下sshkey键对应的item属性,但sshkey本身是公钥组成的列表、不是字典,因此触发类型错误。- 遍历取值逻辑错误:
subelements过滤器返回的遍历项是固定的二元元组结构,不是直接包含name、sshkey属性的单层字典,原写法中直接取item.name、item.sshkey即使修正过滤器参数也无法取到正确值。
修复方案
直接调整loop的过滤器参数、修正模块的取值路径即可,修正后的完整代码如下:
admins: - name: "{{ vault_admin_user1_name }}" sshkey: - "{{ vault_admin_user1_pubkeyA }}" - "{{ vault_admin_user1_pubkeyC }}" - name: Set up multiple authorized keys for users ansible.posix.authorized_key: user: '{{ item.0.name }}' state: present key: '{{ item.1 }}' loop: "{{ admins | subelements('sshkey') }}"
关键调整点说明:
- 将
subelements的参数从sshkey.item改为sshkey,直接匹配用户条目下存储公钥列表的键名,过滤器会自动完成用户和其名下每个公钥的配对遍历 - 遍历项的取值对应结构:
item.0为外层admins列表中的用户字典,可通过item.0.name取到目标用户名;item.1为当前遍历到的单个公钥字符串,直接传给key参数即可完成单条公钥的授权配置。
内容的提问来源于stack exchange,提问作者mkozub
相关产品推荐
相关产品推荐

