Paketbaurichtlinien für Ansible Collections

Weiter

Ansible-Collections sind paketierte Einheiten von Ansible-Inhalten, darunter Module und andere Plugin-Typen. Die meisten Ansible-Plugins sind in Python oder PowerShell geschrieben.

Einige Collections sind auch im ansible-Collectionss-Paket der Ansible Community enthalten, das in Fedora paketiert wird. Alle Collections, unabhängig davon, ob sie im ansible-Paket enthalten sind oder nicht, können in Fedora paketiert werden.

ansible ist von ansible-core abhängig, welches die Kern-Engine und CLI-Programme (z. B. ansible, ansible-playbook) enthält. Das Paket ansible hat einen anderen Veröffentlichungszyklus als die einzelnen Collections und kann ältere Versionen der einzelnen Komponenten enthalten. ansible installiert Collections in einem separaten Namensraum und kann parallel zu den einzelnen Collections installiert werden. Die Ansible-Engine sucht zuerst im eigenständigen Collections-Verzeichnis nach Collections.

In Changes/Ansible5 finden Sie weitere Information über die Trennung zwischen ansible und ansible-core.

Benennung

Collections-Pakete MÜSSEN einen Namen der Form ansible-collection-NAMENSRAUM-NAME tragen. Beispielsweise heißt das community.general-Collections-Paket ansible-collection-community-general.

Quellen der Collections

Der Quellcode einer Collection MUSS aus dem jeweiligen GitForge-Repository oder einem anderen Versionsverwaltungssystem (SCM-Repository) der Collection heruntergeladen werden. Die in Ansible Galaxy veröffentlichten Tarballs enthalten zwar den gesamten Python-/PowerShell-Quellcode der Collection sowie einige Entwicklungsdateien, jedoch nicht die Baukonfigurationsdatei galaxy.yml und die Entwicklungsdateien (z.B. Unit-Tests), die der Autor gegebenenfalls entfernt haben könnte. Beachten Sie, dass die Collections-Richtlinien der Ansible Community vorschreiben, dass Collections in einem öffentlichen SCM-Repository gekennzeichnet werden müssen.

Collections-Pakete SOLLTEN %{ansible_collection_url NAMENSRAUM NAME} als URL: des Pakets verwenden. Dies verweist auf die Homepage der Collection auf Ansible Galaxy.

Abhängigkeiten

Bauzeit

Collections MÜSSEN BuildRequires: ansible-packaging enthalten. ansible-packaging stellt Makros und einen Abhängigkeitsgenerator für das Paketieren von Ansible-Collections bereit. Es bindet außerdem ansible-core ein, daher SOLLTE BuildRequires: ansible-core NICHT manuell hinzugefügt werden.

Laufzeit

Der Abhängigkeitsgenerator erzeugt die passende Abhängigkeit von der Ansible-Engine. Dies gewährleistet Kompatibilität zu Fedora 35, das das klassische ansible-Paket 2.9 (anstelle des Collection-Bundles) und ansible-core enthält. Beide Versionen der Ansible-Engine unterstützen Collections, lassen sich aber nicht parallel installieren. Pakete DÜRFEN ansible-core oder ansible NICHT manuell mit Require einbinden, es sei denn, sie benötigen bekanntermaßen eine bestimmte Version. In diesem Fall müssen die entsprechenden Versionsbeschränkungen verwendet werden.

Der Abhängigkeitsgenerator kann auch Collection-übergreifende Abhängigkeiten erfassen.

Externe Abhängigkeiten von Plugins

Ansible-Collections können verschiedene Plugins mit unterschiedlichen externen Abhängigkeiten enthalten. Der Ansible-Entwicklerleitfaden schreibt vor, dass Plugins bei fehlenden Abhängigkeiten sauber fehlschlagen müssen. Oftmals werden externe Abhängigkeiten nur für einen kleinen Teil der Collection benötigt, der möglicherweise nicht weit verbreitet ist. Daher SOLLTEN Collection-Pakete weiche Abhängigkeiten von diesen externen Bibliotheken definieren, d.h. Empfehlungen (Recommends) anstelle von Anforderungen (Requires) verwenden.

