2016-05-20 15 views
3

Ich möchte meine Verzeichnisstruktur meiner ansible Rollen und Playbooks gestalten.Ansible: playbook calling Rolle in einem Verzeichnis, das sich im Rollenverzeichnis befindet

Derzeit habe ich eine Verzeichnisstruktur wie.

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) 

Ich möchte auf die Rolle java_role1 im Spiel aufrufen können deploy_fun_java_stuff.yml

I

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

nennen kann, aber ich kann nicht sagen (ich habe mehrere Möglichkeiten ausprobiert). Ist das möglich? zusammen mit meinen Rollen


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

Was will ich wirklich erreichen ist in der Lage sein, meine Stücke in geordneter Weise zu strukturieren. Ich werde mit einer großen Anzahl von Rollen und Spielen enden, die ich gerne organisieren würde.

Ich kann dies mit einer separaten ansible.cfg Datei für jedes Play-Verzeichnis behandeln, aber ich kann diese CFG-Dateien nicht an Ansible Tower hinzufügen (also suche ich nach einer alternativen Lösung).

+0

Was mit 'java/java_role1' falsch? – ydaetskcoR

+0

Rolle nicht gefunden Fehler. zu beachten, es sucht nach der Rolle im Arbeitsverzeichnis, das ist .../plays/java_plays/' – Eddie

+0

java_role1 ist nicht in Rollen-Verzeichnis seine in/java /. Umzug in Rollen würde funktionieren, aber ich denke, Sie wollen in dieser Hierarchie richtig? –

Antwort

5

Ich denke, das Problem ist, dass Sie den relativen Pfad richtig einstellen müssen. Ansible wendet zuerst den angegebenen Pfad relativ zum Verzeichnis der aufgerufenen Playbooks an, sucht dann im aktuellen Arbeitspfad (von dem aus Sie den Befehl ansible-playbook ausführen) und checkt schließlich /etc/ansible/roles ein, sodass Sie in Ihrer Verzeichnisstruktur { role: ../../roles/java/java_role1 } oder { role: roles/java/java_role1 } anstelle von { role: java/java_role1 } verwenden können . Eine weitere Option wäre, die Pfade zu konfigurieren, in denen ansible nach Rollen sucht. Dazu können Sie die roles_path innerhalb Ihrer Projekte ansible.cfg wie in der Ansible docs beschrieben setzen.

Basierend auf Ihrem Beispiel:

Dir Baum:

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

es zu testen, würde das Spiel java_role1 und role1 umfassen.

Stücke/java_plays/java.yml:

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

Für diese Rollen einfach zu Testzwecken einen Debug-msg drucken.

role1/Aufgaben/main.yml:

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

Die dev hosts-Datei setzt einfach localhost auf die java Gruppe.Jetzt kann ich das Textbuch verwenden:

[email protected]:~/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 

jetzt das gleiche tun, wenn Sie verwenden { role: ../../roles/java/java_role1 } und { role: ../../roles/role1 } Ihre Log-Ausgabe in den TASK Klammern würde den gesamten relativen Pfad zeigen, anstatt nur die Rollennamen:

[email protected]:~/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 
+0

Danke, danke! – Eddie

1

eine weitere Option und eine, die ich benutze, ist eine ansible.cfg Datei in Ihrem Textbuch-Verzeichnis zu erstellen und den folgenden darin platzieren:

[defaults]

roles_path =/etc/ansible/Rollen:

oder in Ihrem Fall:

[defaults]

roles_path =/etc/ansible/Rollen:/etc/ansible/Rollen/java

Verwenden Sie dann keine relativen Pfade.

1

Eine elegantere Lösung (imo) ist die Symlinking Ihres Rollenverzeichnisses innerhalb des Verzeichnisses Playbooks.

Meine Verzeichnisstruktur ist wie folgt:

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

In meinem Fall habe ich den Symlink von ln -s ../roles playbooks/roles läuft