Ansible:playbook在roles目录中的目录中调用Role

Edd*_*die 5 ansible ansible-playbook ansible-tower

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

目前我有一个类似的目录结构.

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)
Run Code Online (Sandbox Code Playgroud)

我希望能够java_role1在戏剧中扮演这个角色deploy_fun_java_stuff.yml

我可以打电话

 ---
 - name: deploy fun java stuff
   hosts: java
   roles:
    - { role: role1 }
Run Code Online (Sandbox Code Playgroud)

但我不能打电话(我尝试了多种方式).这可能吗?


 - name: deploy fun java stuff
   hosts: java
   roles:
    - { role: java/java_role1 }
Run Code Online (Sandbox Code Playgroud)

我真正想要实现的是能够以有序的方式和我的角色一起构建我的戏剧.我最终会有大量的角色和戏剧,我想组织它们.

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

fis*_*x01 11

我认为问题是你需要正确设置相对路径.Ansible首先应用相对于被调用的playbooks目录的给定路径,然后查看当前工作路径(从中执行ansible-playbook命令)并最终检入/etc/ansible/roles,因此{ role: java/java_role1 }您可以使用{ role: ../../roles/java/java_role1 }或代替在您的目录结构中{ role: roles/java/java_role1 }.另一种选择是配置ansible正在寻找角色的路径.为此,您可以按照Ansible文档中的描述设置roles_path项目内部.ansible.cfg

根据你的例子:

桐树:

ansible/
??? hosts
?   ??? dev
??? plays
?   ??? java_plays
?       ??? java.yml
??? roles
    ??? java
    ?   ??? java_role1
    ?       ??? tasks
    ?           ??? main.yml
    ??? role1
        ??? tasks
            ??? main.yml
Run Code Online (Sandbox Code Playgroud)

为了测试它,该剧将包括java_role1role1.

播放/ java_plays/java.yml:

---
 - name: deploy java stuff
   hosts: java
   roles:
    - { role: roles/role1 }
    - { role: roles/java/java_role1 }
Run Code Online (Sandbox Code Playgroud)

出于测试目的,这些角色只需打印调试消息.

基于role1 /任务/ main.yml:

---
- debug: msg="Inside role1"
Run Code Online (Sandbox Code Playgroud)

devhosts文件简单地设置本地主机到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
Run Code Online (Sandbox Code Playgroud)

现在做同样的,当您使用{ role: ../../roles/java/java_role1 }{ role: ../../roles/role1 }里面的日志输出TASK支架将呈现整体相对路径,而不是仅仅的角色名:

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
Run Code Online (Sandbox Code Playgroud)


小智 10

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

[defaults]

roles_path = /etc/ansible/roles: <custom path 1>: <custom path 2>
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

[defaults]

roles_path = /etc/ansible/roles:/etc/ansible/roles/java
Run Code Online (Sandbox Code Playgroud)

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


Rys*_*aum 7

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

我的目录结构如下:

存货/
剧本/
  |-> 角色 -> ../角色
  |-> group_vars -> ../group_vars
  |-> 主机变量 -> ../主机变量
角色/
组变量/
主机变量/

就我而言,我通过运行创建了符号链接ln -s ../roles playbooks/roles