Modulabhängigkeiten werden nur auf dem Zielknoten, nicht aber auf dem Controller-Knoten benötigt. Daher sollten Collections-Pakete weder schwach noch stark von diesen Abhängigkeiten abhängen. Benutzer sind für die Installation dieser Abhängigkeiten auf dem Zielrechner verantwortlich. Module, die für die Verwendung mit delegate_to: localhost vorgesehen sind, bilden eine Ausnahme von dieser Regel.

Die Situation ist etwas anders für Controller-Plugins wie Filter-, Lookup-, Verbindungs- oder Inventar-Plugins. Collections KÖNNEN Recommends für Abhängigkeiten von Controller-Plugins hinzufügen. Paketierer sollten jedoch beim Hinzufügen jeglicher Abhängigkeiten mit Bedacht vorgehen und diese nur dann hinzufügen, wenn sie für die zentrale Funktionalität der Collection erforderlich sind. Beispielsweise ist es sinnvoll, dass ansible-collection-community-docker python3-docker empfiehlt, aber nicht, dass die größere, allgemeinere Collections ansible-collection-community-general python3-redis für das Lookup-Plugin redis empfiehlt. Diese Richtlinie soll ein übermäßiges Aufblähen von Collections-Paketen verhindern. ansible-core und ansible folgen demselben Prinzip.

Bau und Installation

Zum Erstellen des Collections-Artefakts MÜSSEN Pakete %ansible_collection_build in %build verwenden. %ansible_collection_install MUSS in %install verwendet werden, um das Artefakt zu installieren.

Paketierer SOLLTEN %files -f %{ansible_collection_filelist} verwenden, um die Collection zu installieren. Die %{ansible_collection_filelist} wird von %ansible_collection_install befüllt.

Unit-Tests

Gemäß den allgemeinen Fedora-Paketbaurichtlinien SOLLTEN Collections-Pakete, sofern praktikabel, von Upstream-Entwicklern gelieferte Unit-Tests in %check ausführen. Integrationstests können in der RPM-Bauumgebung nicht ausgeführt werden. Um Unit-Tests auszuführen, MÜSSEN Collections ansible-packaging-tests als BuildRequire einbinden, wodurch die notwendigen Abhängigkeiten hereingezogen werden. Einige Collections haben weitere Testabhängigkeiten, die üblicherweise in tests/unit/requirements.txt angegeben sind. Diese müssen manuell hinzugefügt werden. Das Makro %ansible_test_unit MUSS zum Ausführen von Tests verwendet werden.

EPEL-Kompatibilität

Gegenwärtig ist es nicht möglich, Unit-Tests auf EPEL 8 und 9 auszuführen.

ansible-core in RHEL 8 und 9 wird gegen alternative Python-Stacks kompiliert, für die die notwendigen Testabhängigkeiten nicht verfügbar sind.

Die übrigen dieser Richtlinien gelten für EPEL 8 und 9; ansible-packaging ist dort verfügbar.

Unnötige Dateien

Standardmäßig werden Collections mit allen Dateien aus dem Wurzelverzeichnis des Repositorys ausgeliefert, sofern diese nicht manuell ausgeschlossen werden. Daher enthalten viele Collections Entwicklungsdateien, die von den Benutzern nicht benötigt werden.

Paketierer SOLLTEN diese Dateien ausschließen. Dies SOLLTE durch Patchen der galaxy.yml-Datei der Collection erfolgen, um diese Dateien zur build_ignore-Konfiguration hinzuzufügen. Diese Dateien SOLLTEN NICHT mit rm entfernt werden. Weitere Informationen zur Syntax der galaxy.yml-Datei finden Sie in der Ansible-Dokumentation.

