2017-10-05 79 views
0

我正在尝试使用ansible和ansible-vault来配置用户。这是我目前的目录结构:Ansible-vault没有正确传递到playbook

|-- 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库样本:

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

当我运行剧本时,总会生成以下错误消息:

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自然会将加密变量传递给我的剧本,但似乎并非如此。

回答

1

第一:

with_items: users应该with_items: "{{ users }}"
Bare variables不再支持。

二:

没有必要定义顶级vars字典在拱形的文件,请使用:

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

我会给你一个漩涡 – ryekayo

+0

现在我得到的用户没有定义 – ryekayo

+0

你的拱形变量文件位于哪里? –

1

随着康斯坦丁之前提到的,你需要包含变量文件或者经由-e @vars/all.yml命令行,或者将vars_files添加到剧本中。您还可以将all.yml文件添加到group_vars目录中,并且它会自动提取。

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

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

您还可以在ansible.cfg命名vault_password_file,在这里你可以定义库的密码文件(例如vault_password_file = /path/to/.vault_password_file)的位置添加一个变量,所以你不需要每次运行ansible-playbook时指定。从Ansible 1.7开始,此路径也可以指向一个以stdout形式返回密码的脚本。

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