Ansible:在角色目录中的目录中调用角色的playbook

Ansible:在角色目录中的目录中调用角色的playbook,ansible,ansible-playbook,ansible-tower,Ansible,Ansible Playbook,Ansible Tower,我想塑造我的角色和剧本的目录结构 目前我有一个目录结构,如 group_vars * all * group-one - group-vars.yml - group-vault.yml ... host_vars - server1.yml plays - java_plays * deploy_fun_java_stuff.yml * deploy_playbook.yml roles - r

我想塑造我的角色和剧本的目录结构

目前我有一个目录结构,如

group_vars
    * all 
    * group-one
        - group-vars.yml
        - group-vault.yml
    ...
host_vars
  - server1.yml
plays
    - java_plays
       * deploy_fun_java_stuff.yml
    * deploy_playbook.yml
roles
    - role1 
            - tasks
               * main.yml
            - handlers 
            - (the rest of the needed directories)
    - role2
    - java 
        - java_role1
            - tasks
               * main.yml
            - handlers 
            - (the rest of the needed directories)
我希望能够调用剧中的角色
java\u role1
deploy\u fun\u java\u stuff.yml

我可以打电话

 ---
 - name: deploy fun java stuff
   hosts: java
   roles:
    - { role: role1 }
但我不能打电话(我试过多种方法)。这可能吗


我真正想要完成的是能够按照我的角色有序地组织我的剧本。 我将以大量的角色和戏剧结束,我想组织他们


我可以为每个播放目录使用一个单独的ansible.cfg文件来处理这个问题,但我无法将这些cfg文件添加到ansible tower(因此我正在寻找替代解决方案)

我认为问题在于您需要正确设置相对路径。Ansible首先应用相对于调用的playbook目录的给定路径,然后查找当前工作路径(从中执行
Ansible playbook
命令),最后检入
/etc/Ansible/roles
,因此可以在dir结构中使用
{role:java/java\role1}
{role:../../roles/java/java\u role1}或
{role:roles/java/java\u role1}
。另一个选项是配置ansible查找角色的路径。为此,您可以在项目中设置
ansible.cfg
中所述的
角色路径

根据您的示例:

目录树:

ansible/
├── hosts
│   └── dev
├── plays
│   └── java_plays
│       └── java.yml
└── roles
    ├── java
    │   └── java_role1
    │       └── tasks
    │           └── main.yml
    └── role1
        └── tasks
            └── main.yml
---
 - name: deploy java stuff
   hosts: java
   roles:
    - { role: roles/role1 }
    - { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
为了测试它,该剧将包括
java_role1
role1

播放/java\u播放/java.yml:

ansible/
├── hosts
│   └── dev
├── plays
│   └── java_plays
│       └── java.yml
└── roles
    ├── java
    │   └── java_role1
    │       └── tasks
    │           └── main.yml
    └── role1
        └── tasks
            └── main.yml
---
 - name: deploy java stuff
   hosts: java
   roles:
    - { role: roles/role1 }
    - { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
出于测试目的,这些角色只需打印调试消息

role1/tasks/main.yml:

ansible/
├── hosts
│   └── dev
├── plays
│   └── java_plays
│       └── java.yml
└── roles
    ├── java
    │   └── java_role1
    │       └── tasks
    │           └── main.yml
    └── role1
        └── tasks
            └── main.yml
---
 - name: deploy java stuff
   hosts: java
   roles:
    - { role: roles/role1 }
    - { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
dev
hosts文件只是将localhost设置为
java

fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml

PLAY [deploy java stuff] *******************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [role1 : debug] ***********************************************
ok: [localhost] => {
    "msg": "Inside role1"
}

TASK [java_role1 : debug] *************************************
ok: [localhost] => {
    "msg": "Inside java_role1"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
现在,当您使用
{role:../../../roles/java/java_role1}
{role:../../role1}
时,您在
任务
括号内的日志输出将显示整个相对路径,而不仅仅是角色名称:

fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml

PLAY [deploy java stuff] *******************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [../../roles/role1 : debug] ***********************************************
ok: [localhost] => {
    "msg": "Inside role1"
}

TASK [../../roles/java/java_role1 : debug] *************************************
ok: [localhost] => {
    "msg": "Inside java_role1"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

我使用的另一个选项是在playbook目录中创建一个ansible.cfg文件,并在其中放置以下内容:

[默认值]

角色\路径=/etc/ansible/roles::

或者在您的情况下:

[默认值]

角色\路径=/etc/ansible/roles:/etc/ansible/roles/java

然后不要使用任何相对路径。

更优雅的解决方案(imo)是将角色目录符号链接到playbooks目录中

我的目录结构如下:

inventory/ playbooks/ |-> roles -> ../roles |-> group_vars -> ../group_vars |-> host_vars -> ../host_vars roles/ group_vars/ host_vars/ 存货/ 剧本/ |->角色->../roles |->组变量->组变量 |->主机变量->主机变量 角色/ 组变量/ 东道主/
在我的例子中,我通过运行
ln-s../roles playbooks/roles

创建了符号链接
java/java\u role1
?Role not found error。注意,它正在查找工作目录中的角色,
../plays/java\u plays/
java\u role1不在其/java/中的角色目录中。移动到角色将起作用但我想你想加入这个阶层,对吧?