Gängige Entwicklungsdateien umfassen:

  • Das Verzeichnis tests, das Unit- und Integrationstests enthält

  • SCM-Konfigurationen wie .gitignore- und .keep-Dateien

  • Die Verzeichnisse .azure-pipelines und .github, die die CI-Konfiguration enthalten

Diese Dateien müssen häufig downstream-seitig entfernt werden, da es einige ungelöste Probleme beim Übertragen dieser Änderungen in die Upstream-Community-Collections gibt. Diese Probleme sind im Fedora-Kontext irrelevant.

Shebangs

Ansible-Plugins sind nicht ausführbar. Viele von ihnen enthalten jedoch aus Kompatibilitätsgründen #!/usr/bin/python-Shebangs. Diese Shebangs MÜSSEN aus folgenden Gründen entfernt werden:

  1. Nicht-ausführbare Dateien sollten keine Shebangs haben

  2. Das Beibehalten der Shebangs führt zu einer unnötigen Abhängigkeit von python-unversioned-command.

%py3_shebang_fix darf NICHT verwendet werden, da dies die Kompatibilität zu bestimmten Ansible-Zielknoten beeinträchtigt. Auch das Problem mit nicht ausführbaren Dateien wird dadurch nicht behoben.

Shebangs können folgendermaßen entfernt werden:

find -type f ! -executable -name '*.py' -print -exec sed -i -e '1{\@^#!.*@d}' '{}' +

Dokumentations- und Lizenzdateien

Lizenzdateien und Dokumentation für Collections werden standardmäßig im Collections-Verzeichnis unter /usr/share/ansible installiert. Paketierer können die Lizenz- und Dokumentationsdateien in diesem Verzeichnis entweder mit %license und %doc kennzeichnen oder die korrekten Pfade in galaxy.yml zu build_ignore hinzufügen und sie in den Standardverzeichnissen installieren. Vermeiden Sie es, diese Dateien an beiden Orten zu duplizieren.

Beachten Sie, dass einige Collections mit Mehrfachlizenzierung die Lizenzen in einem Verzeichnis LICENSES speichern. Dieses gesamte Verzeichnis MUSS mit %license gekennzeichnet sein.

Die Regeln zu zulässigen Lizenzen und zur Bestimmung des Feldes License: finden Sie in der Legal-Dokumentation.

Beispiel-Spec-Datei

# Only run tests where the dependencies are available
%if %{defined fedora}
%bcond_without tests
%else
%bcond_with tests
%endif

Name:           ansible-collection-community-rabbitmq
Version:        1.2.2
Release:        1%{?dist}
Summary:        RabbitMQ collection for Ansible

# plugins/module_utils/_version.py: Python Software Foundation License version 2
License:        GPL-3.0-or-later and PSF-2.0
URL:            %{ansible_collection_url community rabbitmq}
%global forgeurl https://github.com/ansible-collections/community.rabbitmq
Source0:        %{forgeurl}/archive/%{version}/%{name}-%{version}.tar.gz
# Patch galaxy.yml to exclude unnecessary files from the built collection.
# This is a downstream only patch.
Patch0:         build_ignore.patch

BuildRequires:  ansible-packaging
%if %{with tests}
BuildRequires:  ansible-packaging-tests
# Collection specific test dependency
BuildRequires:  glibc-all-langpacks
%endif

BuildArch:      noarch

%description
%{summary}.


%prep
%autosetup -n community.rabbitmq-%{version} -p1
find -type f ! -executable -name '*.py' -print -exec sed -i -e '1{\@^#!.*@d}' '{}' +


%build
%ansible_collection_build


%install
%ansible_collection_install


%if %{with tests}
%check
%ansible_test_unit
%endif


%files -f %{ansible_collection_filelist}
%license COPYING PSF-license.txt
%doc README.md CHANGELOG.rst

%changelog

build_ignore.patch:

diff --git a/galaxy.yml b/galaxy.yml
index 0b37162..acd029a 100644
--- a/galaxy.yml
+++ b/galaxy.yml
@@ -13,3 +13,13 @@ repository: https://github.com/ansible-collections/community.rabbitmq
 documentation: https://docs.ansible.com/ansible/latest/collections/community/rabbitmq/
 homepage: https://github.com/ansible-collections/community.rabbitmq
 issues: https://github.com/ansible-collections/community.rabbitmq/issues
