Ansible Playbook变量引用赋值报错:列表对象无username属性
Ansible用户创建变量引用问题的解决办法
我来帮你排查并解决这个问题——你遇到的'list object' has no attribute 'username'错误,其实是两个小问题叠加导致的,咱们一步步拆解修复:
先搞懂错误根源
首先看错误提示里的变量内容:{u'username': u'foobar', u'group': u'barfoo', u'password': u'{{passwords.username}}'},结合你的Playbook代码,能发现两个核心问题:
- 没告诉Ansible要遍历用户列表:你的创建用户任务里,没有加
with_items: "{{users}}",Ansible不知道要循环处理users列表里的每个用户项,自然就识别不了item.username这种变量。 - 变量引用层级错了:
passwords.foobar是一个包含password键的字典,你直接把这个字典赋值给item.password,后续用password_hash过滤时,处理的是字典而非字符串密码,会导致解析异常。
修复后的完整代码
1. vars/passwords.yml(保持原样,之后可以正常加密)
--- passwords: foobar: password: pass1234
2. defaults/main.yml:修正变量引用到具体密码字符串
users: - username: foobar group: barfoo password: "{{ passwords.foobar.password }}"
3. tasks/main.yml:添加列表遍历指令
- name: 加载密码变量文件 include_vars: passwords.yml - name: 创建用户并设置加密密码 user: name: "{{ item.username }}" group: "{{ item.group }}" password: "{{ item.password | password_hash('sha512') }}" with_items: "{{ users }}"
额外注意事项
- 加密
vars/passwords.yml时,用Ansible Vault命令:ansible-vault encrypt vars/passwords.yml,运行Playbook的时候加上--ask-vault-pass参数就能解密使用。 - 如果你用的是比较老的Ansible版本,记得确认
password_hash过滤器支持sha512(大部分新版本都没问题)。
内容的提问来源于stack exchange,提问作者Taleeb
相关产品推荐
相关产品推荐

