Files
ansible_pr-sentation/handout.md
T
2026-09-14 12:43:09 +02:00

279 lines
7.9 KiB
Markdown

# Ansible — Syntax & Variablen-Handout
Kompakte Referenz zu YAML-Syntax, Ad-hoc-Befehlen, Jinja2, Facts, Variablen-Auflösung, FQCN und ansible.cfg.
---
## 1. YAML-Grundsyntax
| Element | Syntax | Beispiel |
|--------------------|-----------------|--------------------------|
| Schlüssel-Wert | `key: wert` | `name: webserver` |
| Liste | `- eintrag` | `- nginx` |
| Verschachtelung | Einrückung | 2 Leerzeichen (KEINE Tabs) |
| Kommentar | `# text` | `# Dies ist ein Kommentar` |
| Zeichenkette | mit/ohne Quotes | `name: "Mein Server"` |
Einrückung mit 2 Leerzeichen (niemals Tabs!):
```yaml
user:
name: admin
shell: /bin/bash
groups:
- sudo
- docker
```
---
## 2. Ad-hoc-Befehle (ohne Playbook)
```bash
ansible <hosts> -m <modul> -a "<argumente>"
```
Beispiele:
```bash
# Erreichbarkeit testen
ansible all -m ping
# Facts anzeigen
ansible webserver -m setup
# Paket installieren
ansible webserver -m apt -a "name=nginx state=present"
# Dienst neu starten
ansible webserver -m service -a "name=nginx state=restarted"
```
Wichtige Optionen:
| Option | Bedeutung |
|--------|----------------------|
| `-m` | Modul wählen |
| `-a` | Argumente übergeben |
| `-i` | Inventory angeben |
| `-b` | become (sudo) |
| `-u` | Benutzer |
---
## 3. Jinja2 — Variablen auflösen
Ansible nutzt die Template-Engine **Jinja2**. Variablen werden in doppelte
geschweifte Klammern gesetzt:
```yaml
# Wert einsetzen
message: "Hallo {{ benutzer }}"
path: "/home/{{ benutzer }}/.config"
# Verschachtelte Variablen
db_host: "{{ hostvars['db'].ansible_host }}"
```
### Filter
```yaml
name: "{{ name | upper }}" # -> GROSSSCHREIBUNG
port: "{{ port | default(80) }}" # Fallback, wenn Variable leer
anzahl: "{{ liste | length }}" # Anzahl der Elemente
ip: "{{ ansible_host | ipaddr }}" # IP-Adresse validieren
```
### Template-Dateien (.j2)
Dateien mit Endung `.j2` werden vom Modul `template` gerendert:
```jinja
# nginx.conf.j2
server {
listen {{ nginx_port }};
server_name {{ domain }};
root {{ web_root }};
}
```
---
## 4. Gather Facts (Systeminformationen)
Ansible sammelt automatisch **Facts** (Systeminformationen) über jeden Host —
über das Modul `setup`, standardmäßig `gather_facts: true`.
Häufige Facts:
| Fact | Bedeutung |
|---------------------------------|-------------------------------|
| `ansible_os_family` | OS-Familie (Debian, RedHat) |
| `ansible_distribution` | z.B. Ubuntu, CentOS, Debian |
| `ansible_distribution_version` | Version (z.B. 22.04) |
| `ansible_hostname` | Hostname des Systems |
| `ansible_default_ipv4.address` | IP-Adresse |
| `ansible_architecture` | CPU-Architektur (x86_64) |
| `ansible_memtotal_mb` | RAM in MB |
| `ansible_processor_vcpus` | Anzahl CPU-Kerne |
Zugriff im Playbook:
```yaml
- name: OS anzeigen
ansible.builtin.debug:
msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"
```
Eigene Facts (Custom Facts) setzen:
```bash
# Datei anlegen (INI-Format):
# /etc/ansible/facts.d/app.fact
# Inhalt:
# [app]
# version=1.2.3
# Abruf: {{ ansible_local.app.version }}
```
Facts deaktivieren (Performance):
```yaml
gather_facts: false
```
---
## 5. Wo Variablen definiert werden
| Quelle | Datei / Ort | Beispiel |
|------------|------------------------------------|---------------------------------|
| Inventory | `host_vars/`, `group_vars/` | `group_vars/webserver.yml` |
| Playbook | `vars:` / `vars_files:` | `vars: { port: 8080 }` |
| Rolle | `roles/<rolle>/vars/` + `defaults/`| `vars/main.yml` |
| Facts | automatisch gesammelt | `ansible_os_family` |
| Laufzeit | `register` / `set_fact` | `register: result` |
| CLI | Extra-Variablen | `-e "port=8080"` |
---
## 6. Variablen-Präzedenz (Auflösungs-Reihenfolge)
Ist dieselbe Variable an mehreren Stellen definiert, gewinnt die mit der
**höchsten** Priorität (oben = gewinnt):
1. **Extra-Variablen** (CLI `-e`) — gewinnen immer
2. **Task-/Block-Variablen** (`vars:` direkt an der Aufgabe)
3. **set_fact / register** (Werte aus der Laufzeit)
4. **Rollen-Variablen** (`roles/.../vars/main.yml`)
5. **Playbook-Variablen** (`vars:` im Play)
6. **host_vars / group_vars** (aus dem Inventory)
7. **Rollen-Defaults** (`roles/.../defaults/main.yml`) — verlieren
> **Faustregel:** Je spezifischer die Quelle, desto höher die Priorität.
---
## 7. Module & FQCN
FQCN = **Fully Qualified Collection Name** — `namespace.collection.modul`.
```yaml
ansible.builtin.apt:
name: nginx
state: present
```
| FQCN | Zweck |
|-----------------------------------|---------------------------|
| `ansible.builtin.copy` | Datei kopieren |
| `ansible.builtin.apt` | Paket installieren (Debian) |
| `ansible.builtin.service` | Dienst verwalten |
| `ansible.builtin.template` | `.j2`-Template rendern |
| `ansible.posix.firewalld` | Firewall konfigurieren |
| `community.general.git_config` | Git-Einstellungen |
---
## 8. ansible.cfg — Konfiguration
INI-Datei, die Ansible global steuert. Ansible nutzt die **erste** gefundene
Datei (kein Zusammenführen):
1. `ANSIBLE_CONFIG` — Umgebungsvariable (expliziter Pfad)
2. `./ansible.cfg` — aktuelles Verzeichnis (Projekt)
3. `~/.ansible.cfg` — Home-Verzeichnis (Benutzer)
4. `/etc/ansible/ansible.cfg` — systemweit (Fallback)
Wichtige Werte:
| Sektion | Schlüssel | Bedeutung |
|---------------------------|--------------------|------------------------------------|
| `[defaults]` | `inventory` | Pfad zur Inventory-Datei |
| | `remote_user` | Standard-SSH-Benutzer |
| | `forks` | parallele Prozesse (Default 5) |
| | `host_key_checking`| SSH-Key-Prüfung (True/False) |
| | `gather_facts` | Facts automatisch sammeln |
| | `roles_path` | Suchpfad für Rollen |
| `[privilege_escalation]` | `become` | sudo aktivieren |
| | `become_method` | sudo / su |
| | `become_user` | Ziel-Benutzer (Default root) |
| `[ssh_connection]` | `pipelining` | Performance-Optimierung |
| | `ssh_args` | zusätzliche SSH-Argumente |
Beispiel:
```ini
[defaults]
inventory = ./inventory.yml
remote_user = admin
forks = 20
host_key_checking = False
gather_facts = True
roles_path = ./roles
[privilege_escalation]
become = True
become_method = sudo
[ssh_connection]
pipelining = True
```
---
## 9. Vollständiges Beispiel
**Playbook** (`deploy.yml`):
```yaml
- name: Webserver ausrollen
hosts: webserver
become: true
vars:
nginx_port: 8080 # überschreibt den Rollen-Default
roles:
- webserver
```
**Rollen-Defaults** (`roles/webserver/defaults/main.yml`) — niedrigste Priorität:
```yaml
nginx_port: 80
domain: example.com
```
**Rollen-Tasks** (`roles/webserver/tasks/main.yml`):
```yaml
- name: nginx installieren
ansible.builtin.apt:
name: nginx
state: present
- name: Konfiguration rendern
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
```