2016-04-29 6 views
2

Ist es möglich, eine Ansible-Inventarvariable zu erstellen, die nicht mit einem Inventarhost oder einer Inventargruppe verknüpft ist, sondern mit der Serverebene, auf der das Playbook ausgeführt wird? Ich habe eine Ansible-Rolle, die das libffi-dev-Paket mit APT installiert, aber ich möchte vielleicht eine andere Version dieses Pakets auf jeder Server-Ebene installieren. Ich habe zu diesem Zweck eine Variable "libffi-dev_ver" erstellt. Ich habe auch die Inventardateien "Entwicklung", "Inszenierung" und "Produktion", die jeder meiner Tiers entsprechen.Wie wird eine Inventory-spezifische Inventarvariable festgelegt?

Hauptaufgabe der Meine Rolle, die von meinem Haupt site.yml Textbuch genannt wird, überprüft die Version Variable, die Rolle zu laufen, bevor vorhanden ist:

# roles/misc_libs/tasks/main.yml 
- include: check_vars.yml tags=misc_libs 
- include: misc_libs.yml tags=misc_libs 

check_vars.yml überprüft, um sicherzustellen, dass die Paketversion Variable vorhanden :

# roles/misc_libs_tasks/check_vars.yml 
- name: check that required role variables are set 
    fail: msg="{{ item }} is not defined" 
    when: not {{ item }} 
    with_items: 
    - libffi-dev_ver 

die misc_libs Rolle tatsächlich nutzt diese Variable das Paket zu installieren:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 

Meine Datei Entwicklung Inventar sieht wie folgt aus:

# development 
[webservers] 
web01.example.com ansible_ssh_host=<ip_address> 

[dev:children] 
webservers 

[webservers:vars] 
libffi-dev_ver="3.1-2+b2" 

Wenn ich diesen Befehl ausführen:

ansible-playbook -i development site.yml -l webservers 

ich diesen Fehler ansible:

fatal: [web01.example.com] => error while evaluating conditional: not libffi-dev_ver 

Was ist der richtige Weg zu erklären, eine Paketversionsvariable wie diese in Ansible? Der Wert der Variablen hängt von der Serverebene ab, die angibt, dass sie in eine Inventardatei passt, da Inventardateien für die Serverebene spezifisch sind. Alle Inventarvariablen scheinen jedoch mit einem Host oder einer Gruppe verknüpft zu sein. Ich habe das getan, aber die Rolle sieht die Variable immer noch nicht. Ich könnte der Rolle, die die Serverschicht erkennt, eine Aufgabe hinzufügen und die Variable mit einer "Wenn" -Konditionalität festlegen, aber diese Lösung scheint hässlich zu sein, denn wenn Sie mehrere Pakete in einer Rolle installieren, benötigen Sie jeweils drei Bedingungen Paketversionsvariable Ich habe die Ansible-Dokumentation durchgelesen und zahlreiche Blog-Posts über das Einrichten mehrstufiger Playbooks gelesen, aber ich sehe nicht, dass diese spezielle Situation angesprochen wird. Was ist der richtige Weg, um eine tierspezifische Variable wie folgt zu deklarieren?

+0

Ich verstehe nicht, was Sie versuchen zu erreichen. Warum ist: # Rollen/misc_libs/Aufgaben/misc_libs.yml - Name: installieren libffi-dev apt:> PKG = libffi-dev = {{libffi-dev_ver}} update_cache = yes cache_valid_time = 3600 werden: True wenn: libffi-dev_ver ist definiert nicht genug? –

Antwort

3

Das Problem war, dass die Variable 'libffi-dev_ver', die ich deklariert habe, tatsächlich eine Jinja2 identifier ist, die Python 2.x Namensregeln einhalten muss. Das '-' (Bindestrich) ist ein ungültiges Zeichen gemäß diesen Regeln. Sobald ich es zu einem '_' (Unterstrich) änderte, bekam ich den Fehler nicht mehr.

Auch das check_vars.yml playbook ist eigentlich unnötig. Es gibt eine Ansible-Konfigurationsvariable error_on_undefined_vars, die dazu führt, dass Schritte, die eine undefinierte Variable enthalten, fehlschlagen. Da dies standardmäßig der Fall ist, muss check_vars.yml nicht ausgeführt werden, da alle Variablen bereits überprüft werden.

Eine Stelle zum Deklarieren von Server-Tier-spezifischen Variablen scheint sich in einer Datei im Verzeichnis group_vars zu befinden, die denselben Namen wie die Gruppe hat, die nach dieser Ebene in Ihrer Inventardatei benannt ist. Also in meinem Fall enthält meine 'Entwicklung' Inventardatei eine 'dev' Kindgruppe. Diese Gruppe enthält den Webserver, auf dem ich das Paket libffi-dev installieren möchte.Daher habe ich eine Datei 'group_vars/dev' erstellt und eine Variable in dieser Datei namens 'libffi_dev_ver' deklariert, auf die ich in meinem misc_libs.yml-Playbook verweisen kann.

0

Ich bekomme nicht, was Sie versuchen zu erreichen. Warum ist:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 
    when: libffi-dev_ver is defined 

nicht genug?

+0

Ich könnte das tun, aber das ist nicht relevant für meine Frage. Selbst wenn ich das mache, was Sie vorschlagen, wird es nicht gefunden. Ich habe die zusätzliche check_vars.yml für den Fall, dass ich eine Reihe von Paketen mit einer with_items-Direktive installiere, die ich woanders in meinem Code mache. Es ist sauberer so. – William

+0

Nun sauberer könnte es sein, wenn es funktioniert ;-) Tatsächlich ist die Syntax deiner check_vars mir zweifelhaft, ich würde erwarten, dass du das moralische Äquivalent eines 'eval' dazu brauchst - ob jinja2 es hat, Ich weiß nicht. –