GNU/Linux >> LINUX-Kenntnisse >  >> Linux

5 Tipps zur Konfiguration von virtualenvs mit Ansible Tower

Ansible läuft auf Python, und bei Ansible Tower ist Python auch der Motor unter der Haube. Bei der Arbeit mit meinen Kunden habe ich einige praktische Fragen gesehen, die anscheinend relativ häufig vorkommen. Dieser Artikel enthält einige Tipps zur Einrichtung und Fehlerbehebung von virtualenvs in einem Ansible-Tower-Szenario.

1. Was ist eine virtuelle Umgebung?

Ein Python-virtueller ist im Grunde ein Verzeichnis, das mit dem virtualenv erstellt wurde Befehl (der, wie Sie sich denken können, ein Python-Skript ist).

Sobald diese virtuelle Umgebung „aktiviert“ ist, können Sie dort spezifische Python-Module hinzufügen und haben eine isolierte Umgebung zum Experimentieren und Entwickeln, ohne Ihre wichtigsten Python/Ansible-Skripte und Playbooks zu beeinträchtigen.

Ansible Tower hat zwei virtualenvs im Standardverzeichnis:awx und ansible .

Die erste lautet: /var/lib/awx/venv/awx. Das awx virtualenv ist für die ausschließliche Verwendung von Ansible Tower selbst bestimmt und sollte nicht geändert werden .

Die andere virtuelle Umgebung ist: /var/lib/awx/venv/ansible . Diese virtuelle Umgebung wird von Tower verwendet, um die Vorlagen (Playbooks) auszuführen.

Jemand könnte fragen:Wenn ich Python-Module hinzufügen muss, die von meinen Ansible Tower-Playbooks benötigt werden, sollte ich sie unter dem Standard ansible hinzufügen virtuelle Umgebung?

Nun, das könntest du.

Aber es ist wahrscheinlich eine bessere Idee, eine weitere zu erstellen virtualenv if:

  1. Sie möchten die standardmäßige virtuelle Umgebung als stabile Entwicklungsumgebung beibehalten und mit neuen Modulen in einer anderen virtuellen Umgebung experimentieren.
  2. Sie haben verschiedene Gruppen von Entwicklern, die an verschiedenen Projekten arbeiten, die bestimmte Python/Ansible-Module erfordern.

2. Tipps zum Einrichten einer virtuellen Umgebung

Es gibt ausgezeichnete Erklärungen und Beispiele in der Ansible Tower- und Python-Dokumentation zum Einrichten einer virtuellen Umgebung.

