Ansible:剧本在角色目录中的目录中调用角色

Ansible: playbook calling Role in a directory that is in the roles directory

我想调整我的 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 tower(所以我正在寻找替代解决方案)。

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

中所述在项目 ansible.cfg 中设置 roles_path

根据你的例子:

目录树:

ansible/
├── hosts
│   └── dev
├── plays
│   └── java_plays
│       └── java.yml
└── roles
    ├── java
    │   └── java_role1
    │       └── tasks
    │           └── main.yml
    └── role1
        └── tasks
            └── main.yml

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

plays/java_plays/java.yml:

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

出于测试目的,这些角色仅打印调试消息。

role1/tasks/main.yml:

---
- 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: ../../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

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

[默认值]

roles_path = /etc/ansible/roles: :

或者您的情况:

[默认值]

roles_path = /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/

在我的例子中,我通过 运行 ln -s ../roles playbooks/roles

创建了符号链接