Execution Environment für Ansible Automation Platform erstellen

Red Hat Ansible Automation Platform (AAP), die kommerzielle Variante des AWX-Projekts, dient zur Orchestrierung und Ausführung von Ansible-Inhalten in großen und verteilten Systemlandschaften. Eine Web-Oberfläche erleichtert die Verwendung in Teams, die eigentliche Ausführung erfolgt inzwischen in eigens angepassten Podman-Containern - auch Ansible Execution Environments (EEs) genannt. Dank vordefinierter EEs kann sofort losgelegt werden - jedoch werden dann benötigte Abhängigkeiten (in roles/requirements.yml und collections/requirements.yml definierte Rollen und Collections) beim Aktualisieren des Projekts erst heruntergeladen. Wenn das Projekt bei jedem Start aktualisiert wird, hat das zur Folge, dass sich die Ausführung des Codes stark verzögert.

In meinem Fall wollte ich daher ein eigenes EE erstellen und in eine interne Container Registry hochladen. Für die Erstellung eigener EEs stellt Red Hat verschiedene Container Images in einer dedizierten Container Registry zur Verfügung, die nur mit gültiger Subscription benutzt werden kann.

Zuerst sollte der Login in beiden Registries konfiguriert und getestet werden:

1$ podman login registry.redhat.io
2$ podman login registry.homelab.loc
Hinweis

Wenn selbstsignierte Zertifikate zum Einsatz kommen, sorgt der Paramter --tls-verfiy=false dafür, dass Zertifikate nicht validiert werden.

Anschließend muss das Tool ansible-builder installiert werden - idealerweise via dnf:

1# subscription-manager repos --enable ansible-automation-platform-2.4-for-rhel-9-x86_64-rpms
2# dnf install ansible-builder

Anschließend ist für das EE ein eigener Ordner anzulegen:

1$ mkdir my-ee

In einer neu anzulegenden Datei execution-environment.yml werden nun die Eckdaten des neuen EEs angegeben:

 1---
 2version: 1
 3
 4build_arg_defaults:
 5  EE_BASE_IMAGE: 'registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9'
 6  EE_BUILDER_IMAGE: 'registry.redhat.io/ansible-automation-platform-24/ansible-builder-rhel9'
 7
 8dependencies:
 9  galaxy: requirements.yml
10  # python: requirements.txt
11  # system: bindep.txt

EE_BASE_IMAGE und EE_BUILDER_IMAGE referenzieren das Basis Container-Image sowie das Image zur Herstellung des Images. Unterhalb dependencies können Ansible-, Python- und Betriebssystem-Abhängigkeiten angegeben werden - manche Ansible Collections erfordern diese.

Ich habe mich für das auf RHEL9 aufbauende Image ee-minimal-rhel9 entschieden, da das klassische ansible-builder-rhel9-Image für mich nicht funktionierte. Es versuchte immer, das nicht zur Verfügung stehende python39-devel-Paket zu installieren - in RHEL 9.2 steht derzeit lediglich python311-devel zur Verfügung.

Es empfiehlt sich, die genauen Container-Namen und -Versionen zu überprüfen, da sie sich seit Veröffentlichung des Artikels geändert haben könnten. Hierbei hilft podman:

1$ podman search --format "table {{.Index}} {{.Name}}" registry.redhat.io/ansible-automation-platform-24
2INDEX               NAME
3registry.redhat.io  registry.redhat.io/ansible-automation-platform-24/ansible-builder-rhel8
4registry.redhat.io  registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel8
5...
Hinweis

Es lohnt sich auch ein Blick in den Red Hat Ansible Automation Platform Life Cycle, um die verwendete AAP-Version herauszufinden. So benutzt AAP 2.4 beispielsweise den Automation Controller in der Version 4.4.

Benötigte Ansible-Inhalte werden wie folgt angegeben:

requirements.yml:

1---
2collections:
3  - name: stdevel.uyuni
4    vesion: 0.1.1
5  - name: community.vmware
6    version: 3.6.0
7  - name: tribe29.checkmk
8    version: 0.22.0

Weitere Details zum Dateiformat finden sich auf den folgenden Seiten der Ansible-Dokumentation: [klick!] und [klick!]

Python-Abhängigkeiten werden über das verbreitete pip-Format angegeben:

requirements.txt:

1pydoge
2pygiertz == 0.6.1

Betriebssystem-Abhängigkeiten lassen sich gemäß bindep-Syntax angeben:

bindep.txt

1libgiertz
2python-pinkepank [platform:dpkg]
3python3-pinkepank [platform:rpm]

Falls benötigt, lassen sich sogar Pre- und Post-Skripte angeben:

execution-environment.yml

1...
2
3additional_build_steps:
4  prepend:
5    - RUN cat /etc/os-release
6  append:
7    - yum install -y neofetch

Das Erstellen des EEs wird wie folgt gestartet:

1$ ansible-builder build -t my-ee:1.0.0 --verbosity 3

Sofern erfolgreich abgeschlossen, kann das Container-Image anschließend hochgeladen werden:

1$ podman push LOCAL registry.homelab.loc/cstankow/my-ee:1.0.0

Abschließend kann das EE in AAP definiert und verwendet werden.

Übersetzungen: