7.9 KiB
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!):
user:
name: admin
shell: /bin/bash
groups:
- sudo
- docker
2. Ad-hoc-Befehle (ohne Playbook)
ansible <hosts> -m <modul> -a "<argumente>"
Beispiele:
# 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:
# Wert einsetzen
message: "Hallo {{ benutzer }}"
path: "/home/{{ benutzer }}/.config"
# Verschachtelte Variablen
db_host: "{{ hostvars['db'].ansible_host }}"
Filter
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:
# 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:
- name: OS anzeigen
ansible.builtin.debug:
msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"
Eigene Facts (Custom Facts) setzen:
# Datei anlegen (INI-Format):
# /etc/ansible/facts.d/app.fact
# Inhalt:
# [app]
# version=1.2.3
# Abruf: {{ ansible_local.app.version }}
Facts deaktivieren (Performance):
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):
- Extra-Variablen (CLI
-e) — gewinnen immer - Task-/Block-Variablen (
vars:direkt an der Aufgabe) - set_fact / register (Werte aus der Laufzeit)
- Rollen-Variablen (
roles/.../vars/main.yml) - Playbook-Variablen (
vars:im Play) - host_vars / group_vars (aus dem Inventory)
- 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.
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):
ANSIBLE_CONFIG— Umgebungsvariable (expliziter Pfad)./ansible.cfg— aktuelles Verzeichnis (Projekt)~/.ansible.cfg— Home-Verzeichnis (Benutzer)/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:
[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):
- 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:
nginx_port: 80
domain: example.com
Rollen-Tasks (roles/webserver/tasks/main.yml):
- 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