# Collections

Collections Benutzen,erstellen und bei Github hochladen

# Collection Grundgerüst erstellen

Um eine Collection zu erstellen nimmt man ein Verzeichnis für alle Seine Collections.  
zum Beispiel, diese Verzeichnis. Wenn nicht besteht dann anlegen.

```shell
mkdir ~/mein-ansible/project1/collections/
#in das Verzeichnis rein gehen.
cd ~/mein-ansible/project1/collections/
```

Nun kann mittels ansible Galxay Befehl eine collection angelegt werden  
Der Aufbau einer Collection ist immer der benutzername.collectionname  
Wir nennen unsere Collection mal general  
also der Befehl lautet:

```shell
ansible-galaxy collection init immohacker.general
```

  
Hier mit wird dann folgende Verzeichnisstruktur erstellt:

```shell
~/mein-ansible/project1/collections/immohacker/general/
```

Die Verzeichnisstruktur sieht dann so aus:

```shell
.
├── docs
├── galaxy.yml
├── plugins
│   └── README.md
├── README.md
└── roles

```

in der galaxy.yml kommen die Daten und die Versionsnummern rein.  
bei jeder Änderung an der Collection muss die Versionsnummer in der Datei erhöht werden.  
Diese Datei dient

Die wichtigsten Punkte in der Datei sind:

```shell
namespace: name des darunter liegenden spaces. Ich nehme immer den namen vom github Konto in diesem Fall immohacker
name : name der collection z.b general
version:
authors : Unser Name
Description : Beschreibung der Collection, also was macht diese.

```

dependencies: die Collections wovon diese Collection abhängig sein könnte.  
Allerdings sollte man es so bauen, das eine Colelction autark und nicht von anderen Collections abhängig ist.  
ansonsten wenn es geht die Abhängigkeiten mit in die Collection einbauen, Nachteil die Abhängigkeiten werden dann halt nur nicht mehr automatisch gepflegt, diese muss man dann jedes mal selbst aktualisieren.  
Aber falls nicht anders geht, hier ein Beispiel für Abhängikeiten  
Beispiel

```
dependencies:
    #größer oder gleich 1.0.0
    "other_namespace.collection1": ">=1.0.0" 
    #größer oder gleich 2.0.0 und kleiner als 3.0.0
    "other_namespace.collection2": ">=2.0.0,<3.0.0"
    "anderson55.my_collection": "*"    # note: "*" selects the highest version available
```

  
repository: Git url wenn vorhanden, meistens ja.   
 Zumindest wenn man veröffentlichen will, sonst natürlich nicht. Dann leer lassen.  
documentation: url zur Docu  
homepage: wenn nicht vorhanden leer lassen  
issues: githab issue tracker, wenn nicht vorhanden auch hier leer lassen.  
  
Im rootverzeichnis kann optional noch eine  
<span class="css-truncate css-truncate-target d-block width-fit">requirements.txt  
erstellt werden.  
In dieser werden alle Modul und Pluginsabhängikeiten eintragen, falls die Collection welche hat.  
Beispiel Aufbau:  
</span>

```shell
# Module deps, useful for editor intellisense, etc.
ansible-core==2.13.1
requests==2.28.1
proxmoxer==1.3.1

# Linting & Formatting
ansible-lint==6.3.0
pylint==2.14.4
autopep8==1.6.0
pre-commit==2.19.0

# Testing
tox==3.25.1

# Utility packages needed for scripts
pyyaml==6.0.0
packaging==21.3
```

  
  
Das wars auch schon. Schon kann darin gearbeitet werden.  
Möchte man das ganze noch in ein Git Repo syncen dann siehe Abschnitt :   
[Ansible Collection zu Github hinzufügen](https://wiki.hacker-net.de/books/ansible/page/ansible-collection-zu-github-hinzufugen "Ansible Collection zu  Github hinzufügen")

# Eine Standalone Rolle in eine Collection migrieren

Dazu einfach die den Rollen Inhalt in eine Neue Rolle im Ornder Roles kopieren.  
Beispiel:

mv -r /locales\_ansible\_arbeitsverzeichnis/roles/meinerolle\_1 /meine/collections/immohacker/general/roles/

nun noch in der galaxy.xml, die abhängigkeiten eintragen die die Rolle hat.  
in diesem Beispiel eine andere einzelne Rolle. Die Abhängigkeiten können in der Datei meta/main.yml im Rollenverzeichnis nachgeschaut werden und übertragen werden.  
  
Beispiel:

```
....
dependencies: 
 - role: stefanhacker.ansible_extract_iso
   tags: [never]
   
   
   Das Tag never bedeutet lade die Rolle für die abhängigkeit runter, führe diese aber nicht aus
   Rollen die als abbhänngigkeit eingetragen werden, werden standard mäßig auch gleich nach dem download ausgeführt.
   unter Umständen ist dies aber nicht gewüscht, weil custom parameter übergeben werden müssen.
```

Das wars auch schon.  
Schon hat unsere collection die Erste Rolle. Nun kann sie gebaut werden. Siehe -&gt; [Collection bauen](https://wiki.hacker-net.de/books/ansible/page/collection-bauen "Collection bauen")

# Collection bauen

Eine Collection wird damit sie Veröffentlicht wird / installierbar ist als tarball erstellt.  
Dazu in das Verzeichnis gehen  
In unserem Beispiel:

```shell
cd ~/mein-ansible/project1/collections/immohacker/general/
```

Dort dann den befehl zum bauen ausführen

```
ansible-galaxy collection build
```

Ausgabe:

```shell
Created collection for immohacker.general at /home/duffy/ansible-strange-hosting/collections/immohacker/general/immohacker-general-1.0.0.tar.gz
```

Nun haben wir eine tar Datei die wir verteilen können. In der tar Datei steht im Namen auch immer die Versionsnummer die aus der galaxy.yml gelesen wird.