# Ansible

Ansible ist ein Open-Source Automatisierungs-Werkzeug zur Orchestrierung und allgemeinen Konfiguration und Administration von Computern. Es kombiniert Softwareverteilung, Ad-hoc-Kommando-Ausführung und Software-Configuration-Management.

# Installation

# Installation unter Ubuntu / Mint / Debian - Linux - mittels pip

Ansible basiert auf python.

Wir brauchen lediglich python pip installieren.  
Damit wird python schon automatisch mit installiert.  
Die aktuelleste Version von ansibple befindet sich im python Paketinstallationsmanager (pip)

Einige Distributionen bringen auch Ansible mit die einfach über desses Paketmanger installiert werden können

z.b apt install ansible.

Diese sind aber in der Regel veraltet. So das wir Ansible über pip installieren und aktualisieren.

Unsere Installationbefehle

```
# install packages an ansible machine
sudo apt install python3-pip
pip install -U Jinja2
sudo pip install ansible
```

Das wars ansible ist einstazbereit

Durch den Befehl

```
ansible --version
```

sehen wir die version.  
Ausgabe:

```
ansible [core 2.14.0]
  config file = None
  configured module search path = ['/home/duffy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/duffy/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /home/duffy/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True

```

Fertig.  
Los gehts

# Installation unter Ubuntu / Mint - mittels PPA

Ansible basiert auf python.

Wir brauchen lediglich python pip installieren.  
Damit wird python schon automatisch mit installiert.  
Die aktuelleste Version von Ansible befindet sich im python Paketinstallationsmanager (pip)

oder wie hier im PPA

Einige Distributionen bringen auch Ansible mit die einfach über desses Paketmanger installiert werden können  
z.b apt install ansible.

Diese sind aber in der Regel veraltet.   
Da wir hier die PPA Lösung wählen ist apt install ansible wieder möglich, da die aktuellste version aus dem PPA kommt.

Unsere Installationbefehle

```
# install packages an ansible machine
sudo apt install python3-pip
pip install -U Jinja2
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
```

Das wars ansible ist einstazbereit

Durch den Befehl

```
ansible --version
```

sehen wir die version.  
Ausgabe:

```
ansible [core 2.14.0]
  config file = None
  configured module search path = ['/home/duffy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/duffy/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /home/duffy/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True

```

Fertig.  
Los gehts

# Installation aus dem Sourcecode / Distributionsunabhängig

#### Installation

Den Source Code herunterladen latest version

```
git clone https://github.com/ansible/ansible.git
```

Oder aber einen bestimmten branch

```
git clone -b stable-2.7 https://github.com/ansible/ansible.git
```

Nun in das Verzeichnis wechseln

```
cd ./ansible
```

Nun das script ausführen

```
source ./hacking/env-setup
```

Danach ansible version anzeigen. Damit wird sichergestellt das Ansible funktioniert.

#### Fehler

Sollte dieser Fehler statt die Versionsnummer dargestellt werden. Fehlt jninja2

ansible --version  
Traceback (most recent call last):  
 File "/root/ansiblesrc/ansible/bin/ansible", line 67, in &lt;module&gt;  
 import ansible.constants as C  
 File "/root/ansiblesrc/ansible/lib/ansible/constants.py", line 11, in &lt;module&gt;  
 from jinja2 import Template  
ImportError: No module named jinja2

Nun PIP installieren, aktuellste version

```
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
```

oder Version 2.7

```
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python get-pip.py
```

Nun per Pip installieren

```
pip install -U Jinja2
```

#### Anhang  


