(Bezogen auf Rückrufe oder Hooks und wiederverwendbare Aufgabenserien in Ansible-Rollen ):
Gibt es eine bessere Möglichkeit, an eine Liste anzuhängen oder einem Wörterbuch in Ansible einen Schlüssel hinzuzufügen, als (ab) einen jina2-Vorlagenausdruck zu verwenden?
Ich weiß, dass Sie so etwas tun können:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
Aber gibt es wirklich keine Meta-Aufgabe oder einen Helfer dafür?
Es fühlt sich zerbrechlich an, scheint undokumentiert zu sein und basiert auf vielen Annahmen darüber, wie Variablen in Ansible funktionieren.
Mein Anwendungsfall sind mehrere Rollen (Datenbankservererweiterungen), die jeweils eine Konfiguration für eine Basisrolle (den Datenbankserver) benötigen. Es ist nicht so einfach, eine Zeile an die Konfigurationsdatei des Datenbankservers anzuhängen. Jede Änderung gilt für dieselbe Zeile , z. B. die Erweiterungen, bdr
und pg_stat_statements
muss in einer Zielzeile erscheinen:
shared_preload_libaries = 'bdr, pg_stat_statements'
Ist dies die Ansible-Methode, um die Konfigurationsdatei nur mehrere Male (einmal pro Erweiterung) mit einem regulären Ausdruck zu verarbeiten, der den aktuellen Wert extrahiert, analysiert und dann neu schreibt? Wenn ja, wie macht man das über mehrere Läufe hinweg idempotent?
Was ist, wenn die Konfiguration schwerer zu analysieren ist und es nicht so einfach ist, einen anderen durch Kommas getrennten Wert anzufügen? Denken Sie an XML-Konfigurationsdateien.
Antworten:
Sie können mit zwei Listen in einer Variablen zusammenführen
+
. Angenommen, Sie haben einegroup_vars
Datei mit folgendem Inhalt:Und es wird in einer Vorlage verwendet
pgsql.conf.j2
wie:Sie können dann wie folgt Erweiterungen an die Testdatenbankserver anhängen:
Wenn die Rolle auf einem der Testserver ausgeführt wird, werden die zusätzlichen Erweiterungen hinzugefügt.
Ich bin mir nicht sicher, ob dies auch für Wörterbücher funktioniert, und achte auch auf Leerzeichen und ein baumelndes Komma am Ende der Zeile.
quelle
group_vars
, die Rollen können sich nicht um die Details des Einrichtens der Erweiterungen selbst kümmern. Das Anhängen von Variablen von Rollen , nach denen ich besonders suche, damit eine Rolle an eine Variable angehängt werden kann, die von einer anderen Rolle verfügbar gemacht wird.with_items
Satz auflösen konnte.Seit Ansible v2.x können Sie Folgendes tun:
Alles oben Genannte ist dokumentiert in: http://docs.ansible.com/ansible/playbooks_filters.html
quelle
u'(': u\"'\"}"
2.4.x
(FIXED)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. Der undefinierte Fehler tritt auf, wenn ein Teil der Filterung verwendet wird oder keine Ergebnisse registriert werden.Sie müssen die Schleife in 2 teilen
und addhost.yml
quelle
Sie sind sich nicht sicher, wann sie dies hinzugefügt haben, aber zumindest für Wörterbücher / Hashes (NICHT Listen / Arrays) können Sie die Variable hash_behaviour folgendermaßen festlegen :
hash_behaviour = merge
in Ihremansible.cfg
.Ich habe einige Stunden gebraucht, um versehentlich über diese Einstellung zu stolpern: S
quelle
Fast alle Antworten hier erfordern Änderungen in den Aufgaben, aber ich musste Wörterbücher in der VAR-Definition dynamisch zusammenführen, nicht während der Ausführung.
ZB möchte ich einige gemeinsam genutzte Variablen definieren
all
group_vars
und sie dann in eine anderegroup
oder eine andere erweiternhost_vars
. Sehr nützlich bei der Arbeit für Rollen.Wenn Sie versuchen, den Filter
combine
oder zu verwenden, derunion
die ursprüngliche Variable in var-Dateien überschreibt, werden Sie während des Vorlagenvorgangs in einer Endlosschleife enden. Daher habe ich diese Problemumgehung erstellt (dies ist keine Lösung).Sie können mehrere Variablen basierend auf einem Namensmuster definieren und diese dann automatisch in die Rolle laden.
group_vars/all.yml
group_vars/group1.yml
Rollencode-Snippet
do_some_stuff.yml
Es ist nur ein Ausschnitt, aber Sie sollten wissen, wie es funktioniert. hinweis: lookup ('varnames', '') ist seit ansible 2.8 verfügbar
Ich denke, es wäre auch möglich, alle Variablen
dictionary_of_bla.*
zur Laufzeit mit derselben Suche in einem Wörterbuch zusammenzuführen.Der Vorteil dieses Ansatzes besteht darin, dass Sie keine exakten Listen mit Variablennamen festlegen müssen, sondern dass nur das Muster und der Benutzer es dynamisch festlegen können.
quelle
Ansible
ist ein Automatisierungssystem und unterscheidet sich in Bezug auf die Verwaltung von Konfigurationsdateien nicht wesentlich vonapt
. Der Grund, warum immer mehr Software die Funktion zum Lesen von Konfigurationsausschnitten aus einemconf.d
Verzeichnis anbietet, besteht darin, dass solche Automatisierungssysteme unterschiedliche Pakete / Rollen zur Konfiguration der Software hinzufügen können. Ich glaube, dass es nicht die Philosophie ist, dasAnsible
zu tun, was Sie vorhaben, sondern denconf.d
Trick anzuwenden . Wenn die zu konfigurierende Software diese Funktionalität nicht bietet, sind Sie möglicherweise in Schwierigkeiten.Da Sie XML-Konfigurationsdateien erwähnen, nutze ich die Gelegenheit, um ein bisschen zu jammern. Es gibt einen Grund für die Unix-Tradition, Konfigurationsdateien im Klartext zu verwenden. Binäre Konfigurationsdateien eignen sich nicht gut für die Systemautomatisierung, sodass Sie bei jeder Art von Binärformat Probleme haben und wahrscheinlich ein Programm für die Konfiguration erstellen müssen. (Wenn jemand der Meinung ist, dass XML ein reines Textformat ist, sollte er sein Gehirn untersuchen lassen.)
Nun zu Ihrem spezifischen
PostgreSQL
Problem.PostgreSQL
unterstützt denconf.d
Trick. Zunächst würde ich prüfen, obshared_preload_libraries
mehrmals angegeben werden kann. Ich habe keinen Hinweis in der Dokumentation gefunden, dass es geht, aber ich würde es trotzdem versuchen. Wenn es nicht mehrmals angegeben werden kann, würde ich denPostgreSQL
Jungs mein Problem erklären, falls sie Ideen haben; Dies ist einPostgreSQL
Problem und keinAnsible
Problem. Wenn es keine Lösung gibt und ich die verschiedenen Rollen wirklich nicht zu einer zusammenführen könnte, würde ich ein System implementieren, um die Konfiguration auf dem verwalteten Host zu kompilieren. In diesem Fall würde ich wahrscheinlich ein Skript/usr/local/sbin/update_postgresql_config
erstellen,/etc/postgresql/postgresql.conf.jinja
in das kompiliert wird/etc/postgresql/9.x/main/postgresql.conf
. Das Skript würde die gemeinsam genutzten Preload-Bibliotheken von/etc/postgresql/shared_preload_libraries.txt
einer Bibliothek pro Zeile lesen und sie Jinja zur Verfügung stellen.Dies ist für Automatisierungssysteme nicht ungewöhnlich. Ein Beispiel ist das Debian-
exim4
Paket.quelle
conf.d
Include-Mechanismus und verwendet dankenswerterweise Klartextdateien. Es gibt jedoch einige Konfigurationsoptionen, bei denen mehrere Erweiterungen Meinungen dazu haben können - z. B. "Erhöhen Sie max_wal_senders um 10 gegenüber dem vorherigen Wert".