> For the complete documentation index, see [llms.txt](https://prof.aheil.de/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://prof.aheil.de/devops/ansible.md).

# Ansible

## Ziele und Kompetenzen

* Einen Weg der Automatisierung **kennen lernen**
* Grundlagen von Ansible **kennen lernen**

## Automatisierung

**Brainstorming**

* Was machen Sie eigentlich alles am Rechner von Hand...?

***

**Probleme manuell installierter Server**

* Schwer wartbar
* Kosten- und zeitintensiv
* Setup des Servers ist nicht einfach (wenn überhaupt) reproduzierbar
* Oft voller Bugs und Fehler

***

***

**Eine Alternative: Skripte**

* Alles was langweilig ist, oft wiederholt wird, mühsam zu tippen ist, kein Spaß macht, kann man skripten...
* Shell-Skripte (Unix -> Tutorium)
* Batch, PowerShell unter Windows
* Man kann auch jede beliebige Programmiersprache zur Automatisierung verwenden
* Eigentlich schon immer da...

***

**Vorteile von Skripten**

* Einfach zu verstehen
* Straight-forward
* Einfach zu ändern
* Werden interpretiert

***

**Nachteile von Skripten**

* Werden interpretiert
* Kompatibilität (z.B. bei unterschiedlichen Versionen und Shell-Varianten wie *bash* und *sh*
* Nur lokale Ausführung
* Keine Parallelität
* Langsam (pro Kommando ein Prozess vgl. Vorlesung Betriebssysteme)

***

## Betrieb

Das Ops in DevOps

Ist eigentlich allen klar was "Betrieb" oder "Betriebsumfeld" bedeutet?

***

**Betrieb vs. Entwicklung**

* Betrieb
  * Will eigentlich keine Änderungen
  * Strebt vorzugsweise Stabilität an
  * Möglichst wenige Bereitschaftseinsätze (Samstags auf Sonntag um 03:00 am Morgen)
* Entwicklung
  * Will permanent Änderungen (Programmieren macht Spaß)
  * Neue Features um Kunden glücklich zu machen
  * Agilität (das haben wir Ihnen jetzt ja lange genug beigebracht)
  * Andauernd neue Versionen von Framework XYZ, neue Sprachen, neue Tools etc.

***

**Ziele der Automatisierung**

* Entwicklung
  * Automatisiertes Testen
  * Automatisiertes Kompilieren
  * Automatisiertes Paketieren
* Was wollen wir speziell im Betriebsumfeld automatisiert skripten?
  * Automatisierte Installationen
  * Automatisierte Updates
  * Automatisierte Konfigurationen
  * Automatisierte Installationen
  * Automatisierte Rückbauten

***

## Konfigurationsmanagement

* Was ist eigentlich ein sehr mächtiges Werkzeug in der Entwicklung?
  * Versionskontrolle
* Dann ist das doch für den Betrieb auch keine schlechte Idee...

***

**Was wir am besten können**

* Wir schreiben wieder und wieder die gleichen Shell- und Batch-Skripte
* Wir fassen die Skripte, ergänzen diese mit div. Programmen und bauen ein Framework
* Wir generalisieren das Framework so weit, dass es andere verwenden können...

***

**Frameworks**

* Salt / SaltStack
* Puppet
* Chef
* **Ansible**

***

## Ansible

Was ist Ansible eientlich?

* Framework zur Automatisierung administrativer Tätigkeiten
* Leicht verständlich
* Deklarativ
* Idempotent
* Modular

***

**Eigenschaften von Ansible**

* Kein Master
* Keine Agenten
* Konfiguration in YAML
* Einfach zu lernen (Hausaufgabe!)

***

Was wird benötigt

* Ansible verwendet keinen zentralen Server
* Alle Aufgaben werden in *Playbooks* gespeichert
* Control Node
  * Python (2.7/3.x)
  * Ansible
* Nodes
  * ssh-server
  * Python (2.7/3.x)

***

**Inventory**

* Liste von Servern auf die ein Playbook angewendet werden kann

```shell
[db_master]
193.161.1.14

[db_replica]
163.161.1.21
163.161.1.22
163.161.1.23

[web_01]
163.161.1.2
```

* Einfache Textdateien
* Beschreiben die Server
* IP-Adressen *oder* DNS-Namen
* Werden mittels Namen gruppiert
* Variablen und Enumerationen
* Bei *vielen* Systemen sinnvoll

```shell
[db_master]
db-[a:c]-srv

[db_replica]
db[1:3]-srv

[web_01]
{{web_srv}}
```

***

**Playbook**

* Beschreibt den *Zielzustand* des Nodes
* Deklarativ (Unterschied zu imperativ klar?)
* Nutzt YAML (YAML bekannt?)

```shell
-hosts: dev_server  # Gruppenname aus Host-Datei
  user: ubuntu      # Authetifizierung
  sudo: true
  roles
    - java          # Rollen, die installiert werden sollen
    - springboot    
```

> **HINWEIS**: Einen großen Teil Ihrer zukünftigen Karriere in der IT werden Sie damit verbringen, nach fehlenden oder überflüssigen Leerzeichen und nach falschen Einrückungen in YAML-Dateien zu suchen. You are welcome.

***

**Variablen**

* Ermöglichen die Wiederverwendung von Playbooks
* Verschlüsselung (z.B. für Passwörter)
* Können für Tasks, Kommandozeile, Dateien etc. verwendet werden

*provisioning/vars/main.yml*:

```shell
web_srv
```

*provisioning/hosts*:

```shell
[web_01]
{{web_srv}}
```

***

**Rollen-Verzeichnisse**

```
└── provisioning/ 
    ├── .gitignore
    ├── dev-playbook.yml
    ├── prod-playbook.yml
    ├── group_vars/
    │   └── all.yml
    └── roles/
        ├── java/
        │   ├── defaults/ # Variablen
        │   ├── files/   
        │   ├── handlers/
        │   └── tasks/
        ├── ...
        └── springboot/
            ├── ...
            └── ...
```

***

**Module**

Quasi für "Alles" Module verfügbar

```shell
- name: Copy the required files
  copy:
    src: files/
    dest: "{{config_dir}}"
    force: yes
  tags: 
    - config
```

***

**Shell-Module**

Für alles, für das es keine Modul gibt 🤓

```shell
- name: Magic happens hier 
  shell: /opt/hardening.sh
  tags: 
    - shell
```

> **Hinweis**: Datei vorher auf Server kopieren, Executable Flag setzen etc.

***

***

**Handlers**

*provisioning/roles/db/handlers/main.yml:*

```
---
- name: restart db
  service: name=db =state=refresh
```

```
- name: Copy DB config
  copy: src=db.conf dest/etc/db/db.conf
  notify: restart db
```

***

**Spezifische Module ausführen**

Spezifische Module ausführen

```shell
sudo ansible-playbook -i hosts playbook.yml --tags hardening
```

Hinweis:

* Es werden nur Rollen in Betracht gezogen, die im Playbook aufgeführt sind
* Mehrere Tags pro Eintrag möglich

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://prof.aheil.de/devops/ansible.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
