在下面的Ansible Playbook中,我尝试使用来自defaults/main.yml
的预定义变量创建用户密码,该变量将来自vars/passwords.yml
的密码。该文件将在以后进行存档。
---
passwords:
foobar:
password: pass1234
users:
- username: foobar
group: barfoo
password: "{{passwords.foobar}}"
- include_vars: passwords.yml
- name: Create user
user:
name: "{{item.username}}"
group: "{{item.group}}"
password: "{{item.password | password_hash('sha512') }}"
当我运行此剧本时,我收到以下错误:
ERROR:
{
"msg": "[{u'username': u'foobar',
u'group': u'barfoo',
u'password': u'{{passwords.username}}'}]: 'list object' has no attribute 'username'"
}
任何想法如何通过引用另一个变量来实现分配变量。
答案 0 :(得分:1)
您提供的第一个文件,passwords
作为列表变量,而defaults/main.yml
文件中您需要一个字典变量(passwords.foobar
)。
请将第一个文件内容更改为:
---
passwords:
foobar: pass1234
对其余内容无法评论,我认为tasks/main.yml
缺少一行,可能是包含with_items
语句的行。我并不暗示它在您的代码中存在问题,您可能没有将所有代码粘贴到此问题中。
答案 1 :(得分:0)
使用当前变量文件(默认值和变量),我的解决方案是使用用户名作为密钥来调用用户栏的密码。我目前有:
- include_vars: passwords.yml
- name: Create user
user:
name: "{{item.username}}"
group: "{{item.group}}"
password: "{{item.password | password_hash('sha512') }}"
新defaults/main.yml
将没有密码键/值:
users:
- username: foobar
group: barfoo
现在使用vars/passwords.yml
:
---
passwords:
foobar:
password: pass1234
我可以将我的更改编辑为:
- include_vars: passwords.yml
- name: Create user
user:
name: "{{item.username}}"
group: "{{item.group}}"
password: "{{passwords[item.username].password | password_hash('sha512') }}"
这解决了我的问题,并允许我跳过passwords.yml
。
如果您有任何改进或建议,请告诉我。