首页 文章

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

提问于
浏览
4

我想塑造我的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:部署有趣的java东西
    hosts:java
    角色:
  • {role:java / java_role1}

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

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

3 回答

  • 2

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

    我的目录结构如下:

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

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

  • 1

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

    根据你的例子:

    Dir tree:

    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
    
  • 8

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

    [默认]

    roles_path = / etc / ansible / roles ::

    或者在你的情况下:

    [默认]

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

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

相关问题