Ansible "Alternative Directory Layout" 并使用保险库

Ansible with "Alternative Directory Layout" and using vaults

我正在尝试使用其中的 Alternative Directory Layout 和 ansible-vaults。 但是当我 运行 我的剧本时,保险库加密的变量无法用该目录结构解析。那么我做错了什么?

我执行通过:

ansible-playbook -i inventories/inv/hosts playbooks/inv/invTest.yml --check --ask-vault

这是我的结构:

.
├── inventories
│   ├── inv
│   │   ├── group_vars
│   │   │   ├── var.yml
│   │   │   └── vault.yml
│   │   └── hosts
│   └── staging
│       ├── group_vars
│       │   ├── var.yml
│       │   └── vault.yml
│       └── hosts
├── playbooks
│   ├── staging
│   │   └── stagingTest.yml
│   └── inv
│       ├── invTest.retry
│       └── invTest.yml
└── roles
    ├── basic-linux
    │   ├── defaults
    │   │   └── main.yml
    │   └── tasks
    │       └── main.yml
    ├── test
    │   ├── defaults
    │   │   └── main.yml
    │   └── tasks
    │       └── main.yml
    └── webserver
        ├── defaults
        │   └── main.yml
        ├── files
        ├── handler
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        └── templates

这是我的主机文件 (inventories/inv/hosts):

[inv]
testvm-01    ansible_ssh_port=22    ansible_ssh_host=172.16.0.101    ansible_ssh_user=root
testvm-02    ansible_ssh_port=22    ansible_ssh_host=172.16.0.102    ansible_ssh_user=root

剧本(playbooks/inv/invTest.yml):

---
  - name: this is test
    hosts: inv
    roles:
      - { role: ../../roles/test }
...

使用保险库加密 var 的角色 (roles/test/tasks/main.yml):

---
  - name: create test folder
    file:
        path: "/opt/test/{{ app_user }}/"
        state: directory
        owner: "{{ default_user }}"
        group: "{{ default_group }}"
        mode: 2755
        recurse: yes
...

var 指向 vault (inventories/inv/group_vars/var.yml):

---
app_user: '{{ vault_app_user }}'
app_pass: '{{ vault_app_pass }}'
...

库文件(ansible-vault edit inventories/inv/group_vars/vault.yml):

vault_app_user: itest
vault_app_pass: itest123

我收到的错误消息是这样的:

FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: {{ app_user }}: 'app_user' is undefined\n\nThe error appears to have been in 'roles/test/tasks/main.yml': but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: create test folder\n ^ here\n"}

您在存储在 group_vars 文件夹中的名为 var.yml 的文件中定义了变量 app_user

在您的执行行中,您指向 inventories/inv/hosts 作为您的清单目录。

您在此路径中使用的字符串并不重要——从 Ansible 的角度来看,它只看到:

hosts
group_vars
├── var.yml
└── vault.yml

对于名为 var 的主机组,它将读取 var.yml,对于名为 vault 的主机组,它将读取 vault.yml

在你的情况下——永远不会。


您可能希望以这种方式组织文件:

inventories
└── production
    ├── group_vars
    │   └── inv
    │       ├── var.yml
    │       └── vault.yml
    └── hosts

这样,组 inv 中的主机将读取 group_vars/inv 中的文件。