11

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

4

3 回答 3

22

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

根据您的示例:

目录树:

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

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

播放/java_plays/java.yml:

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

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

角色1/tasks/main.yml:

---
- debug: msg="Inside role1"

devhosts 文件只是将 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
于 2016-05-21T11:51:47.027 回答
5

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

我的目录结构如下:

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

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

于 2017-09-28T13:35:08.053 回答
4

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

[默认值]

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

或者在你的情况下:

[默认值]

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

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

于 2017-03-10T16:03:44.000 回答