Normalerweise folge ich der Ansible Tower-Dokumentation, wenn ich eine neue virtuelle Umgebung erstelle, aber es gibt einige Themen, die ich eher übersehe (was später damit endet, dass ich mich am Kopf kratze und frage:„Hmm … warum verhält sich das nicht so, wie ich es erwartet hatte ?").

Berechtigungen für die Python-Module

Beachten Sie unbedingt die Empfehlung, umask 0022 einzustellen , nicht nur beim Erstellen Ihrer virtuellen Umgebung, sondern auch beim Hinzufügen Python-Module dazu.

Der Grund dafür ist, dass Ansible Tower unter dem Benutzer awx ausgeführt wird , also muss dieser Benutzer lesen können die Python-Module in der virtualenv.

Wenn die Berechtigungen nicht richtig eingestellt sind, geben Ihre Vorlagen/Playbooks möglicherweise Fehler wie Modul XYZ ist nicht installiert aus oder Modul XYZ hat kein Attribut ABC wenn das Problem tatsächlich ein einfaches Berechtigungsproblem ist.

[ Den Lesern gefiel auch: How to create an Ansible Playbook ]

Installieren Sie Ansible in Ihrer virtuellen Umgebung

Für die Playbooks, die Sie mit der virtuellen Umgebung ausführen möchten, müssen Ihre spezifischen Python-Module in Ihrer virtuellen Umgebung installiert sein. Es ist sinnvoll, dass die Ansible-Engine auch von dieser virtuellen Umgebung ausgeführt wird.

Sie können den folgenden Befehl verwenden, um eine bestimmte Version von Ansible zu installieren:

sudo /opt/my-envs/xyz/bin/pip install ansible==2.9.15

Hinweis :Wenn Sie die Version nicht angeben, pip installiert die neueste Version. Es gibt Verhaltensänderungen zwischen Ansible 2.9 und Ansible 2.10, daher ist es ratsam, dieses Dokument zu überprüfen, bevor Sie die Installation von 2.10 oder einer neueren Version zulassen.

Verwenden Sie Pip, um die Python-Module aufzulisten

Angenommen, Sie möchten ein Replikat Ihrer virtuellen Umgebung in einer anderen Umgebung erstellen oder Sie haben mehrere Ansible Tower-Knoten und müssen die virtuelle Umgebung auf allen Knoten replizieren. Um die Liste der Module zum Vergleich oder zur Dokumentation zu erfassen, können Sie Folgendes verwenden:

pip list > pip_list.txt

head -5 /tmp/pip_list.txt
Package       Version
------------- ---------
ansible       2.9.15
certifi       2020.12.5
cffi          1.14.4

Sie können auch eine Liste in einem Format erstellen, das die Installation der gleichen Modulversionen woanders erlaubt:

pip freeze > /tmp/pip_freeze.txt 

head -3 /tmp/pip_freeze.txt
ansible==2.9.15
certifi==2020.12.5
cffi==1.14.4

Sie können diese Freeze-Datei dann verwenden, um dieselben Module mit genau denselben Versionen zu installieren, indem Sie Folgendes verwenden:

sudo /opt/my-envs/xyz/bin/pip install -r pip_freeze.txt

3. Virtuelle Umgebungen in Tower-Projekten/-Vorlagen verfügbar machen

Standardmäßig kennt Ansible Tower nur seine eigenen virtuellen Umgebungen.

Um Tower auf die zusätzlichen virtuellen Umgebungen aufmerksam zu machen, haben Sie zwei Möglichkeiten:

  1. Verwenden Sie REST-API-Aufrufe wie in der Ansible Tower-Dokumentation beschrieben
  2. Verwenden Sie die Weboberfläche und navigieren Sie zu EINSTELLUNGEN -> SYSTEM :

Nachdem Sie einen dieser beiden Schritte ausgeführt haben, können Sie die neuen virtuellen Umgebungen auswählen, wenn Sie mit Organisationen, Projekten und Vorlagen in Tower arbeiten:

Hinweis :Stellen Sie sicher, dass das virtualenv-Verzeichnis für den Benutzer awx lesbar ist . Ist dies nicht der Fall, listet Tower die virtuelle Umgebung nicht auf.

"Das Wichtigste, worauf Sie achten müssen, ist, welche virtuelle Umgebung aktiv ist und welche Binärdateien Ihre Playbooks verwenden."

4. Sichern und Wiederherstellen einer virtuellen Umgebung

Wenn Sie eine vollständige Tower-Sicherung erstellen (mithilfe von setup.sh -b script), die virtualenvs werden dort automatisch gesichert und Sie können sie mit setup.sh -r wiederherstellen ). Eine Wiederherstellung auf diese Weise bedeutet natürlich, dass alles andere wird ebenfalls wiederhergestellt.

Wenn Sie die virtuelle Umgebung sichern/wiederherstellen müssen, können Sie jederzeit Tools wie tar verwenden um das zu tun.

Auch, wenn Sie die Ausgabe Ihres pip freeze gespeichert haben Befehl können Sie die Verzeichnisstruktur neu erstellen und den pip install verwenden Befehl mit dem -r Argument wie oben gezeigt.

Stellen Sie sicher, dass die wiederhergestellte Verzeichnisstruktur von awx gelesen werden kann Benutzer, damit Tower die virtuelle Umgebung erkennen und unter ANSIBLE ENVIRONMENT auflisten kann Feld in Organisationen, Projekte und Vorlagen.

Hinweis :In einem Szenario mit Ansible Tower, das auf OpenShift läuft, sieht es anders aus, wenn es um virtuelle Umgebungen geht. Das ist ein Thema für einen anderen Artikel.

5. Fehlerbehebungsversionen

Welche Python-Version verwenden Sie?

