Ansible:playbook在角色目录

时间:2016-05-20 20:12:33

标签: 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)

我希望能够在游戏java_role1

中调用角色deploy_fun_java_stuff.yml

我可以打电话

 ---
 - name: deploy fun java stuff
   hosts: java
   roles:
    - { role: role1 }

但是我不能打电话(我已尝试过多种方式)。这可能吗?

  
 - name: deploy fun java stuff
   hosts: java
   roles:
    - { role: java/java_role1 }

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

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

3 个答案:

答案 0 :(得分:9)

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

根据您的示例:

目录树

ansible.cfg

为了测试它,该剧将包括ansible/ ├── hosts │   └── dev ├── plays │   └── java_plays │   └── java.yml └── roles ├── java │   └── java_role1 │   └── tasks │   └── main.yml └── role1 └── tasks └── main.yml java_role1

<强>起着/ java_plays / java.yml:

role1

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

<强>基于role1 /任务/ main.yml:

---
 - name: deploy java stuff
   hosts: java
   roles:
    - { role: roles/role1 }
    - { role: roles/java/java_role1 }

--- - debug: msg="Inside role1" hosts文件只将localhost设置为dev组。现在我可以使用剧本了:

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: ../../roles/role1 }时,您的日志输出会显示整个相对路径,而不仅仅是角色名称:

TASK

答案 1 :(得分:3)

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

[默认]

roles_path = / etc / ansible / roles ::

或在你的情况下:

[默认]

roles_path = / etc / ansible / roles:/ etc / ansible / roles / java

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

答案 2 :(得分:1)

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

我的目录结构如下:

inventory/
playbooks/
  |-> roles -> ../roles
  |-> group_vars -> ../group_vars
  |-> host_vars -> ../host_vars
roles/
group_vars/
host_vars/

就我而言,我通过运行ln -s ../roles playbooks/roles

创建了符号链接