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!

Über das Projekt

Ansible role to inject dependencies OAOO (once and only once).

Installieren
ansible-galaxy install yourlabs.remember
GitHub Repository
Lizenz
Unknown
Downloads
4k
Besitzer
OSS Hack'n'Dev, we provide all kind of paid services on OSS and sponsor OSS