1

我正在尝试在其中使用替代目录布局和 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 }
...

使用 Vault 加密的 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 (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": true, "msg": "'args' 字段的值无效,似乎包含未定义的变量。错误为:{{ app_user }}: 'app_user' 未定义\ n\n错误似乎出现在“roles/test/tasks/main.yml”中:但可能\n在文件中的其他位置,具体取决于确切的语法问题。\n\n有问题的行似乎是:\n\n \n - 名称:创建测试文件夹\n ^ here\n"}

4

1 回答 1

3

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

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

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

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

它将读取var.yml一个名为的主机组varvault.yml一个名为 的主机组vault

在你的情况下 - 从来没有。


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

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

这样,group_vars/inv将为 group 中的主机读取文件inv

于 2017-10-24T12:27:04.073 回答