Quelle : [https://docs.ansible.com/ansible/2.8/installation\_guide/intro\_installation.html](https://docs.ansible.com/ansible/2.8/installation_guide/intro_installation.html)

# Installation unte Endian RVS6

Um Ansible auf einem RVS-Server zu installieren, speichern Sie die RPM-Pakete im Anhang auf dem RVS-Server in einem Ordner.  
Zum Beispiel: /root/ansibleinstall

Zuerst das Verzechnis auf dem RVS Server erstelln. Dazu loggen wir uns ein und geben folgenden Befehl ein:

```
mkdir /root/ansibleinstall
```

Dann uaf unserem Laptop / Computer die RPMS vom Anhang dieses Artikels downloaden.Diese dann per scp auf den RVS 6 Server in das gerade eben erstellte Verzeichnis kopieren.

```
scp *.rpm rvsserver6:/root/ansibleinstall
```

Nun wieder auf dem RVS 6 System einloggen oder wenn noch eingeloggt dann in das Verzeichnis /root/ansibleinstall gehen

```
cd /root/ansibileinstall
```

Nun die Pakete installieren

```
rpm -Uivh *.rpm
```

Nun überprüfen ob die Installation erflogreich war in dem wir uns die Version anzeigen lassen

```
ansible -v
```

Voila

# Einrichtung ansible in Visual Studio Code

Beschreibung,  
Damit Plugins wie Ansible vault und ähnliche funktionieren, muss in dem Projektverzeichnis eine ansible.cfg sein.  
Sollte das Projekt ein git REPO sein, vorher die ansible.cfg in die .gitignore einfügen und dann pushen, bevor man dann die ansible.cfg anlegt.

ansible.cfg Datei:

Inhalt

```
[defaults]
vault_password_file = /home/<username>/Dokumente/ansible/strangehosting/loadbalancer/ansible.pw
```

# Inventory

In DIeser Datei werden die Hosts gespeichert über die daan später das Playbook rennen soll.

# Inventory Datei - Welche Hosts dürfen es sein?

#### Einleitung

Die Invetory Datei beschreibt welche Hosts mit den playbooks bespielt werden sollen.

Es können variablen und Parameter zu den Hosts angegben werden.  
in der Regel ist eine Inventory-Datei eine INI Datei.  
kann aber auch in yaml erstellt werden.

#### Einzelhosts und Gruppen

Hier ein Beispiel einer Inventory datei mit zwei Gruppen und einem Host ohne gruppe.   
Die Invetory Datei hat INI Datei Syntax.

Einzelne Hosts werden vom script immer aufgerufen/abgearbeitet.  
Alles was global also ohne Gruppe ist muss immer an den anfang und wird ohne weiteres dazutun aufgerufen.  
Wenn Hostnamen verwendet werden, sicherstellen, das diese auch Aufgelöst werden können.

  
Die Gruppen werden in eckigen Klammern geschrieben. und darunter dann die jeweiligen hosts mit Hostname oder ip Adresse eingetragen.

```
203.0.113.100

[nginx]
203.0.113.0

[wordpress]
203.0.113.1
```

Nun haben wir zwei Gruppen nginx und wordpress

Wir können auch ranges definieren. So braucht nicht jeder Hostname eingefügt werden,  
beispiel beim IP range oder Hostname range

```
[webservers]
wwwserver[01:50].example.com

Erster Server wäre dann
wwwserver01.example.com

Letzter Server wäre dann
wwwserver50.example.com


[webservers]
203.0.113.[1:50]


Erster Server wäre dann
203.0.113.1

Letzter Server wäre dann
203.0.113.50

```

Verschachtelte Gruppen.  
Es ist möglich Gruppen in weitere Gruppen aufzudröseln.

Hier haben wir die Hosts Gruppen:  
Routers   
switches   
firewalls

Diese Gruppen hab wir als Kinder in folgende Gruppen gepackt  
  
network  
security  
lan  
  
Wie zu sehen sind einige Gruppenkinder auch Kinder anderer Hauptgruppen.  
Also eine Gruppe kann auch mehreren Übergeordneten Gruppen zu gewiesen sein.

```
[routers]
10.10.10.1
10.10.10.2

[switches]
172.16.1.1
172.16.1.2

[firewalls]
192.168.1.1

[network:children]
routers
switches
firewalls

[security:children]
routers
firewalls

[lan:children]
routers
switches
```

#### Variablen in der Invetory Datei  


Es können auch variablen deklariert werden, die dann im Playbook zu verfügung stehen.

Bei einem einzelnen Host egal ob Global oder in der Gruppe wird die Variable oder auch mehrer einfach hinter dem Hostnamen deklariert. Es gibt auch schon vorgefertigte Variablen die ansible dann benutzt wenn sie deklariert werden.  
Das sind alle variablen die mit ansible\_ anfangen. Sie dienen um z.b einen bestimmten ssh Benutzer anzugeben oder einen anderes ssh port zu nehmen.   
Die Syntax

varaiblename=wert

Sollen mehere Variablen adefiniert werden einfach mit leerzeichen trennen.  
Werte mit Leerzeichen sind nicht gültig. Bzw müssen in Anführungszeichen gesetzt werden.

Beispiel:

```
192.168.0.1 ansible_user=root ansible_port=222
```

Anhand den obigen Beispiels nimmt Ansible zum verbinden zu dem Host den Benutzer root und den Port 222 an statt den standard Port 22.

Wir können auch variablen einer Gruppe hinzufügen. Wenn jeder host in der Gruppe diese Variablen haben soll.

Beispiel:

```
[routers]
10.10.10.1
10.10.10.2

[switches]
172.16.1.1
172.16.1.2


[routers:vars]
ansible_user=root 
ansible_port=222

[switches:vars]
ansible_user=admin 
ansible_port=22


```

Im oben genannten Beispiel wird in eckigen Klammern der Gruppenname gschrieben und dann mit Doppelpunkt direkt dahinter der Tag vars

Nun werden die Variablen (Eine Zeile für eine Variable) untereinadner eingetragen.  
Nun hat die Gruppe routers als Benutzername root und den port 222 und die Gruppe switches den Benutzernamen admin und den Port 22.

Möchte man eine Variable defienieren die für alle Gruppen gillt wird als Gruppenname all und der Tag vars verwendet.  
Somit gillt für alle Gruppen der Benutzer admin und der Port 22

```
[routers]
10.10.10.1
10.10.10.2

[switches]
172.16.1.1
172.16.1.2


[all:vars]
ansible_user=admin 
ansible_port=22
```

#### Vorfefinierte Variablen  


Die Variablen die in der Inventory Datei verwendet werden können

```
ansible_user=admin 									#Benutzername für die ssh verbindung
ansible_port=22										#Port für die SSH Verbindung
ansible_password=mypass								#SSH Passwort wenn keine Schlüsseldatei verwendet wird. Passwörter niemals als Plaintext speichern. Nehmt dazu das ansible vault (Dazu mehr im Kapitel Ansible Vault)
ansible_ssh_private_key_file=path_to/ssh_privkey 	#Der Private Schlüssel der verwendet werden soll zum Verbinden, wenn der Schlüssel dazu nicht im .ssh Verzeichnis liegt
ansible_connection=ssh								#Die Verbindungsmethode wie ansible zum Host verbinden soll. Hier ssh
ansible_become=yes									#Hat der ssh Benutzer keine root rechte soll sudo verwendet werden (yes,no) 
ansible_become_pass=passwort123						#Braucht der sudo Benutzer ein Kennwort, kann das Kennwort übergeben werden. Wird nur ausgewertet wenn ansible_become yes festgelegt ist
ansible_shell_type=sh								#Wählt den shell Type aus. Entweder sh csh oder fish shell
```

# Playbook

Playbooks sind Rezepte wo die Befehle hintereinander abgearbeitet werden können ähnlich einem schellscript

# YAML Syntax

#### YAML Syntax

Eine YAML Datei fängt immer mit 3 strichen an.

```YAML
---
```

YAML ist eine Sprache die auf Listen und und Wörterbüchern basiert. Es ist eine Datei zur Daten Seriliation.  
um zu überprüfen ob die YAML Datei Syntax richtig ist ohne sie Ansible spezefisch zPrüfen können wir das hier tun  
[https://www.yamllint.com/](https://www.yamllint.com/)  
Am Anfang steht der name und nach dem Doppelpunkt der Wert.  
Werte können String, ganzezahlen floats und bool sein (true/false)  
  
Ein Wörterbucheintrag sieht so aus:

```
---
meinevariablennamen: wert
...
```

Eine einfache Mitarbeiterakte. So kann man schachteln. Einfach einen Objektnamen als übergeordnet objekt deklarieren, also nur mit Doppelpunkt ohne Wert. Die Wörterbucheinträge darunter legen. Immer mit zwei Leerzeichen eingerückt.

```
martin:
  name: Martin Dev
  job: Developer
  skill: Elite
```

Ist ein Wert angeben, so müssen die unterwerte direkt ohne zwei Einrücken druntergeschrieben werden

```
martin: wert
name: Martin Dev
job: Developer
skill: Elite
```

Listen:  
Listen beginnen mit einem Bindestrich und einem Leerzeichen.  
Die Raute ist ein kommentar

```
---
# Eine Liste mit leckeren Früchten
- Apple
- Orange
- Strawberry
- Mango
...
```

Nun können wir mit dem oben gelernten Mitarbeiterdatensätze anlegen. Denn das Übergeordneteobjekt in unserem Beispiel oben, machen wir zu einer Liste.  
So <span class="" data-i18n="39f846112857ad226d019e1106ee6f0ce40fbff9/40" data-source="More complicated data structures are possible, such as lists of dictionaries, dictionaries whose values are lists or a mix of both:">sind auch kompliziertere Datenstrukturen möglich,z.B.Listen von Wörterbüchern,Wörterbücher,deren Werte Listen sind,oder eine Mischung aus beidem:</span>

```
# Mitarbeiterdatensätze
- martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
- tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang
```

Eine Liste muss immer ein übergordnetes Objekt haben. Im Oberen Beispiel sind die   
\---  
Striche das root / übergeordnete Objekt für  
  
\- martin  
\- tabitha  
  
Innerhalb der Akte ist   
skills:   
das übergeordnete Objekt für die Listeneinträge   
\- lisp   
\- fortran   
\- erlang   
usw.

Beispiel:   
Die Übergeordneten Objekte liste 1-3 sind uniqe und dürfen nicht mehrfach vorkommen.  
innerhalb eine Liste dfarf ein Wert mehrfach vorkommen, wenn es ein listen item ist.  
Dies erkennt man an dem minus davor.

```YAML

---
- name: irgendwas
  variable: wert
  variable2: wert
  liste8:
    - package: null
    - var1: 1
    - package: null
    - var2: 2
  variable3: wert
  variable4: wert
  liste6:
    - dieserwertkannwiederdoppeltvorkommen
    - dieserwertkannwiederdoppeltvorkommen
  variable5: wert
  variable6: wert
  nocheinevariable: null
  variableideinmalvorkommt: wert
  #hier gillt eine ausnahme, hier müssen zwei leerzeichen rein, da dieser wert einen haupteintrag darstellt und somit nur einmal vorkopmmen darf
  listemitwert: wert
    - eintrag1
    - eintrag2
  liste5:
    - dieserwertkannwiederdoppeltvorkommen
    - dieserwertkannwiederdoppeltvorkommen
    - dieserwertkannwiederdoppeltvorkommen
```

# Roles

Rollen sind zu verstehen wie funktionen.  
Quasi ein Playbook was immer wieder verwendet werden kann weil es mit Parametern gefüttert wird.  
Playbooks rufen dann diese Roles auf. Somit bleibt eigentliche Playbook klein und übersichtlich

# Role Grundgerüst erstellen

Um eine Rolle zu erstellen muss man in seinem Projekt Verzeichnis wenn nicht schon vorhanden ein Verzeichnis roles erstellen.  
zum Beispiel, diese Verzeichnis. Wenn nicht besteht dann anlegen.

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

Nun kann mittels ansible Galxay Befehl eine Rolle angelegt werden  
Der Aufbau einer Rolle ist immer der benutzername.rolenname  
Wir nennen unsere Rolle mal ansibe-role-test oder ansible-roletest wie ihr möchtet  
also der Befehl lautet:

```shell
ansible-galaxy init immohacker.ansible-role-test
```

  
Hier mit wird dann folgende Verzeichnisstruktur erstellt:

```shell
~/mein-ansible/project1/roles/immohacker.ansible-test-role
```

Die Verzeichnisstruktur sieht dann so aus:

```shell
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml


```

in der /meta/main.ymll kommen die Daten und die Versionsnummern rein. Diese Datei muss auch vorhanden sein, wenn die rolle mit Ansible Galaxy zur verfügung gestellt werden soll. Siehe [Repo in ansible Galaxy hinzufügen](https://wiki.hacker-net.de/books/ansible/page/repo-in-ansible-galaxy-hinzufugen "Repo in ansible Galaxy hinzufügen")  
bei jeder Änderung an der Rolle muss die Versionsnummer in der Datei erhöht werden.  
Diese Datei dient

Die wichtigsten Punkte in der Datei sind:

```shell
authors : Unser Name
Description : Beschreibung der Rolle, also was macht diese.
company : Deine Firma ist optional
#Eine liste von Platformen gibt es hier: https://galaxy.ansible.com/api/v1/platforms/
platforms:
 - name: Debian
   versions:
   - stretch
   - buster
   - bullseye
   - all

#Die midestversion von ansible
min_ansible_version: "2.1"

#Unterwelchen suchbegriffen die Rolle gefunden werde soll, die Tags
galaxy_tags: ['etstbegriff1','testbegriff2','testbegriff3','testbegriff4']

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 kann darin gearbeitet werden.  
Möchte man das ganze noch in ein Git Repo syncen dann siehe Abschnitt :   
[Ansible Role zu Github hinzufügen](https://wiki.hacker-net.de/books/ansible/page/ansible-role-zu-github-hinzufugen "Ansible Role zu  Github hinzufügen")

# 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.

# Github

Kurzer Exkurs zu Github

# Github Konto anlegen

1. Auf [www.github.com](http://www.github.com) auf sign up klicken  
    E-Mail Adresse festlegen.  
    Kennwort festlegen  
    Alle schritte mit Continue bestätigen  
    [![Screenshot_2022-07-10 Build software better, together(2).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/aIc781K4vIQzi6O9-screenshot-2022-07-10-build-software-better-together2.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/aIc781K4vIQzi6O9-screenshot-2022-07-10-build-software-better-together2.png)  
    Nun bestätigen das man ein Mensch ist  
    [![Screenshot_2022-07-10 Build software better, together(3).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/ZwLdw77vUveJQJ8S-screenshot-2022-07-10-build-software-better-together3.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/ZwLdw77vUveJQJ8S-screenshot-2022-07-10-build-software-better-together3.png)  
    Nun die Aufgabe lösen und das richtige Bild auswählen. Dies muss zwei mal gemacht werden.  
    [![Screenshot_2022-07-10 Build software better, together(4).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/bunGI3tQ1q3ToHmD-screenshot-2022-07-10-build-software-better-together4.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/bunGI3tQ1q3ToHmD-screenshot-2022-07-10-build-software-better-together4.png)  
    Dies wird noch einmal wiederholt, und wenn dies richtig beantwortet wurde, auf Create account klicken  
    [![Screenshot_2022-07-10 Build software better, together(5).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/jOdY8Wv4LsoaB6Xf-screenshot-2022-07-10-build-software-better-together5.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/jOdY8Wv4LsoaB6Xf-screenshot-2022-07-10-build-software-better-together5.png)  
    Nun wird an die Emailadresse ein Zahlen code gesendet, diesen eintippe oder copy paste  
    [![Screenshot_2022-07-10 Build software better, together(6).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/BVoKJtSwwte8497b-screenshot-2022-07-10-build-software-better-together6.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/BVoKJtSwwte8497b-screenshot-2022-07-10-build-software-better-together6.png)  
      
    nachdem der Zahlencode eingetragen wurde, noch ein paar Personaliesierungsfragen und welchen Plan man wählen will. Wir nehmen im Anschluss natürlich die kostenfreie Variante. Aber das bleibt euch überlassen.  
    Ich habe just me and Student ausgewählt.   
    Wählt das was für euch zutrifft. Und dann auf Continue  
      
    [![Screenshot_2022-07-10 Build software better, together(8).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/LGHYDBwQn6v5oWe8-screenshot-2022-07-10-build-software-better-together8.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/LGHYDBwQn6v5oWe8-screenshot-2022-07-10-build-software-better-together8.png)  
    jetzt noch was euch interessiert, ich hab Automation and CI/CD gewählt.  
    Aber auch hier wieder, was für euch Zutrifft  
    [![Screenshot_2022-07-10 Build software better, together(9).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/pIvTqi2lVztpxnLA-screenshot-2022-07-10-build-software-better-together9.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/pIvTqi2lVztpxnLA-screenshot-2022-07-10-build-software-better-together9.png)  
    Zum schluss noch den Plan auswählen. Ich habe Free gewählt. Aber das bleibt euch überlassen.  
    Im Free Account habt ihr 500MB frei. Für reine Textdateien reicht das dicke.  
    [![Screenshot_2022-07-10 Build software better, together(10).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/7S2djp0OZMUVcz8O-screenshot-2022-07-10-build-software-better-together10.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/7S2djp0OZMUVcz8O-screenshot-2022-07-10-build-software-better-together10.png)  
      
    und schon sind wir aufm Dashboard  
    [![Screenshot_2022-07-10 Build software better, together(11).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/H1UWGEaqUlFqvYpd-screenshot-2022-07-10-build-software-better-together11.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/H1UWGEaqUlFqvYpd-screenshot-2022-07-10-build-software-better-together11.png)

# Git Daten im Client hinterlegen

1. Man hat auch die möglichkeit vom laptop oder wo auch immer code zu Programmieren und dann hochzuladen. So braucht man das nicht auf der Github Seite zu programmieren. Dazu müssen Benutzername Email und ein Public Key SSH KEY bei Github hochgeladen werden.
2. Im Terminal die Daten setzten.  
    Wenn auf dem Computer nur ein Github Account besteht dann können die Daten global gesetzt werden.   
    Ansonsten diesen Schritt auslassen, da diese Daten im Verzeichnis des jeweiligen Git Repos hinterlegt werden, zu dessen Account dieser gehört.  
    ```shell
    git config --global user.email "eure_emeail_adresse"
    git config --global user.name "immohacker"
    ```
    
    Siehe Abschnitt [Git mit mehreren Schlüsseln auf einem Client](https://wiki.hacker-net.de/books/ansible/page/git-mit-mehrehren-schlusseln-auf-einem-client "Git mit mehreren Schlüsseln auf einem Client"):
3. In Github den Schlüssel hochladen.  
    Den Schlüssel auslesen mittels Terminal  
    ```
    cat ~/.ssh/id_rsa.pub
    
    oder mit einem Editor öffnen und dann kopieren
    Ich mache das gern eben übern Terminal.
    ```
    
    Solltet Ihr noch keinen Schlüssel haben. Einfach übern Terminal erstellen.  
    Bei der Frage Passphrase einfach enter drücken, nix eingeben
    
    ```
    ssh-keygen -t rsa -b 4096
    ```
    
    Standardmäßig wird das Homeverzeichnis mit dem namen id\_rsa vorgeschlagen. Dieses würde Ich auch beibehalten.  
      
    Auf die Github Seite einloggen dann auf das Profilsymbol und dann Settings auswählen  
    [![Screenshot_2022-07-10 Build software better, together.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/70eMotM49cwpyrCa-screenshot-2022-07-10-build-software-better-together.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/70eMotM49cwpyrCa-screenshot-2022-07-10-build-software-better-together.png)  
      
    Nun links im Menü auf SSH and GPG Keys, dann auf New SSH key klicken  
    [![Screenshot_2022-07-10 SSH and GPG keys.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/1K5SbVuSdDjQAgOo-screenshot-2022-07-10-ssh-and-gpg-keys.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/1K5SbVuSdDjQAgOo-screenshot-2022-07-10-ssh-and-gpg-keys.png)  
      
    Nun einen Namen vergeben, der den Rechner Identifiziert, denn man könnte ja das Git Repo mit mehreren Geräten verwalten. Und den ssh key unten einfügen. Beginnt mit ssh-rsa und endet mit dem Rechnernamen.  
      
    [![Screenshot_2022-07-10 Add new SSH keys.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/BNlmzsO60PzLONd0-screenshot-2022-07-10-add-new-ssh-keys.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/BNlmzsO60PzLONd0-screenshot-2022-07-10-add-new-ssh-keys.png)
    
      
    Nun kann auf das Konto per ssh Zugriffen werden. So das der Git Client commits durchführen kann.  
    Fertig.  
    [![Screenshot_2022-07-10 Build software better, together(1).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/jGyB9hXkvIMPWDoV-screenshot-2022-07-10-build-software-better-together1.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/jGyB9hXkvIMPWDoV-screenshot-2022-07-10-build-software-better-together1.png)

# Eine Repo in Github anlegen

Bevor Dokumente in eine Repo hoch und Runtergeladen werden können muss eine Repo angelgt sein.  
Bevor also eine Rolle oder Collection für Github vorbereitet wird. erstellen wir erst die Repo.

1. Dazu auf Github einloggen dann Repository und New klicken  
    [![Screenshot_2022-07-10 Your Repositories.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/xmUJpIMsCkRTWQa2-screenshot-2022-07-10-your-repositories.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/xmUJpIMsCkRTWQa2-screenshot-2022-07-10-your-repositories.png)  
      
    Nun einen Namen vergeben bei einer rolle  
    ansible-meinrollenname  
    Bei einer collection  
    ansible-collection-meincollectionname.  
    Wenn kein Collection in der Mitte steht, ist es automatisch eine Rolle  
    Diese Verzeichnisvorgaben sind Empfehlungen von mir, Man kann die Sachen nennen wie man möchte  
    Der Platzhlater typ im namen sagt hier nur aus. Rolle oder Collection. Wenn es ne rolle ist wird Typ weggelassen  
    Auf Create repository klicken, fertig.  
    [![Screenshot_2022-07-10 Create a New Repository.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/BuomxBQsMR7LosvG-screenshot-2022-07-10-create-a-new-repository.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/BuomxBQsMR7LosvG-screenshot-2022-07-10-create-a-new-repository.png)  
    Nun wird noch gezeigt wie man hochladen kann. Diese Anleitung brauchen wir nicht.  
    Weil unsere Rolle / Collection ja schon besteht, da wir diese ja erst später bei github veröffentlichen wollen.  
    [![Screenshot_2022-07-10 immohacker ansible-typ-test.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/hw4uQIsTlqnKTrqF-screenshot-2022-07-10-immohacker-ansible-typ-test.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/hw4uQIsTlqnKTrqF-screenshot-2022-07-10-immohacker-ansible-typ-test.png)  
    Fertig.

# Ansible Role zu  Github hinzufügen

1. Erstmal die Repo mit der Namenskonvention anlegen: Siehe Abschnitt:  
    [Eine Repo in Github anlegen](https://wiki.hacker-net.de/books/ansible/page/eine-repo-in-github-anlegen "Eine Repo in Github anlegen")
2. Im Terminal in den Ordner der Rolle gehen dort folgenden Befehle eingeben umd das Git erstmalig einzurichten.  
    Falls mehrere Git Accounts auf einem Rechner benutzt werden sollen siehe Abschnitt :   
    [Git mit mehreren Schlüsseln auf einem Client](https://wiki.hacker-net.de/books/ansible/page/git-mit-mehrehren-schlusseln-auf-einem-client "Git mit mehreren Schlüsseln auf einem Client")  
      
    ```shell
    #damit wird das Verzeichnis für git vorbereitet
    git init
    #das komplette verzeichnis samt unterverzeichnisse zum syncen markieren
    git add .
    #Nun einen Verwendungszweck für das Commiten also änderung hochschieben vergeben. Beim ersten mal Initial Commit, ansonsten die Änderungen
    git commit -m 'Initial Commit'
    #den branch auswählen
    git branch -M main
    #den Remotepfad angeben. Syntax besteht aus benutzernamen/ansible-role-rollenname
    git remote add origin git@github.com:immohacker/ansible-meinerolle
    
    #Nur wenn mehere Github Accounts verwendet werden hier noch Benutzername und Email übergeben
    Gleichzeitig den richtigen Benutzername und Email setzten
    git config user.email "meinepersonalemail"
    git config user.name  "immohacker"
    #Nur wenn mehere Github Accounts verwendet werden hier noch Benutzername und Email übergeben ende
    git push -u origin main
    
    ```
3. Rolle aktualisieren. Wenn Änderungen ins Git geschoben werden sollen, braucht man nicht nochmals alles angeben.  
    Ein paar Befehle reichen:  
      
    ```
    #wieder das ganze Verzeichnis samt Unterverzeichnisse
    git add .
    #Einen Namen für das Commit vergeben
    git commit -m 'update irgendwas'
    #Den Branch festlegen
    git branch -M main
    #Hochschieben
    git push -u origin main
    #fertig.
    
    Man kann sich das auch in eine sh Datei packen und muss dann nur noch den Namen fürs commit übergeben
    Beispiel
    
    nano update.sh
    
    #!/bin/bash
    #wieder das ganze Verzeichnis samt Unterverzeichnisse
    git add .
    #Einen Namen für das Commit vergeben
    git commit -m '$1'
    #Den Branch festlegen
    git branch -M main
    #Hochschieben
    git push -u origin main
    #fertig.
    
    chmod +x update.sh
    
    ./update.sh "Mein Commit"
    ```
4. möchte man eine Repo komplett überschreiben, weil zum Beispiel was gelöscht hat im Remote aber dann doch das Repo vom lokalen hinzufügen möchte gibts den Parameter force.  
    Somit wird die Remote Repo komplett überschrieben
    
    ```shell
    git push --force -u origin main
    ```
    
    Damit wird das Repo vom lokaen stand überschrieben.  
    genaus gehts auch umgekehrt mit
    
    ```shell
    git pull --force -u origin main
    
    ```
    
    Alle Commits löschen und die vom lokalen aufs Remote Repo schieben.  
    Damit wird das .git Verzeichnis gelöscht und neuerstellt.
    
      
    ```
    Git Verzeichnis löschen
    rm -rf .git
    #Git Neu init
    git init
    
    #Repo Verbinden inunserem beispiel die ansible collection,sollte man mehrere Benutzer haben dann mit dem namen davor
    #original mit nur einem Benutzernamern bei git. Hier wählen, beides geht nicht
    git remote add origin https://github.com/immohacker/ansible-rolename
    #oder mit einem anderen account bei git
    git remote add origin git@git_immohacker:immohacker/ansible-rolename
    
    #Nun noch die Credentials neu setzten, wenn mehrere Benutzer benutzt weden
    #ansonsten überspringen, weil diese dann ja schon glabal eingetragen sind.
    git config user.email "meinepersonalemail"
    git config user.name  "immohacker"
    #Remotestand anschauen
    git remote -v
    
    #Output:
    #origin	git@git_immohacker:https://github.com/immohacker/ansible-rolename.git (fetch)
    #origin	git@git_immohacker:https://github.com/immohacker/ansible-rolename.git (push)
    
    #branch festlegen
    git checkout -b main
    
    #Alle Dateien hinzufügen
    git add .
    
    #Commit namen vergeben und alle dateien zum change hinzufügen (-a)
    git commit -m "Initial commit"
    git push -f origin main
    ```

# Ansible Collection zu  Github hinzufügen

1. Erstmal die Repo mit der Namenskonvention anlegen: Siehe Abschnitt:  
    [Eine Repo in Github anlegen](https://wiki.hacker-net.de/books/ansible/page/eine-repo-in-github-anlegen "Eine Repo in Github anlegen")
2. Im Terminal in den Ordner der Collection gehen dort folgenden Befehle eingeben umd das Git erstmalig einzurichten.  
    Falls mehere Git Accounts auf einem Rechner benutzt werden sollen siehe Abschnitt :   
    [Git mit mehreren Schlüsseln auf einem Client](https://wiki.hacker-net.de/books/ansible/page/git-mit-mehrehren-schlusseln-auf-einem-client "Git mit mehreren Schlüsseln auf einem Client")  
      
    ```shell
    #damit wird das Verzeichnis für git vorbereitet
    git init
    #das komplette verzeichnis samt unterverzeichnisse zum syncen markieren
    git add .
    #Nun einen Verwendungszweck für das Commiten also änderung hochschieben vergeben. Beim ersten mal Initial Commit, ansonsten die Änderungen
    git commit -m 'Initial Commit'
    #den branch auswählen
    git branch -M main
    #den Remotepfad angeben. Syntax besteht aus benutzernamen/collectionname
    git remote add origin git@github.com:immohacker/ansible-collection-meinname
    #Nur wenn mehere Github Accounts verwendet werden hier noch Benutzername und Email übergeben
    Gleichzeitig den richtigen Benutzername und Email setzten
    git config user.email "meinepersonalemail"
    git config user.name  "immohacker"
    #Nur wenn mehere Github Accounts verwendet werden hier noch Benutzername und Email übergeben ende
    git push -u origin main
    
    ```
3. Collection aktualisieren. Wenn Änderungen ins Git geschoben werden sollen, braucht man nicht nochmals alles angeben.  
    Ein paar Befehle reichen:  
      
      
    ```
    #wieder das ganze Verzeichnis samt Unterverzeichnisse
    git add .
    #Einen Namen für das Commit vergeben
    git commit -m 'update irgendwas'
    #Den Branch festlegen
    git branch -M main
    #Hochschieben
    git push -u origin main
    #fertig.
    
    Man kann sich das auch in eine sh Datei packen und muss dann nur noch den Namen fürs commit übergeben
    Beispiel
    
    nano update.sh
    
    #!/bin/bash
    #wieder das ganze Verzeichnis samt Unterverzeichnisse
    git add .
    #Einen Namen für das Commit vergeben
    git commit -m '$1'
    #Den Branch festlegen
    git branch -M main
    #Hochschieben
    git push -u origin main
    #fertig.
    
    chmod +x update.sh
    
    ./update.sh "Mein Commit"
    ```
4. möchte man eine remote Repo komplett überschreiben, weil zum Beispiel was gelöscht hat im Remote aber dann doch das Repo vom lokalen hinzufügen möchte gibts den Parameter force.  
    Somit wird die Remote Repo komplett überschrieben
    
    ```shell
    git push --force -u origin main
    ```
    
    Damit wird der lokale stand vom Remote überschrieben.
    
    ```shell
    git pull --force -u origin main
    ```
    
    Alle Commits löschen und die vom lokalen aufs Remote Repo schieben.  
    Damit wird das .git Verzeichnis gelöscht und neuerstellt.
    
    ```shell
    #Git Verzeichnis löschen
    rm -rf .git
    #Git Neu init
    git init
    
    #Repo Verbinden inunserem beispiel die ansible collection,sollte man mehrere Benutzer haben dann mit dem namen davor
    #original mit nur einem Benutzernamern bei git, Hier wählen, beides geht nicht
    git remote add origin https://github.com/immohacker/ansible-collection-general
    #oder mit einem anderen account bei git
    git remote add origin git@git_immohacker:immohacker/ansible-collection-general
    
    #Nun noch die Credentials neu setzten, wenn mehrere Benutzer benutzt weden
    #ansonsten überspringen, weil diese dann ja schon glabal eingetragen sind.
    git config user.email "meinepersonalemail"
    git config user.name  "immohacker"
    #Remotestand anschauen
    git remote -v
    
    #Output:
    #origin	git@git_immohacker:https://github.com/immohacker/ansible-collection-general.git (fetch)
    #origin	git@git_immohacker:https://github.com/immohacker/ansible-collection-general.git (push)
    
    #branch festlegen
    git checkout -b main
    
    #Alle Dateien hinzufügen
    git add .
    
    #Commit namen vergeben und alle dateien zum change hinzufügen (-a)
    git commit -m "Initial commit"
    git push -f origin main
    
    
    
    ```
    
    Fertig. Nur ein Commit und alles neu erstellt.
    
    Diese Collection Repo Ansible Galaxy verbinden

# Git mit mehreren Schlüsseln auf einem Client

1. Es besteht die ja die Möglichkeit das man einen privaten Github Account und einen Firmen Github Account hat.  
    Wie unterteilt man dieses? Es gibt Gott sei dank im .ssh verzeichnis eine Datei die nennt sich config.  
    Diese öffnen wir im Terminal mit nano.  
    Die Variable Host ist ein alias der nachher für den Gitservernamen gewählt wird.  
    ```
    nano ~/.ssh/config
    
    # Company account
    Host company
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_company
    
    # Personal account
    Host personal
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_personal
    ```
2. Sollte ein neuer SSH Schlüssel auf System kopiert werden, also am System nicht selbst erstellt dann müssen der Private und public key kopiert werden. Ansonsten diesen Teil überspringen  
    Beispiel:
    
    ```
    #Private key
    cp mein_privat_schlüssel_woher_auch_immer ~/.ssh/id_rsa_immohacker
    #Public Key
    cp mein_public_schlüssel_woher_auch_immer ~/.ssh/id_rsa_immohacker.pub
    
    ```
    
    Nun die rechte setzten
    
    ```
    chmod 600~/.ssh/id_rsa_immohacker
    chmod 600~/.ssh/id_rsa_immohacker.pub
    ```
    
    und den Schlüssel in den ssh agent einspielen
    
    ```shell
    ssh-add ~/.ssh/id_rsa_immohacker
    ```
3. Nun die Repo neu im Git Verzeichnis festlegen.  
    Damit das allerdings geht müssen falls vorhanden der globale Name aus dem Git entfernt werden. Dazu
    
    ```
    git config --global --unset user.name
    git config --global --unset user.email
    ```
    
    nun die Neue Repo mit allem was dazu gehört festlegen.
    
    ```shell
    git remote add origin git@github.com:immohacker/ansible-role-meinerolle
    in
    git remote add origin git@personal:immohacker/ansible-role-meinerolle
    ändern
    Gleichzeitig den richtigen Benutzername und Email setzten
    git config user.email "meinepersonalemail"
    git config user.name  "immohacker"
    ```
    
      
    Und in der Firmen Git Verzeichnis
    
    ```shell
    git remote add origin git@github.com:meincompanyname/ansible-role-meinerolle
    in
    git remote add origin git@company:meincompanyname/ansible-role-meinerolle
    ändern
    Gleichzeitig den richtigen Benutzername und Email setzten
    git config user.email "meinefirmenemail"
    git config user.name  "meinfirmenbenutzername"
    ```
    
    Ob Alles geklapp hat, kann man sich mit anschauen
    
    ```shell
    git config -l --show-origin
    
    Ausgabe:
    
    file:.git/config        core.repositoryformatversion=0
    file:.git/config        core.filemode=true
    file:.git/config        core.bare=false
    file:.git/config        core.logallrefupdates=true
    file:.git/config        user.email=xxxxxx
    file:.git/config        user.name=immohacker
    file:.git/config        remote.origin.url=git@git_immohacker:immohacker/ansible-collection-general
    file:.git/config        remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
    
    ```

\--

# .gitignore Datei

Manchmal git es Dateien die nur lokal bleiben sollen und nicht mit hochgeladen werden sollen.  
Zum Beispiel die Update Scripte.  
  
Im Hauptverzeichnis des Projektes also da wo auch das ".git" Verzeichnis liegt, in der gleichen Ebene eine Datei mit dem Namen .gitignore erstellen.  
  
Dann sähe das ganze so aus:

```shell
tree -a -L 1

output:

.
├── docs
├── galaxy.yml
├── .git
├── .gitignore
├── initgit.sh
├── plugins
├── README.md
├── resetremote.sh
└── roles

Wie zu erkennen liegen .git und .gitignore auf einer Ebene

```

In Diese Datei mit Relativen Pfaden die Dateien rein die ignoriert werden sollen.  
In unserem Beispiel 3 Dateien, eine davon in Einem Unterverzeichnis.  
Gibt man nur das Unterverzeichnis an werden alle Dateien samt Verzeichnis ignoriert.

```
initgit.sh
resetremote.sh
plugins/README.md
```

# Ansible Galaxy

# Konto bei Ansible Galaxy anlegen

1. Auf die Seite Ansible Galaxy gehen  
    [https://galaxy.ansible.com/home](https://galaxy.ansible.com/home)  
    Dort oben rechts auf Login klicken.  
    Dann auf das Github Logo klicken.  
    [![Screenshot_2022-07-10 Ansible Galaxy.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/iVt17nyH8sFTERop-screenshot-2022-07-10-ansible-galaxy.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/iVt17nyH8sFTERop-screenshot-2022-07-10-ansible-galaxy.png)  
      
    Nun die Github Daten zum Login eingeben, wenn nicht noch eingeloggt. Ansonsten werdet Ihr weiter geleitet  
      
    [![Screenshot_2022-07-10 Build software better, together(2).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/SRa1vb24J1Efixmh-screenshot-2022-07-10-build-software-better-together2.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/SRa1vb24J1Efixmh-screenshot-2022-07-10-build-software-better-together2.png)  
    Nun Authorize Ansible anklicken  
    [![Screenshot_2022-07-10 Build software better, together(3).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/c3dE2UBL6KWxEtbu-screenshot-2022-07-10-build-software-better-together3.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/c3dE2UBL6KWxEtbu-screenshot-2022-07-10-build-software-better-together3.png)  
    Nun sind wir eingeloggt. Wir loggen uns wieder aus. Dazu auf den namen und auf Logout klicken  
    [![Screenshot_2022-07-10 Ansible Galaxy(3).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/z5QOSp3OrG15wnal-screenshot-2022-07-10-ansible-galaxy3.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/z5QOSp3OrG15wnal-screenshot-2022-07-10-ansible-galaxy3.png)  
    wenn wir uns wieder einloggen wollen. Wieder auf login und auf Das Gitlab Logo klicken.  
    [![Screenshot_2022-07-10 Ansible Galaxy.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/iVt17nyH8sFTERop-screenshot-2022-07-10-ansible-galaxy.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/iVt17nyH8sFTERop-screenshot-2022-07-10-ansible-galaxy.png)  
    Nun haben wir wieder unser Gitlab Login vor uns, wenn wir in Gitlab nicht noch angemeldet sind, ist zweites der Fall werden wir sofort weitergelietet. Ansonsten Daten eingeben und dann werden wir weiter gelietet ins Ansible Galaxy zurück.  
    [![Screenshot_2022-07-10 Build software better, together(2).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/SRa1vb24J1Efixmh-screenshot-2022-07-10-build-software-better-together2.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/SRa1vb24J1Efixmh-screenshot-2022-07-10-build-software-better-together2.png)  
    und wieder eingeloggt. Fertig  
    [![Screenshot_2022-07-10 Ansible Galaxy(2).png](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/scaled-1680-/4ilXenQF0QLkZDWw-screenshot-2022-07-10-ansible-galaxy2.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-07/4ilXenQF0QLkZDWw-screenshot-2022-07-10-ansible-galaxy2.png)

# Repo in ansible Galaxy hinzufügen

nachdem das Ansible galaxy Konto mit Github verknüfpft ist, kann unter Content die Repos hinzugefügt werden.

# Aufbau - Ablaufplan

# Programmaufruf und Struktur

Ansible ist unterteilt in verschiedene Programme, die zwei wichtigsten Hauptprogramme, die wir am Anfang benutzen sind

# Praxis Beispiele

# Proxmox Debian VM mit Ansible und Cloudinit Provisionieren

Beschreibung:  
  
Ein Playbook zum erstellen einer Debian 11 VM per Ansible.

```
---
- name: Create a new VM on Proxmox
  hosts: proxmox
  gather_facts: no
  tasks:
    - name: Ensure the VM disk image is downloaded
      get_url:
        url: https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2
        dest: /var/lib/vz/images/{{ vmid }}/vm-{{ vmid }}-disk-1.qcow2
      register: downloaded_image

    - name: Create VM
      community.general.proxmox_kvm:
        api_user: "{{ prox_user }}"
        api_password: "{{ prox_password }}"
        api_host: "{{ prox_host }}"
        node: "{{ prox_node }}"
        name: "{{ vmvar_hostname }}"
        vmid: "{{ vmid }}"
        memory: "{{ vmvar_memory }}"
        cores: "{{ vmvar_cores }}"
        sockets: 1
        cpuunits: 1000
        net: '{"net0":"virtio,bridge={{ vmvar_vmbr }},firewall=1"}'
        virtio: '{"virtio0":"local:{{ vmid }}/vm-{{ vmid }}-disk-1.qcow2,cache=unsafe,discard=on,size={{ vmvar_disksize }}G"}'
        ostype: "{{ prox_ostype }}"
        kvm: yes
        acpi: yes
        autostart: no
        boot: cnd
        bootdisk: virtio0
        onboot: yes
        scsihw: virtio-scsi-pci
        description: "{{ vmvar_description }}"
        force: yes
      register: created_vm

    - name: Configure VM cloud-init
      community.general.proxmox_cloudinit:
        api_user: "{{ prox_user }}"
        api_password: "{{ prox_password }}"
        api_host: "{{ prox_host }}"
        node: "{{ prox_node }}"
        vmid: "{{ vmid }}"
        searchdomain: "{{ vmvar_searchdomain }}"
        nameserver: "{{ vmvar_nameserver }}"
        gateway: "{{ vmvar_gateway }}"
        ipconfig: "{{ vmvar_ipconfig }}"
        hostname: "{{ vmvar_hostname }}"
        city: "{{ vmvar_city }}"
        country: "{{ vmvar_country }}"
        timezone: "{{ vmvar_timezone }}"
        user: root
        sshkeys: "{{ lookup('file', vmvar_public_key) }}"
        force: yes
      when: created_vm.changed

    - name: Start VM
      community.general.proxmox:
        api_user: "{{ prox_user }}"
        api_password: "{{ prox_password }}"
        api_host: "{{ prox_host }}"
        node: "{{ prox_node }}"
        vmid: "{{ vmid }}"
        state: started
      register: started_vm

    - name: Wait for SSH to become available
      ansible.builtin.wait_for:
        host: "{{ vmvar_ipconfig.split('/')[0] }}"
        port: 22
        search_regex: OpenSSH
        delay: 10
        timeout: 600
      when: started_vm.changed

    - name: Wait for preseed_complete file
      ansible.builtin.command: "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i {{ vmvar_private_key }} root@{{ vmvar_ipconfig.split('/')[0] }} 'test -f /root/preseed_complete'"
      register: preseed_complete
      until: preseed_complete.rc == 0
      retries: 60
      delay: 10
      when: started_vm.changed

    - name: Remove the downloaded QCOW2 image
      ansible.builtin.file:
        path: /var/lib/vz/images/{{ vmid }}/vm-{{ vmid }}-disk-1.qcow2
        state: absent
      when: downloaded_image.changed and started_vm.changed and preseed_complete.rc == 0
```

Nun ein neues Verzeichnis template erstellen.  
Darin eine neue Datei mit dem namen preeseed.cfg.j2 erstellen  
Und diesen Inhalt einfügen

```
# Preseed configuration

d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select {{ vmvar_keyboard_layout }}
d-i time/zone string {{ vmvar_timezone }}

# Partitioning
d-i partman-auto/method string regular
d-i partman-auto/disk string /dev/vda
d-i partman-auto/expert_recipe string                         \
      boot-root ::                                            \
              512 512 512 ext4                                \
                      $primary{ } $bootable{ }                \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext4 }    \
                      mountpoint{ /boot }                     \
              .                                               \
              {{ vmvar_swap_partsize }} {{ vmvar_swap_partsize }} {{ vmvar_swap_partsize }} linux-swap \
                      $primary{ }                             \
                      method{ swap } format{ }                \
              .                                               \
              10000 10000 -1 ext4                             \
                      $primary{ }                             \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext4 }    \
                      mountpoint{ / }                         \
              .

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# Network configuration
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string {{ vmvar_hostname }}
d-i netcfg/get_domain string {{ vmvar_domain }}

# Account setup
d-i passwd/user-fullname string {{ vmvar_fullname }}
d-i passwd/username string {{ vmvar_username }}
d-i passwd/user-password password {{ vmvar_password }}
d-i passwd/user-password-again password {{ vmvar_password }}
d-i user-setup/encrypt-home boolean false

# Package selection
tasksel tasksel/first multiselect standard
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select full-upgrade

# Finishing the installation
d-i finish-install/reboot_in_progress note

# Preseed complete marker
d-i preseed/late_command string echo "preseed_complete" >> /var/log/installer/syslog
d-i preseed/late_command string in-target touch /root/preseed_complete
```

Die Hilfe zu den Parametern

```
# help.txt

Beispiel für die Verwendung des Ansible-Playbooks zum Erstellen einer VM:

ansible-playbook -i inventory.ini create_vm.yml

Stellen Sie sicher, dass Sie die Werte in der inventory.ini-Datei an Ihre Umgebung anpassen. Die wichtigsten Parameter, die Sie anpassen sollten, sind:

1. Proxmox-Host-Parameter:
- prox_api_user: Der Benutzer, der die Proxmox-API verwendet (normalerweise "root@pam").
- prox_api_password: Das Passwort für den API-Benutzer.
- prox_api_host: Die IP-Adresse oder der Hostname Ihres Proxmox-Servers.
- prox_node: Der Name des Proxmox-Knotens, auf dem die VM erstellt werden soll.

2. VM-Parameter:
- vmvar_ostype: Der OS-Typ (z. B. l26 für Linux 2.6/3.x/4.x/5.x Kernel).
- vmvar_disk_size: Die Größe der Festplatte in Gigabyte (z. B. 64G).
- vmvar_cores: Die Anzahl der CPU-Kerne.
- vmvar_memory: Der Arbeitsspeicher in Megabyte.
- vmvar_vmbr: Die Netzwerkbrücke (z. B. vmbr0).
- vmvar_ip_address: Die IP-Adresse der VM.
- vmvar_swap_partsize: Die Größe der Swap-Partition (z. B. 32G).

Die VM wird mit folgendem Partitionslayout erstellt:
- Erste Partition: Boot-Partition mit einer Größe von 512 MB (fest).
- Zweite Partition: Swap-Partition mit einer Größe, die durch den Parameter vmvar_swap_partsize fest

Liste der OS-Typen:

- l26: Linux 2.6/3.x/4.x/5.x Kernel
- other: Anderes OS
- wxp: Windows XP
- w2k: Windows 2000
- w2k3: Windows 2003
- w2k8: Windows 2008
- wvista: Windows Vista
- win7: Windows 7
- win8: Windows 8/2012
- win10: Windows 10/2016/2019



```

Beispiel einer Inventory Datei

```
[proxmox]
#wenn das skript direkt auf dem proxmox host ausgeführt wird
myvm ansible_connection=localhost 
#oder remote von einem laptop oder so
myvm ansible_host=192.168.178.120 ansible_user=root

[proxmox:vars]
prox_api_user=root@pam
prox_api_password=12345678
prox_api_host=192.168.178.120
prox_node=my-node

vmvar_gw=192.168.178.1
vmvar_root_password=mysecretpassword
vmvar_private_key=/path/to/your/private_key
vmvar_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6..."

vmvar_dns=8.8.8.8
vmvar_searchdomain=mydomain.local
vmvar_timezone=Europe/Berlin
vmvar_keyboard_layout=de

[myvm:vars]
vmvar_ostype=l26
vmvar_disk_size=64G
vmvar_swap_partsize=32G
vmvar_cores=2
vmvar_memory=2048
vmvar_vmbr=vmbr0
vmvar_ip_address=192.168.178.200

```

# Ansible vault - Verschlüsseln von Daten

# Ansible Vault Befehle

### Beschreibung:

Dateien mit Passwörtern in Klartext speichern ist nie gut und schon gar nicht in ein git hochladen.  
Denn das zieht sich durch jede Version durch.

Dafür gibt es ansible vault.  
Man braucht ein Master Passwort das bei jedem ausführen eines Playbooks übergeben wird.

### Beispiele:

#### Datei zu verschlüsseln :

```
ansible-vault encrypt <dateiname>


ansible-vault encrypt host.ini

Output:
neues Passowrt vergeben
```

#### Datei bearbeiten, dabei öffnet sich leider nur vim.  


Um den Editor zu ändern, den Ansible Vault für das Bearbeiten verschlüsselter Dateien verwendet, kannst du die Umgebungsvariable `EDITOR` auf deinem System setzen. Standardmäßig verwendet Ansible den Editor, der in der `EDITOR` Umgebungsvariablen festgelegt ist. Wenn diese Variable nicht gesetzt ist, greift Ansible auf einen Standard-Editor zurück, der oft `vi` oder `vim` ist.

Um einen anderen Editor zu verwenden, wie zum Beispiel `nano`, `emacs`, oder einen grafischen Editor wie `gedit`oder `xed`, kannst du die `EDITOR` Umgebungsvariable in deiner Shell-Sitzung setzen. Hier sind Beispiele, wie du das für verschiedene Shells machen kannst:

Bash oder Zsh

Für Bash oder Zsh (die gängigsten Shells auf Linux und macOS) kannst du den Editor für die aktuelle Sitzung mit folgendem Befehl setzen:

<div class="dark bg-gray-950 rounded-md" id="bkmrk-bash"><div class="flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div><div class="dark bg-gray-950 rounded-md" id="bkmrk-export-editor%3Dnano"><div class="p-4 overflow-y-auto">`<span class="hljs-built_in">export</span> EDITOR=nano`</div></div>Wenn du möchtest, dass diese Einstellung dauerhaft bleibt, kannst du diese Zeile zu deiner `~/.bashrc`, `~/.bash_profile` oder `~/.zshrc` Datei hinzufügen, abhängig von deiner Shell und Betriebssystemkonfiguration.

Ich nutze xed,

`<span class="hljs-built_in">export</span> EDITOR=xed`

Nun kann man mit ansible-vault edit Dateien öffnen

```
ansible-vault edit <dateiname>
ansible-vault edit hosts.ini

Output:
Kennwort angeben

```

Nun wird der Texteditor geöffnet, nach dem bearbeiten speichern und schließen.  
Die Änderung fließt zurück.

##### Datei entschlüsseln

Um eine Datei zu entschlüsseln nutzen wir den decrypt Parameter

```
ansible-vault encrypt <dateiname>


ansible-vault encrypt host.ini

Output:
Passowrt eingeben
```

#### Übergeben von Kennwörtern an Playbooks

Wenn du ein Ansible Playbook ausführst und das `--ask-vault-pass`, `--vault-password-file` oder eine Umgebungsvariable für das Vault-Passwort verwendest, wird dieses Passwort für alle Operationen verwendet, die eine Entschlüsselung erfordern, einschließlich des Zugriffs auf deine verschlüsselte `hosts.ini` Datei.

##### 1. Passwort bei der Aufforderung eingeben

Wenn du kein Passwort auf andere Weise angibst, fordert Ansible dich bei der Ausführung des Playbooks zur Eingabe des Vault-Passworts auf:

```
ansible-playbook playbook.yml -i hosts.ini --ask-vault-pass
```

##### 2. Passwortdatei verwenden

Eine bequemere Methode, besonders für automatisierte Skripte, ist die Verwendung einer Passwortdatei. Diese Datei enthält das Vault-Passwort und kann im Befehl referenziert werden. **Stelle sicher, dass diese Passwortdatei sicher aufbewahrt wird und nicht ins Repository gelangt.**

Erstelle zuerst eine Datei (z.B. `.vault_pass.txt`) und schreibe dein Passwort hinein. Verwende dann den `--vault-password-file` Schalter:

```
ansible-playbook playbook.yml --vault-password-file .vault_pass.txt
```

##### 3. Umgebungsvariablen

Du kannst auch eine Umgebungsvariable `ANSIBLE_VAULT_PASSWORD_FILE` setzen, die auf die Passwortdatei verweist. Ansible wird diese Variable automatisch erkennen und verwenden, ohne dass der Schalter `--vault-password-file` benötigt wird.

```
export ANSIBLE_VAULT_PASSWORD_FILE=/pfad/zu/.vault_pass.txt
ansible-playbook playbook.yml
```

Das Kennwort direkt in einer Umgebungsvariable speichern, geht nicht.  
es geht immer nur über die Umgebungsvariable die die Datei enthält mit dem Password.

##### Tipps für die Verwendung verschlüsselter Inventardateien

- Wenn du mehrere Umgebungen (z.B. Staging, Produktion) hast, erwäge die Verwendung unterschiedlicher Vault-Passwörter für zusätzliche Sicherheit.
- Integriere das Vault-Passwort nicht in deine Versionskontrollsysteme. Verwende sichere Speicheroptionen oder Umgebungsvariablen auf den Ausführungssystemen.
- Stelle sicher, dass alle Teammitglieder, die das Playbook ausführen müssen, Zugriff auf das Vault-Passwort oder die Passwortdatei in sicherer Weise haben.

Durch die Verwendung dieser Methoden kannst du sicherstellen, dass deine verschlüsselten Dateien effektiv in deinen Ansible-Workflows genutzt werden können, ohne die Sicherheit deiner sensiblen Daten zu gefährden.