Ansible verwendet einen hybrid deklarativ-imperativen Ansatz für das Konfigurationsmanagement. Während der gewünschte Zustand einzelner Ressourcen deklarativ definiert wird, erfolgt die Ausführung der Tasks in der festgelegten Reihenfolge (imperativ).
- name: Installiere Apache
apt:
name: apache2
state: presentDas Modul definiert den Zielzustand (state: present),
ohne die Implementierungsdetails zu spezifizieren.
- hosts: webservers
tasks:
- name: Installiere Apache
apt:
name: apache2
state: present
- name: Starte Apache Service
systemd:
name: apache2
state: started
enabled: yes
- name: Kopiere Konfigurationsdatei
copy:
src: ./templates/apache.conf
dest: /etc/apache2/sites-available/000-default.conf
owner: root
mode: '0644'
notify: restart apacheDie Tasks werden sequenziell in der definierten Reihenfolge ausgeführt, obwohl jeder Task deklarativ formuliert ist.
Ansible überprüft vor jeder Änderung den aktuellen Systemzustand und führt nur notwendige Modifikationen durch. Dies wird durch Checksum-Vergleiche, Systemabfragen und Zustandsprüfungen realisiert.
- name: Konfigurationsdatei bereitstellen
copy:
src: ./templates/app.conf
dest: /etc/myapp/app.conf
owner: appuser
group: appgroup
mode: '0644'
backup: yesVerhalten bei wiederholter Ausführung:
changedok (keine Aktion)changedInventory-Parsing
inventory/hosts)Variablen-Resolution
group_vars/ und host_vars/ ladenConnection Setup
Facts Gathering (falls aktiviert)
gather_facts: yes # Standardansible_os_family,
ansible_hostname)Task-Ausführung (sequenziell)
ok, changed,
failed, skippedHandler-Ausführung
changed-Status von notifying Tasksmeta: flush_handlersCleanup & Reporting
ansible-playbook -i inventory/hosts playbooks/site.yml -vHandler werden nur ausgeführt, wenn sie durch einen
changed-Status ausgelöst werden:
tasks:
- name: Aktualisiere Apache-Konfiguration
copy:
src: apache.conf
dest: /etc/apache2/apache2.conf
notify: restart apache
handlers:
- name: restart apache
systemd:
name: apache2
state: restartedWichtig: Handler laufen erst am Ende des Plays (oder
bei flush_handlers).
Tasks können bedingt ausgeführt werden:
- name: Installiere Apache auf Debian-Systemen
apt:
name: apache2
state: present
when: ansible_os_family == "Debian"
- name: Installiere httpd auf RedHat-Systemen
yum:
name: httpd
state: present
when: ansible_os_family == "RedHat"Wiederholung von Tasks mit verschiedenen Parametern:
- name: Erstelle mehrere Benutzer
user:
name: "{{ item.name }}"
shell: "{{ item.shell }}"
groups: "{{ item.groups }}"
loop:
- { name: 'alice', shell: '/bin/bash', groups: 'wheel' }
- { name: 'bob', shell: '/bin/zsh', groups: 'users' }
- { name: 'charlie', shell: '/bin/bash', groups: 'wheel,docker' }Strukturierte Behandlung von Fehlern und Cleanup:
- block:
- name: Kritische Konfiguration anwenden
template:
src: critical.conf.j2
dest: /etc/critical.conf
- name: Service neustarten
systemd:
name: myservice
state: restarted
rescue:
- name: Fallback-Konfiguration aktivieren
copy:
src: fallback.conf
dest: /etc/critical.conf
- name: Administrator benachrichtigen
mail:
to: admin@company.com
subject: "Konfigurationsfehler auf {{ inventory_hostname }}"
always:
- name: Logs rotieren
command: logrotate -f /etc/logrotate.confignore_errors: yes - Task-Fehler
ignorierenfailed_when: - Benutzerdefinierte
Fehlerbedingungenchanged_when: - Explizite
Changed-Bedingung setzen┌─────────────────┐
│ Playbook │
│ Start │
└─────────┬───────┘
│
┌─────────▼───────┐
│ Inventory │ ← hosts, groups, variables
│ Loading │
└─────────┬───────┘
│
┌─────────▼───────┐
│ Variable │ ← group_vars, host_vars,
│ Resolution │ extra_vars, defaults
└─────────┬───────┘
│
┌─────────▼───────┐
│ Connection │ ← SSH setup, become
│ Setup │ privilege escalation
└─────────┬───────┘
│
┌─────────▼───────┐
│ Facts │ ← ansible_* variables
│ Gathering │ (if gather_facts: yes)
└─────────┬───────┘
│
┌─────────▼───────┐
│ Task Loop │
│ ┌─────────────┐ │
│ │Task 1 │ │ ← check state → execute if needed
│ │ status: ok │ │ ← ok/changed/failed/skipped
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │Task 2 │ │ ← notify handlers if changed
│ │status:change│ │
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │Task N │ │
│ │status:failed│ │ ← abort play if fatal
│ └─────────────┘ │
└─────────┬───────┘
│
┌─────────▼───────┐
│ Handler │ ← execute only if notified
│ Execution │ and tasks changed
└─────────┬───────┘
│
┌─────────▼───────┐
│ Summary │ ← ok=X changed=X
│ Report │ unreachable=X failed=X
└─────────────────┘
ok: Task erfolgreich, aber keine
Änderung nötigchanged: Task erfolgreich mit
Systemänderungfailed: Task fehlgeschlagenskipped: Task durch Bedingung
übersprungenunreachable: Host nicht
erreichbar