2017-10-05 173 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形式返回密碼的腳本。

如果這有助於回答您的問題,我將不勝感激,如果您可以將其標記爲接受的答案。