Ansible 替代目录结构需要路径

Ansible Alternative directory structure requires paths

我正在尝试从 Ansible 文档 site 最佳实践部分创建 替代目录布局

按照此指导,这是我在 ~/ansible_proj/windows_setup 中创建的布局(windows_setup 是一个 Python 虚拟环境):

.venv
inventories/
   production/
      hosts
      group_vars/
         windows
            windows.yml
            vault

windows_configure.yml

roles/
    role1/
    role2/
    role3/
    role4/

.gitignore # this contains 1 line produced by: echo 'vault' >> .gitignore

当我尝试 运行 剧本 windows_configure.yml 时,按照建议 here(参见第一个示例),使用

$ (.venv) cd ~/ansible_proj/windows_setup
$ (.venv) user@sname: ~/ansible_proj/windows_setup$ ansible-playbook
                      -i production windows_configure.yml --ask-vault-pass

错误是

Unable to parse /.../production as an inventory source

production hosts list is empty, only localhost is available

我必须指明 hosts 文件的路径,而不是像:

$ (.venv) user@sname: ~/ansible_proj/windows_setup$ ansible-playbook
                       -i inventories/production/hosts windows_configure.yml --ask-vault-pass

为了运行。

Q1. 如何使用 替代目录布局 到 运行 playbooks 通过使用 production (正如文档所建议的那样)而不是 inventories/production/hosts?


在相同的目录结构中,如果我将 windows_configure.yml 放在 playbooks/ 中,而 运行 则为:

$ (.venv) user@sname: ~/ansible_proj/windows_setup$ ansible-playbook
                      -i inventories/production/hosts playbooks/windows_configure.yml
                      --ask-vault-pass

然后我得到这个错误

ERROR: the role 'role1' was not found in /.../playbooks/roles:/.../playbooks

Q2. 在这个替代目录结构中,是否可以将所有剧本放在 playbooks 目录中?


编辑

我试过 adding ansible.cfg to the current directory (~/ansible_proj/windows_setup)(其中还包含剧本 windows_configure.yml。这里是 ansible.cfg:

[defaults]
inventory  = ~/ansible_proj/windows_setup/inventories/production
roles_path = ~/ansible_proj/windows_setup

当我运行

$ (.venv) cd ~/ansible_proj/windows_setup
$ (.venv) user@sname: ~/ansible_proj/windows_setup$ ansible-playbook
                      -i production windows_configure.yml --ask-vault-pass

出现同样的错误

Unable to parse /.../production as an inventory source

production hosts list is empty, only localhost is available

仅针对 Q1.

似乎在 this github issue 中讨论了这个问题 - 解决方案是使用 inventories/production。我测试了这个(当前目录中没有任何 ansible.cfg 文件)并且它有效:

$ (.venv) user@sname: ~/ansible_proj/windows_setup$ ansible-playbook
                      -i inventories/production windows_configure.yml --ask-vault-pass

对于 Q2.:

看起来符号 links 可能是一种方法 - 我不想这样做,所以我将剧本留在根项目目录中,而不是 playbooks 目录中。但是,这里有一些基于符号 link 的解决方案:1, 2。我不确定是否有其他方法可以解决此问题。