2016-07-01 2 views
2

ich den Zielserver-Umgebung auf der Befehlszeile angeben, z.B .: meine Playbooks laufenMerging gemeinsamen Parameter mit umgebungsspezifischen Parameter in ansible

ansible-playbook -e env=staging playbook.yml

Jetzt habe ich in der Lage sein wollen, Parameter zu liefern, zum Beispiel Wörterbuch von Benutzern auf dem Server auf solche Weise zu erstellen, dass es gemeinsame für alle Umgebungen gibt, und auch Benutzer, die spezifische bis sind, dass eine Umgebung für die ich das Playbook laufen.

Die Verzeichnisstruktur könnte wie folgt aussehen:

├── group_vars 
│   ├── all 
│   │   ├── users.yml 
│   │   
│   ├── development 
│   │   ├── users.yml 
│   │   
│   ├── production 
│   │   ├── users.yml 
│   │   
│   └── staging 
│    ├── users.yml 

Ich dachte zunächst, dass eine Einrichtung wie diese würde die Arbeit machen. Allerdings sind die users.yml Wörterbücher für jede Umgebung nie mit all/users.yml fusionierte

ansible-playbook -e env=production playbook.yml würde nur lesen von production/users.yml.

Wie kann ich Ansible Merge users.yml aus bestimmten Umgebungen mit all/users.yml haben - so dass ich immer die gemeinsamen und env-spezifischen Benutzer erstellt haben?

+1

Mögliches Duplikat (http://stackoverflow.com/questions/35554415/in-ansible-ho w-to-kombinieren-Variablen-von-separaten-Dateien-in-One-Array) – ydaetskcoR

Antwort

2

Standardmäßig überschreibt Ansible Hash/Dictionary-Werte mit ihren Äquivalenten, die eine höhere Priorität haben.

Sie können dies überschreiben, indem Sie die hash_behaviour Option in ansible.cfg ändern, wenn Sie wirklich wollen, aber ich würde vorschlagen, auf einer solchen globalen Ebene dagegen.

Stattdessen könnten Sie Ihre Benutzer wie folgt definieren:

users: 
    name: dev-foo 
    ... 

und dann auch eine all_users Variable in allen group_vars wie folgt definiert haben:

all_users: 
    name: common-foo 
    ... 

Und dann könnte man die Variablen entweder combine Verwenden Sie eine set_fact Aufgabe, um die zusammengeführte Variable wie folgt zu erstellen:

name: combine users 
set_fact: 
    combined_users: '{{ users | combine(all_users) }}' 

Oder man könnte es direkt in der Aufgabe verbinden, wo Sie beabsichtigen, es zu benutzen:

name: create users 
user: 
    name: {{ item.name }} 
    ... 
with_items: '{{ users | combine(all_users) }}' 

Wenn Sie einfach zu kombinieren 2 Listen versuchen Sie diese mit einfacher Addition der Listen können:

name: combine users 
set_fact: 
    combined_users: '{{ users + all_users }}' 

Oder einfach direkt: [? In ansible, wie Variablen aus separaten Dateien in ein Array kombinieren]

name: create users 
user: 
    name: {{ item.name }} 
    ... 
with_items: users + all_users 
+0

große Antwort, danke – luqo33