通过引用另一个来分配变量

时间:2018-05-10 18:38:03

标签: variables ansible

在下面的Ansible Playbook中,我尝试使用来自defaults/main.yml的预定义变量创建用户密码,该变量将来自vars/passwords.yml的密码。该文件将在以后进行存档。

乏/密码

---
passwords:
  foobar: 
     password: pass1234

默认/ main.yml

users:
  - username: foobar
    group: barfoo
    password: "{{passwords.foobar}}"

的任务/ main.yml

- 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'"
}

任何想法如何通过引用另一个变量来实现分配变量。

2 个答案:

答案 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。 如果您有任何改进或建议,请告诉我。