Ansible vault未正确传递到剧本

Ansible vault未正确传递到剧本,ansible,Ansible,我正在尝试使用ansible和ansible vault为用户提供服务。这是我当前的目录结构: |-- ansible-test.out |-- group_vars |-- inventory |-- roles | |-- bsd_sudoers | | |-- tasks | | |-- templates | | | `-- cde-admins | | `-- vars | `-- bsd_users | |-- files |

我正在尝试使用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
fatal:[ansible测试]:失败!=>{“failed”:true,“msg”:"该任务包含一个带有未定义变量的选项。错误是:“ansible.utils.unsafe\u proxy.AnsibleUnsafeText对象”没有属性“uid”\n\n错误似乎出现在“/Users/ansible/playbooks/roles/bsd\u Users/tasks/main.yml”:第2行第3列,但根据确切的语法问题,可能\n出现在文件的其他位置。\n\n有问题的Ing行似乎是:\n\n---\n-name:正在创建用户\n^此处\n\n异常类型:\n异常:“ansible.utils.unsafe\u proxy.AnsibleUnsafeText对象”没有属性“uid”}
要重试,请使用:--limit@/Users/ansible/playbooks/site.retry
为什么总是发生这种情况?我的印象是Ansible会自然而然地将加密变量传递给我的剧本,但事实似乎并非如此。

首先:

带有_项:用户
应该是
带有_项:“{{users}}”

不再支持

第二:

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

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

正如Konstantin之前提到的,您需要通过命令行将变量文件包括为
-e@vars/all.yml
,或者通过将
vars\u文件添加到剧本中。您还可以将
all.yml
文件添加到
group\u vars
目录中,并且它将被自动拾取

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

在Ansible 2.4之前,您需要使用
--询问保险库通行证
--保险库密码文件

您还可以在
ansible.cfg
中添加名为
vault\u password\u file
的变量,从中可以定义vault密码文件的位置(例如
vault\u password\u file=/path/to/.vault\u password\u file
),因此您无需每次运行
ansible playbook
时都指定它。从ansible 1.7开始,此路径还可以指向一个脚本,该脚本将密码作为stdout返回


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

我会告诉您,我得到的用户未定义您的Vault vars文件位于何处?抱歉,我不是交互式调试器:-/请注意错误消息。是的,很抱歉,我敲定了这些错误消息,我尝试了我已经查过了,上面什么都找不到,这就是它把我带到这里来的原因