Ansible KIT Grundlagen
Ansible Grundlagen
Ansible ist ein agentenloses Automatisierungswerkzeug. Es verbindet sich per SSH auf die Zielsysteme und führt dort Aufgaben aus – ohne dass auf den Zielsystemen Software installiert werden muss.
Begriffe
| Begriff | Bedeutung |
|---|---|
| Control-Node | Der Rechner von dem Ansible ausgeführt wird |
| Managed Node | Die Zielsysteme die Ansible konfiguriert |
| Inventory | Liste der Managed Nodes |
| Playbook | YAML-Datei mit den auszuführenden Aufgaben |
| Task | Eine einzelne Aufgabe in einem Playbook |
| Modul | Ansible-Baustein der eine Aufgabe erledigt (z.B. template, systemd)
|
| Rolle (Role) | Wiederverwendbare Sammlung von Tasks, Templates und Handlers |
| Handler | Task der nur ausgeführt wird wenn er durch notify ausgelöst wurde
|
| Template | Konfigurationsdatei mit Jinja2-Variablen |
| Vault | Verschlüsselter Speicher für Passwörter und Secrets |
Installation
Ansible wird nur auf dem Control-Node installiert.
apt update apt install ansible -y
Version prüfen:
ansible --version
Inventory
Das Inventory definiert welche Hosts Ansible verwalten soll.
Einfaches Inventory
[webserver] web01 ansible_host=192.168.1.10 web02 ansible_host=192.168.1.11 [webserver:vars] ansible_user=admin
Variablen pro Host
Jeder Host kann eigene Variablen bekommen:
[firewalls] fw01 ansible_host=192.168.1.20 fw_xx=201 fw02 ansible_host=192.168.1.21 fw_xx=202
Inventory testen
ansible all --list-hosts ansible webserver --list-hosts
ansible.cfg
Die Datei ansible.cfg im Projektverzeichnis setzt Standardwerte:
[defaults] inventory = inventory/hosts.ini remote_user = admin host_key_checking = False [privilege_escalation] become = True become_method = sudo
host_key_checking = False- Deaktiviert die SSH-Fingerprint-Prüfung – sinnvoll im Lab, nicht für Produktion
become = True- Führt Befehle mit
sudoaus
Ad-hoc-Befehle
Ad-hoc-Befehle sind Einzeiler für schnelle Aufgaben ohne Playbook.
- Erreichbarkeit prüfen
ansible all -m ping
- Befehl ausführen
ansible all -m command -a "uptime"
- Paket installieren
ansible webserver -m apt -a "name=vim state=present" -b
- Datei kopieren
ansible all -m copy -a "src=foo.txt dest=/tmp/foo.txt"
Playbook
Ein Playbook ist eine YAML-Datei die beschreibt was auf welchen Hosts ausgeführt werden soll.
Aufbau
---
- name: Webserver einrichten
hosts: webserver
gather_facts: false
tasks:
- name: nginx installieren
apt:
name: nginx
state: present
- name: nginx starten
systemd:
name: nginx
state: started
enabled: true
Playbook ausführen
ansible-playbook site.yml
- Nur bestimmte Hosts
ansible-playbook site.yml --limit fw212,fw213
- Nur bestimmte Tags
ansible-playbook site.yml --tags nftables
- Trockenlauf (nichts wird verändert)
ansible-playbook site.yml --check
- Verbose-Ausgabe
ansible-playbook site.yml -v(mehr v = mehr Details, bis-vvvv)
Tags
Mit Tags kann man gezielt einzelne Tasks ausführen.
tasks:
- name: nftables konfigurieren
template:
src: nftables.conf.j2
dest: /etc/nftables.conf
tags: nftables
- name: Hostname setzen
hostname:
name: "fw.example.int"
tags: hostname
Ausführen:
ansible-playbook site.yml --tags nftables ansible-playbook site.yml --skip-tags reboot
Templates
Templates sind Konfigurationsdateien mit Jinja2-Variablen. Ansible befüllt die Variablen beim Ausführen pro Host.
Templates liegen in roles/<rolle>/templates/ und haben die Endung .j2.
Beispiel
Template resolv.conf.j2:
search it2{{ fw_xx }}.int
nameserver 192.168.{{ fw_y }}.88
Task der das Template einsetzt:
- name: resolv.conf konfigurieren
template:
src: resolv.conf.j2
dest: /etc/resolv.conf
owner: root
group: root
mode: '0644'
Jinja2-Grundlagen
| Syntax | Bedeutung |
|---|---|
Vorlage:Variable |
Variablenwert einsetzen |
{% if bedingung %} ... {% endif %} |
Bedingung |
{% for item in liste %} ... {% endfor %} |
Schleife |
Rollen (Roles)
Rollen sind wiederverwendbare Einheiten die Tasks, Templates und Handler bündeln.
Struktur
roles/
└── meine-rolle/
├── tasks/
│ └── main.yml ← Tasks
├── handlers/
│ └── main.yml ← Handler
├── templates/
│ └── config.j2 ← Templates
├── files/
│ └── script.sh ← Statische Dateien
└── defaults/
└── main.yml ← Standardwerte für Variablen
Rolle im Playbook verwenden
---
- name: Firewall konfigurieren
hosts: firewalls
roles:
- fw
Handler
Handler werden nur ausgeführt wenn ein Task sie mit notify ausgelöst hat – und das nur einmal am Ende des Plays, egal wie oft sie ausgelöst wurden.
tasks:
- name: nftables.conf konfigurieren
template:
src: nftables.conf.j2
dest: /etc/nftables.conf
notify: nftables reload
handlers:
- name: nftables reload
systemd:
name: nftables
state: reloaded
Typische Anwendung: Konfigurationsdatei ändern → Dienst neu starten.
Vault
Mit Ansible Vault können Passwörter und Secrets verschlüsselt gespeichert werden.
- Datei verschlüsseln
ansible-vault encrypt secrets.yml
- Datei entschlüsseln
ansible-vault decrypt secrets.yml
- Datei ansehen ohne entschlüsseln
ansible-vault view secrets.yml
- Playbook mit Vault-Datei ausführen
ansible-playbook site.yml --ask-vault-pass
- Passwort aus Datei lesen
ansible-playbook site.yml --vault-password-file .vault_pass
Verschlüsselte Variable in einer normalen YAML-Datei:
db_password: !vault | $ANSIBLE_VAULT;1.1;AES256 61383034346134653831...