From 993d5f2e2bf99bea3aa13615c57092be6d0c9183 Mon Sep 17 00:00:00 2001 From: jonnybravo Date: Mon, 14 Sep 2026 11:48:21 +0200 Subject: [PATCH] Anpassung Powerpoint --- README.md | 130 +++++++++++++++++++++++++++++++++++++ ansible_praesentation.pptx | Bin 176733 -> 176746 bytes create_presentation.py | 18 ++--- 3 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..fd30e2d --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# Ansible-Präsentation — Übersicht + +Moderne Präsentation über Ansible mit begleitendem Handout und einem +lauffähigen Beispiel-Projekt. Alles in Python generiert und reproduzierbar. + +--- + +## Inhalt des Ordners + +``` +ansible_präsentation/ +├── ansible_praesentation.pptx # Die fertige Präsentation (19 Folien, 16:9) +├── create_presentation.py # Python-Skript, das die .pptx erzeugt +├── handout.md # Handout (Markdown-Quelle) +├── handout.docx # Handout (druckbar/editierbar, für OnlyOffice) +├── assets/ +│ ├── ansible_mark_red.png # Ansible-Logo (rot) — Quelle: Wikimedia Commons +│ ├── ansible_mark_white.png # Ansible-Logo (weiß) +│ ├── ansible_logo.svg # Logo-Quelldatei (SVG) +│ └── architektur.png # Architektur-Diagramm (automatisch erzeugt) +└── Beispiel/ # Lauffähiges Beispiel-Playbook (siehe unten) +``` + +--- + +## 1. Die Präsentation (`ansible_praesentation.pptx`) + +19 Folien, 16:9, in den Ansible-Brandfarben (Rot `#EE0000`, Anthrazit `#1A1918`). + +| # | Titel | Inhalt | +|---|-------|--------| +| 1 | Titel | Agenda, Ansible-Logo | +| 2 | Was ist Ansible? | Definition, Merkmale (agentenlos, idempotent, …) | +| 3 | Architektur | Control Node, Managed Nodes (Diagramm) | +| 4 | Vier Kernkonzepte | Playbooks, Inventory, Module, Rollen | +| 5 | YAML-Syntax | Grundregeln + Inventory-Beispiel | +| 6 | Playbook | site.yml mit Tasks & FQCN | +| 7 | Module | 6 Modul-Kategorien | +| 8 | Ad-hoc-Befehle | `ansible`-CLI ohne Playbook | +| 9 | Jinja2 | `{{ variable }}`, Filter, `.j2`-Templates | +| 10 | Gather Facts | Facts auslesen, Custom Facts, `gather_facts` | +| 11 | Variablen & Präzedenz | Quellen + Reihenfolge (wer gewinnt) | +| 12 | FQCN (Definition) | `namespace.collection.modul` | +| 13 | FQCN (Praxis) | Beispiele + Warum | +| 14 | Collections | Was sie sind (6 Bestandteile) | +| 15 | Collections nutzen | Galaxy, Installation, Struktur | +| 16 | Rollen (Konzept) | Wiederverwendbarkeit, Kapselung | +| 17 | Rollen (Struktur) | `roles/webserver/` Verzeichnisbaum | +| 18 | Praxisbeispiel | Playbook mit Rolle + Variablen | +| 19 | Zusammenfassung | Key-Takeaways + Quellen | + +**Design-Hinweis:** Die Präsentation nutzt die Schriftarten **Carlito** (Body) +und **DejaVu Sans Mono** (Code), da Calibri/Consolas auf Linux oft fehlen und +OnlyOffice sonst substituiert (was zu gebrochenen Sonderzeichen führt). + +--- + +## 2. Skript neu ausführen (`create_presentation.py`) + +Das Skript erzeugt die `.pptx` vollständig reproduzierbar. + +**Voraussetzungen:** +```bash +pip install python-pptx matplotlib Pillow +``` + +**Ausführen:** +```bash +python3 create_presentation.py +``` + +Das Skript: +- erzeugt das Architektur-Diagramm (`assets/architektur.png`) selbst per matplotlib, +- nutzt die Logo-PNGs aus `assets/` (Quelle: Wikimedia Commons), +- setzt die Folien aus Python-Code zusammen (jede Folie ist eine Funktion/Sektion). + +--- + +## 3. Das Handout (`handout.md` / `handout.docx`) + +Kompakte Referenz mit: + +1. YAML-Grundsyntax +2. Ad-hoc-Befehle +3. Jinja2 (Variablen auflösen, Filter, `.j2`) +4. Gather Facts +5. Wo Variablen definiert werden +6. Variablen-Präzedenz (Auflösungs-Reihenfolge) +7. Module & FQCN +8. Vollständiges Beispiel + +Das `.docx` wird aus dem `.md` per pandoc erzeugt: +```bash +pandoc handout.md -o handout.docx +``` + +--- + +## 4. Das Beispiel-Projekt (`Beispiel/`) + +Ein vollständiges, lauffähiges Ansible-Projekt, das Rollen-Struktur, +Variablen-Präzedenz und Templating für **localhost** demonstriert. + +Siehe `Beispiel/README.md` für Details. Kurz: + +```bash +cd Beispiel +ansible-playbook site.yml --check # Trockenlauf +ansible-playbook site.yml # echt ausführen +``` + +Die Struktur zeigt: +- `roles/webserver/` mit tasks, handlers, templates, defaults, vars, meta +- Variablen-Präzedenz: `defaults` (80) → `host_vars` (8080) → `-e` (gewinnt) +- Jinja2-Templates (`nginx.conf.j2`, `index.html.j2` mit Schleife + Filter) +- Facts (`ansible_distribution`, `ansible_hostname`, …) +- FQCN (`ansible.builtin.*`) + +**Hinweis:** Das Beispiel nutzt `apt` (Debian/Ubuntu). Auf Manjaro/Arch +verwendet man stattdessen `community.general.pacman` (Anpassung in +`Beispiel/README.md` beschrieben). + +--- + +## Quellen & Lizenz + +- Ansible-Dokumentation: https://docs.ansible.com +- Ansible Galaxy: https://galaxy.ansible.com +- Ansible-Repository: https://github.com/ansible/ansible +- Ansible-Logo: Wikimedia Commons (https://commons.wikimedia.org/wiki/File:Ansible_logo.svg) diff --git a/ansible_praesentation.pptx b/ansible_praesentation.pptx index c778fdb4497b6da40024a39a3dd330725f33722f..d237610807ce17aaf1fa14fb941dc6261a257a9a 100644 GIT binary patch delta 4015 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 H=9~IID0ET! diff --git a/create_presentation.py b/create_presentation.py index 954e81a..4b8f7bd 100644 --- a/create_presentation.py +++ b/create_presentation.py @@ -614,27 +614,19 @@ text(s, 0.55, 1.5, 12.2, 0.7, (".", {})], size=13, color=BLACK, leading=1.15) -# Links: Facts als 2-Spalten-Raster (Name oben, Beschreibung darunter) -text(s, 0.55, 2.4, 6.6, 0.3, "WAS MAN AUSLESEN KANN", size=11, bold=True, color=RED) -facts = [ +# Links: Facts als einzelne Spalte (breite Schlüssel-Spalte -> kein Umbruch) +text(s, 0.55, 2.4, 6.8, 0.3, "WAS MAN AUSLESEN KANN", size=11, bold=True, color=RED) +kv_rows(s, 0.55, 2.9, 6.8, [ ("ansible_os_family", "Betriebssystem-Familie"), ("ansible_distribution", "z.B. Ubuntu, Debian"), ("ansible_hostname", "Hostname des Systems"), ("ansible_default_ipv4.address", "IP-Adresse"), ("ansible_memtotal_mb", "Arbeitsspeicher (MB)"), ("ansible_processor_vcpus", "CPU-Kerne"), -] -for i, (name, desc) in enumerate(facts): - col = i % 2 - row = i // 2 - cx = 0.55 + col * 3.3 - cy = 2.9 + row * 1.3 - text(s, cx, cy, 3.2, 0.35, name, size=11.5, bold=True, - color=DARKRED, font=FONT_MONO) - text(s, cx, cy + 0.38, 3.2, 0.5, desc, size=11, color=GRAY, leading=1.0) +], key_w=3.5, name_size=12, desc_size=11, gap=0.6) # Rechts: ein einzelner, klarer Code-Block (Zugriff + Custom Facts) -code_block(s, 7.25, 2.4, 5.55, [ +code_block(s, 7.55, 2.4, 5.2, [ "# Zugriff im Playbook", "- name: OS anzeigen", " ansible.builtin.debug:",