+build_ignore:
+  # Remove unnecessary development files from the built package.
+  - tests
+  - .azure-pipelines
+  - .gitignore
+  # Licenses and docs are installed with %%doc and %%license
+  - PSF-license.txt
+  - COPYING
+  - README.md
+  - CHANGELOG.rst

Makro-Aufschlüsselung

Hier folgt eine kurze Aufschlüsselung der genauen Funktion jedes einzelnen Makros in ansible-packaging.

%ansible_collection_url

Verwendung:

URL:            %{ansible_collection_url NAMENSRAUM NAME}

Dieses Makro verweist auf die Ansible Galaxy-Seite einer Collection. Es ist für das URL:-Tag in der Präambel der Spec-Datei vorgesehen. Als Argumente werden der Namensraum und der Name der Collection benötigt.

Werden diesem Makro keine Argumente übergeben, verwendet es die Werte von %{collection_namespace} und %{collection_name}, sofern diese in der Spec-Datei definiert sind. Neue Pakete SOLLTEN Namensraum und Name explizit als Argumente übergeben. Die Ausweichfunktion kann zukünftig entfernt werden. Weitere Informationen finden Sie im Abschnitt Veraltete Makros.

%ansible_collection_build

Verwendung:

%build
%ansible_collection_build

Dieses Makro führt einfach ansible-galaxy collection build aus.

%ansible_collection_install

Verwendung:

%install
%ansible_collection_install

Dieses Makro extrahiert Namespace, Namen und Version der Collection aus galaxy.yml und führt anschließend ansible-galaxy collection install aus. Danach schreibt es %{ansible_collection_filelist} basierend auf den zuvor extrahierten Metadaten.

%ansible_test_unit

Verwendung:

%check
%ansible_test_unit

Dieses Makro analysiert die Datei galaxy.yml, um den Namensraum und den Namen der benötigten Collection zu ermitteln und so die von ansible-test erwartete Verzeichnisstruktur zu erstellen. Nach dem Erstellen eines temporären Bauverzeichnisses mit der erforderlichen Struktur führt das Skript die ansible-test-Units mit den angegebenen Argumenten aus.

%{ansible_collection_filelist}

Verwendung:

%files -f %{ansible_collection_filelist}
%doc ...
%license ...

Dieses Makro verweist auf eine Dateiliste, die von %ansible_collection_install erstellt wird. Aktuell enthält sie nur einen einzigen Eintrag, der das gesamte Verzeichnis der Collection in %{ansible_collections_dir} besitzt.

Dieses Makro wird zu %{_datadir}/ansible/collections/ansible_collections erweitert. Es wird intern von den anderen Makros verwendet. Paketierer sollten stattdessen %ansible_collection_install und %ansible_collection_filelist verwenden, anstatt direkt auf dieses Verzeichnis zu verweisen.

Veraltete Makros

%{collection_namespace}

Verwendung:

%global collection_namespace NAMENSRAUM

Bisher mussten Paketierer für die Ansible-Paketierungsmakros %collection_namespace in den Spec-Dateien manuell festlegen. Jetzt extrahieren die Makros den Namensraum der Collection aus der galaxy.yml-Datei.

%{collection_name}

Verwendung:

%global collection_name NAME

Bisher mussten Paketierer für die ansible-packaging-Makros %collection_name manuell in den Spec-Dateien festlegen. Jetzt extrahieren die Makros den Namen der Collection aus der galaxy.yml-Datei.

%{ansible_collection_files}

Verwendung:

%files
%doc ...
%license ...
%{ansible_collection_files}

Neue Spec-Dateien sollten %files -f %{ansible_collection_filelist} anstelle dieses Makros verwenden. %{ansible_collection_files} erfordert die Festlegung von %collection_namespace und %collection_name.