yourlabs.remember
yourlabs.erinnern
`````````````````
Meta-Rolle für Ansible Automatisierungsarchitekten.
Diese Rolle sorgt dafür, dass die Ansible Rollen-Workflows intelligenter werden:
- massive Geschwindigkeitssteigerung: Benötige eine Abhängigkeitsrolle einmal und nur einmal
- inventarfreies Dry: Merke dir Variablen, die von der CLI auf dem Host eingefügt werden
- CLI-Variablenaufforderung: Interaktive Fragen an den Benutzer zu Fakten
.. Hinweis:: Diese Rolle lädt nicht automatisch Abhängigkeitsrollen herunter: das ist die Aufgabe des bigsudo <https://pypi.org/project/bigsudo/>
_ Befehls.
Demo
Der einfachste Weg, es auszuprobieren::
pip install --user bigsudo ~/.local/bin/bigsudo yourlabs.fqdn user@somehost
Oder wenn du dich mutig fühlst (Überspringe den Hostnamen für localhost)
~/.local/bin/bigsudo yourlabs.traefik
Natürlich könntest du auch ansible
-Befehle verwenden, aber dann wären es mehr
Befehle und Optionen. Wir lassen uns von der Praxis von kubectl inspirieren,
für kleine Server, nicht-HA-Dienste und Pizzateams. Wenn ich müßte,
würde ich persönlich dennoch bigsudo yourlabs.k8s
verwenden, um k8s-Instanzen zu konfigurieren...
Nutzung
Diese Rolle erlaubt es dir, die benötigten Variablen in deiner eigenen Rolle zu definieren, neben Dingen wie der Beschreibung, die dem Benutzer angezeigt wird, Standardwerten, RegExp-Validierung usw.
OAOO Rollen-Abhängigkeitsinjektion
Ich nehme als Beispiel, was bei yourlabs.traefik
(einem Docker-basierten
Lastenausgleich) passiert, das yourlabs.docker
erfordert, welches wiederum
nur Docker installiert.
Für das Beispiel werde ich jedoch your.parent
und
your.child
verwenden, um die Verwendung von yourlabs.docker
und
yourlabs.traefik
darzustellen.
In your.child/requirements.yml
::
- your.parent
In your.parent/requirements.yml
::
- yourlabs.erinnern
Somit hängt your.child
von your.parent
ab, und your.parent
hängt von yourlabs.erinnern
ab.
.. Hinweis:: bigsudo sorgt transparent dafür, dass die Anforderungen rekursiv installiert werden,
wenn du bigsudo your.child
ausführst.
Ohne die Rolle erinnern
würdest du normalerweise die Rolle your.parent
so am Anfang von your.child/tasks/main.yml
einfügen::
- name: Installiere your.parent bevor unsere Aufgaben ausgeführt werden include_role: name=your.parent
Dies würde die Rolle jedoch jedes Mal abspielen und die Ausführung verlängern. Wenn du
nicht jedes Mal auf die vollständige Ausführung von your.parent
warten möchtest, wenn du
your.child
ausführst, kannst du die oben genannte Aufgabe am Anfang
von your.child/tasks/main.yml
so umwandeln:
.. code-block:: yaml
- name: Installiere your.parent, wenn dies noch nicht auf diesem Host geschehen ist include_role: name=your.parent when: ansible_facts['ansible_local']['your_parent']['state']|default('') != 'success'
Damit dies funktioniert, musst du Folgendes am Ende von
your.parent/tasks/main.yml
hinzufügen:
.. code-block:: yaml
- include_role: name=yourlabs.erinnern tasks_from=success
Somit wird beim Ausführen von bigsudo your.parent
(funktioniert auch mit ansible)
die Datei /etc/ansible/facts.d/your_parent.fact
mit folgendem Inhalt erstellt::
#!/bin/sh echo '{ "state": "success" }'
So kannst du das Einfügen der Rolle beim nächsten Mal überspringen.
Lies weiter, um deine eigenen persistenten Rollenvariablen mit interaktiver Konfiguration hinzuzufügen.
Interaktive Rollen-Konfiguration
In your.parent/vars/main.yml
definiere remember_fact
, das den Namespace für diese Rolle
Einsatzvariable sowie die Variablen enthält, von denen deine Rolle abhängt::
remember_fact: your_parent erinnern:
- name: email_enable question: Benutzerdefiniertes E-Mail aktivieren? default: false type: bool
- name: email question: Welche E-Mail-Adresse soll verwendet werden? type: email default: '{{ lookup("env", "USER") }}@{{ inventory_hostname }}' when: email_enable
Dann kannst du in your.parent/tasks/main.yml
yourlabs.erinnern
einfügen, und es werden die Variablen geladen und der Benutzer wird interaktiv nach neuen Variablen gefragt,
dank des Action Plugins ziemlich schnell::
- include_role: name=yourlabs.erinnern
Du kannst noch mehr tun, ziehe natürlich das test.yml
Playbook zu Rate, das ich mit
ansible-playbook -c local -i localhost, test.yml -v --become
ausführe:
.. include:: test.yml
Mehrere Bereitstellungen: Namespacen von Variablen
Um mehrere Bereitstellungen einer Rolle auf demselben Host zu ermöglichen, also um
eXtreme DevOps zu ermöglichen, muss dein remember_fact
von einer Variablen abhängen.
Zum Beispiel möchtest du ein docker-compose in verschiedenen Verzeichnissen auf deinem Host bereitstellen. Dazu benötigst du eine home
-Variable:
.. code-block:: yaml
erinnern:
- name: home
question: In welches Home-Verzeichnis soll bereitgestellt werden? (muss mit /home beginnen für das Regexp-Beispiel)
default: /home/test
type: path
regexp: /home.*
Das bedeutet, dass, wenn der Benutzer keine home
-Variable in der Befehlszeile übergibt
(z. B. mit -e home=/home/bar
), eine Aufforderung nach dem Home-Verzeichnis angezeigt wird.
Nun müssen wir nur noch diese home-Variable in das remember_fact
wiederverwenden,
damit die Variablen pro Home-Verzeichnis namespaced werden:
.. code-block:: yaml
remember_fact: your_role_j2((home))
Wie du sehen kannst, verwenden wir j2(( ))
anstelle von {{ }}
, um zu verhindern,
dass Ansible dies rendert, bevor wir einen Wert für die home-Variable erhalten. Tatsächlich wird das
remember Action Plugin folgendermaßen arbeiten:
- Es versucht,
remember_fact
zu rendern, um vorhandene Variablen, falls vorhanden, zu laden, - fängt
AnsibleUndefinedVariable
-Ausnahmen, - findet die Definitionen für die nicht definierten Variablen, die es benötigt, in
remember
, - fragt sie ab, ohne sie zu speichern,
- lädt die vorhandenen Variablen,
- und fragt nach neuen Variablen.
Fazit
Schließlich kommen wir zu dem Punkt, an dem wir einen klaren und relativ einfachen Weg haben, um:
- dynamisch Abhängigkeitsrollen einzufügen, um die nachfolgenden Ausführungen einer Rolle zu beschleunigen und effektiv die unnötige doppelte Ausführung von Abhängigkeitsrollen (wie Docker, Lastenausgleich, niedrigere Automatisierungen ...) zu vermeiden.
- das Inventar zu unterdrücken, da jeder Server seine Variablen behält; es ist auch DRY, also ist das immer noch ein Repo weniger, um das du dir Sorgen machen musst!
- interaktive Faktenaufforderung - keine Notwendigkeit mehr, die Dokumentation zu lesen, bevor du eine Rolle ausführst, die du im Internet gefunden hast!
Danksagungen
Vielen Dank an totakoko von beta.gouv.fr
für die langen Diskussionen und dafür,
dass er mir gezeigt hat, dass mein Inventar übertrieben war und dass es ohne möglich war ;)
Danke an #ansible
@irc.freenode.net
, einen der besten IRC-Kanäle, insbesondere an:
- agaffney
- mackerman
- jborean93
Und danke dir, dass du mein kleines Abenteuer gelesen hast!
ansible-galaxy install yourlabs.remember