Ansible-vault 未正确传递到剧本

标签 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 保险库中的示例:

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

最佳答案

正如 Konstantin 之前提到的,您需要通过命令行以 -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 中添加一个名为 vault_password_file 的变量,您可以在其中定义保管库密码文件的位置(例如 vault_password_file =/path/to/.vault_password_file),因此您无需在每次运行 ansible-playbook 时指定它。从 Ansible 1.7 开始,此路径还可以指向将密码作为 stdout 返回的脚本。

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

关于Ansible-vault 未正确传递到剧本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46588095/

相关文章:

Ansible,删除除 X 个最新文件夹之外的所有内容

java - Ansible 以 "nohup"终止我的应用程序

ansible - 使用 Ansible 安装 snap 包

Ansible 在类似 linux 的操作系统上回答一个问题,我需要用 yes 来回答

sorting - 根据Ansible中的特定值对dict进行排序

postgresql - 使用 Ansible 运行 PostgreSQL 脚本

ansible 如何将现有主机添加到组

ansible从json文件中读取变量

amazon-web-services - 使用 packer 和 ansible 时获取 AWS 实例的 IP 地址

docker - 使用 Ansible 部署 Docker 镜像