Eine Quelle potenzieller Probleme hängt mit der genauen Version von Python und Pip zusammen, die verwendet wird, oder mit der Version, die die Tools erkennen .

Manchmal müssen Sie die Befehlszeile verwenden, um Python-Module zu installieren/überprüfen, daher ist es immer gut zu überprüfen, welche Python-Version Sie verwenden.

Überprüfen Sie beispielsweise nach der Aktivierung von virtualenv die Version:

source /opt/my-envs/xyz/bin/activate

(xyz) [admin@control my-envs]$ which python
/opt/my-envs/xyz/bin/python

(xyz) [admin@control my-envs]$ which python3
/opt/my-envs/xyz/bin/python3

(xyz) [admin@control my-envs]$ python -V
Python 3.6.8

(xyz) [admin@control my-envs]$ which pip
/opt/my-envs/xyz/bin/pip

(xyz) [admin@control my-envs]$ pip3 -V
pip 20.2.4 from /opt/my-envs/xyz/lib/python3.6/site-packages/pip (python 3.6)

Wie Sie im obigen Beispiel sehen können, verweisen alle Befehle nach der Aktivierung auf Pfade in my virtualenv, was Sie erwarten sollten, es sei denn, Sie haben andere Versionen in Ihrem Pfad, und das könnte einige Probleme verursachen.

Dies ist besonders wichtig, wenn Sie es tun andere Python-Versionen auf Ihrem Server haben. Manchmal möchten Sie vielleicht den pip ausführen Befehl als Root-Benutzer, und was Root als Standard-Python sieht, ist möglicherweise nicht das, was Ihr Nicht-Root-Konto sieht. Dies würde dazu führen, dass das Modul in der falschen Python-Umgebung installiert wird und die Vorlagen, die Sie von Tower ausführen, das Modul nicht finden würden.

Statt sudo pip install module-name auszuführen verwenden Sie den vollständigen Pfad für pip um dieses Problem zu vermeiden. Am Beispiel meines vorherigen Szenarios wäre das:

sudo /opt/my-envs/xyz/bin/pip install module-name

Welche Ansible-Version verwenden Sie?

Wenn Sie immer noch Fehler wie Kein Modul namens XYZ sehen , überprüfen Sie anhand der Vorlagenausgabe, welche Ansible-Version Sie ausführen:

Stimmt es mit der Version/dem Speicherort überein, die Sie in Ihrer virtuellen Umgebung haben?

Sie müssen Ansible nicht in Ihrer virtuellen Umgebung installieren, aber denken Sie daran, dass, wenn Ansible-Playbooks von einer anderen Instanz von Ansible ausgeführt werden, die in Ihrer virtuellen Umgebung installierten Python-Module möglicherweise nicht angezeigt werden.

[ Ein kostenloser Leitfaden von Red Hat:5 Schritte zur Automatisierung Ihres Unternehmens. ] 

Abschluss

Virtualenvs sind eine großartige Möglichkeit, isolierte Szenarien zu erstellen, in denen Sie mit verschiedenen Python/Ansible-Modulen experimentieren können, ohne andere installierte Module zu beeinträchtigen. Virtualenvs lassen sich einfach von Grund auf neu erstellen. Das Wichtigste, worauf Sie achten sollten, ist, welche virtuelle Umgebung aktiv ist und welche Binärdateien Ihre Playbooks verwenden.


Linux
  1. 3 Tipps zum Drucken mit Linux

  2. 8 Tipps für die Linux-Kommandozeile

  3. 5 Tipps für den GNU-Debugger

  4. Weitere Tipps zum Packen Ihrer Linux-Software mit RPM

  5. Setzen Sie die Mount-Option für einen bestimmten Mount-Punkt mit Ansible

Tipps zum Auflisten von Dateien mit ls in der Linux-Befehlszeile

5 Tipps zur Verbesserung der Produktivität mit zsh

Tipps zur Verwendung von tmux

Tipps zur Verwendung des Bildschirms

3 Tipps zur Verbesserung der Linux-Prozessleistung mit Priorität und Affinität

7 nützliche Tipps zum Selbsthosten einer Ghost-Instanz mit Docker