Ansible-vault没有正确传递给playbook

时间:2017-10-05 14:24:48

标签: ansible

我正在尝试使用ansible和ansible-vault来配置用户。这是我目前的目录结构:

|-- ansible-test.out
|-- group_vars
|-- inventory
|-- roles
|   |-- bsd_sudoers
|   |   |-- tasks
|   |   |-- templates
|   |   |   `-- cde-admins
|   |   `-- vars
|   `-- bsd_users
|       |-- files
|       |-- tasks
|       |   `-- main.yml
|       |-- templates
|       `-- vars
|           `-- all.yml
|-- site.retry
|-- site.yml
`-- vars
    `-- all.yml

这是我到目前为止我的剧本:

---
- name: Creating Users
  user:
    name: "{{ item.name }}"
    system : "{{ item.sudoer }}"
    shell: /bin/bash
    password: "{{ item.password }}"
    uid: "{{ item.uid }}"
    home: "{{ item.home }}"
  with_items: users

以下是我在ansible vault中的示例:

---
   vars:
     users:
       - name: 'foo'
         home: '/home/foo'
         key: 'ssh-rsa ....'
         password: '!!'
         bash: '/bin/bash'
         sudoer: yes
         uid: "2049"
         guid: '2049'
         group: admin

当我运行playbook时,始终会生成此错误消息:

fatal: [ansible-test]: FAILED! => {"failed": true, "msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'uid'\n\nThe error appears to have been in '/Users/ansible/playbooks/roles/bsd_users/tasks/main.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: Creating Users\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'uid'"}
    to retry, use: --limit @/Users/ansible/playbooks/site.retry

为什么总会发生这种情况?我的印象是Ansible自然会将加密的变量传递给我的剧本,但事实并非如此。

2 个答案:

答案 0 :(得分:1)

首先:

with_items: users应为with_items: "{{ users }}" <{3}}不再受支持了。

第二

无需在拱形文件中定义顶级vars dict,请使用:

---
users:
  - name: foo
    home: /home/foo
  - name: bar
    home: /home/bar

答案 1 :(得分:1)

正如康斯坦丁之前提到的,您需要通过命令行将变量文件包含为-e @vars/all.yml,或者将vars_files添加到剧本中。您还可以将all.yml文件添加到group_vars目录中,它将自动被选中。

关于您收到的第二条错误消息,从Ansible 2.4开始,在命令行提供密码的推荐方法是使用--vault-id。这可以是从id文件的路径到Ansible的@prompt以提示您输入密码,甚至是返回密码的脚本的路径。

在Ansible 2.4之前,您需要使用--ask-vault-pass--vault-password-file

您还可以在名为ansible.cfg的{​​{1}}中添加变量,您可以在其中定义保管库密码文件的位置(例如vault_password_file),因此您无需每次运行vault_password_file = /path/to/.vault_password_file时都指定它。从Ansible 1.7开始,此路径还可以指向将密码作为stdout返回的脚本。

如果这有助于回答您的问题,如果您能将其标记为已接受的答案,我将不胜感激。