11 KiB
Ansible-Basics-Handbuch
1. Einführung in Ansible
Was ist Ansible?
Ansible ist ein Open-Source-Tool zur Automatisierung von IT-Infrastrukturen. Es ermöglicht die zentrale Verwaltung, Konfiguration und Bereitstellung von Servern, Netzwerkgeräten und Anwendungen. Ansible ist besonders nützlich, weil es:
- Zeit spart: Automatisiert Routineaufgaben wie Software-Installationen, Updates oder Benutzerverwaltung.
- Fehler reduziert: Durch die Verwendung von Playbooks (Skripte in YAML) werden Konfigurationen wiederholbar und konsistent umgesetzt.
- Einfach zu erlernen: Nutzt YAML, eine leicht lesbare Sprache, und erfordert keine Programmierkenntnisse.
- Agentenlos arbeitet: Benötigt auf den verwalteten Systemen keine zusätzliche Software – nur SSH ist erforderlich.
- Flexibel einsetzbar: Unterstützt eine Vielzahl von Systemen, darunter Ubuntu-Server, Docker-Container und Netzwerkgeräte.
Typische Anwendungsfälle
- Server-Setup: Automatisierte Installation und Konfiguration von Servern (z. B. für Webserver oder Datenbanken).
- Benutzerverwaltung: Erstellen und Verwalten von Benutzern und Gruppen.
- Sicherheitsupdates: Regelmäßige, automatische Updates für alle Systeme.
- Software-Bereitstellung: Installation und Konfiguration von Programmen wie Nginx, Samba oder Docker.
- Backup-Strategien: Automatisierte Sicherung von Daten.
Wie funktioniert Ansible?
Ansible arbeitet nach dem Push-Prinzip:
- Control Node: Der Rechner, von dem aus Ansible gesteuert wird. (Im Kurs das Linux Mint)
- Managed Nodes: Die Systeme, die von Ansible verwaltet werden. (Im Kurs der Ubuntu-Server)
- Inventar: Eine Liste der verwalteten Systeme (IP-Adressen oder Hostnamen).
- Playbooks: Skripte, die definieren, welche Aufgaben auf den verwalteten Systemen ausgeführt werden sollen.
Beispiel: Sie möchten auf mehreren Servern Nginx installieren und eine Standard-Webseite bereitstellen. Statt auf jedem Server manuell Befehle auszuführen, schreiben Sie ein Ansible-Playbook, das diese Aufgabe automatisiert und zentral erledigt.
Voraussetzungen
- Ubuntu Server (als Managed Node).
- SSH-Zugriff auf die Server (mit Schlüsselpaar).
- Ansible auf dem Control Node (Linux Mint) installiert.
2. Vorbereitung: SSH-Key-Paar für Ansible erstellen
Schritt 1: Schlüsselpaar auf dem Ansible-Control-Node erstellen
ssh-keygen -t ed25519 -C "ansible@control-node"
- Speicherort: /home/benutzer/.ssh/id_ed25519 (Standard)
- Passphrase: Optional, aber für zusätzliche Sicherheit empfohlen.
Schritt 2: Öffentlichen Schlüssel auf die Managed Nodes übertragen
Kopieren Sie den öffentlichen Schlüssel mit folgendem Befehl auf Ihre Server:
ssh-copy-id -i ~/.ssh/id_ed25519.pub benutzer@server-ip
Beispiel:
ssh-copy-id -i ~/.ssh/id_ed25519.pub meisterkurs@192.168.100.250
Test der Verbindung:
ssh Meisterkurs@192.168.100.250
Die Anmeldung sollte jetzt ohne Passwortabfrage möglich sein.
3. Ansible installieren und konfigurieren
Ansible auf dem Control Node installieren
Installieren Sie Ansible mit den folgenden Befehlen:
sudo apt update
sudo apt install ansible -y
Inventar-Datei erstellen
Legen Sie eine Inventar-Datei an, z. B. /etc/ansible/hosts, und tragen Sie Ihre Server ein:
ubuntu_servers:
hosts:
sv1:
ansible_host: 192.168.100.250
ansible_user: meisterkurs
ansible_become: true
ansible_become_method: sudo
ansible_become_password: passw0rd#
Verbindung testen
ansible -m ping all
Erwartete Ausgabe:
"sv1": {
"ping": "pong"
}
4. System-Updates mit Ansible durchführen
Playbook: 01-playbook-update_system.yml
Erstellen Sie eine Datei namens 01-playbook-update_system.yml mit folgendem Inhalt:
---
- name: Ubuntu Updates
hosts: ubuntu_servers # Zielgruppe: Alle Ubuntu-Server im Inventar
become: yes # Root-Rechte für Paketverwaltung
tasks:
- name: System-Paketlisten aktualisieren
apt:
update_cache: yes
# Aktualisiert die Paketlisten, um die neuesten Versionen zu erhalten
- name: Alle Pakete auf den neuesten Stand bringen
apt:
upgrade: dist # Führt ein Distribution-Upgrade durch
autoremove: yes # Entfernt nicht mehr benötigte Pakete
# Installiert alle verfügbaren Updates und bereinigt das System
- name: Überprüfen, ob ein Neustart erforderlich ist
stat:
path: /var/run/reboot-required
register: reboot_required
# Prüft, ob ein Neustart nach den Updates erforderlich ist
- name: Hinweis auf Neustart ausgeben (falls erforderlich)
debug:
msg: "Ein Neustart des Servers {{ inventory_hostname }} ist erforderlich!"
when: reboot_required.stat.exists
# Zeigt eine Warnung an, wenn ein Neustart erforderlich ist
Führen Sie das Playbook aus:
ansible-playbook 01-playbook-update_system.yml
5. Programm installieren und konfigurieren (Beispiel: Nginx)
Playbook: 02-playbook-install-nginx.yaml
Erstellen Sie Datei 01-playbook-install.nginx.yaml
---
- name: Installiere nginx auf einstellbarem Port
hosts: ubuntu_servers
become: yes
vars:
nginx_port: 5000 # Port, auf dem Nginx laufen soll
example_page_content: |
<!DOCTYPE html>
<html>
<head>
<title>Nginx auf Port 5000</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; }
h1 { color: #0078d7; }
</style>
</head>
<body>
<h1>Willkommen auf der Nginx-Beispielseite!</h1>
<p>Diese Seite wird auf <strong>Port {{ nginx_port }}</strong> bereitgestellt.</p>
<p>Ansible-Playbook erfolgreich ausgeführt!</p>
</body>
</html>
tasks:
- name: Nginx installieren
apt:
name: nginx
state: present
# Installiert Nginx, falls nicht bereits vorhanden
- name: Nginx-Konfiguration für Port 5000 anpassen
template:
src: nginx.conf.j2 # Template-Datei für die Nginx-Konfiguration
dest: /etc/nginx/sites-available/default
notify: Nginx neu starten
# Ersetzt die Standardkonfiguration von Nginx durch unsere angepasste Version
- name: Beispiel-HTML-Seite bereitstellen
copy:
dest: /var/www/nginx/index.html
content: "{{ example_page_content }}"
notify: Nginx neu starten
# Kopiert die Beispiel-HTML-Seite in das Webverzeichnis von Nginx
- name: Nginx-Dienst starten und aktivieren
service:
name: nginx
state: started
enabled: yes
# Startet Nginx und aktiviert den Autostart beim Systemstart
- name: Firewall für Port 5000 öffnen (falls UFW aktiv)
ufw:
rule: allow
port: "{{ nginx_port }}"
proto: tcp
when: "'ufw' in ansible_facts.packages"
# Öffnet den Port 5000 in der Firewall, falls UFW installiert ist
- name: Überprüfen, ob Nginx auf Port 5000 erreichbar ist
uri:
url: "http://localhost:{{ nginx_port }}"
return_content: yes
register: nginx_status
until: nginx_status.status == 200
retries: 5
delay: 10
# Prüft, ob Nginx auf dem konfigurierten Port erreichbar ist
# - retries: 5: Wiederholt die Prüfung 5 Mal, falls der Port noch nicht erreichbar ist
# - delay: 10: Wartezeit von 10 Sekunden zwischen den Versuchen
- name: Statusmeldung ausgeben
debug:
msg: "Nginx ist erfolgreich auf Port {{ nginx_port }} gestartet und erreichbar unter http://{{ ansible_host }}:{{ nginx_port }}"
# Zeigt eine Erfolgsmeldung mit der URL zur Beispielseite an
handlers:
- name: Nginx neu starten
service:
name: nginx
state: restarted
# Startet Nginx neu, um Änderungen an der Konfiguration zu übernehmen
Was sind Handler?
Handler in Ansible sind spezielle Aufgaben, die nur dann ausgeführt werden, wenn sie von einer anderen Aufgabe explizit benachrichtigt (notify) werden. Sie werden typischerweise für Dienst-Neustarts oder Konfigurationsänderungen verwendet, die nur dann notwendig sind, wenn sich etwas geändert hat.
Nginx-Konfigurationsdatei (nginx.conf.j2)
Im Script wird eine Kopierquelle für die konfiguration des Servers angegeben. Diese darf direkt daneben angelegt werden: nginx.conf.j2
server {
listen {{ nginx_port }} default_server;
listen [::]:{{ nginx_port }} default_server;
root /var/www/nginx;
index index.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
Ausführung des Playbooks:
ansible-playbook 01-playbook-install.nginx.yaml
Nach der Installation:
Öffnen Sie einen Browser und verbinden Sie sich mit port 5000
Sie sollten die Beispielseite sehen. Port-Überprüfung: Das Playbook prüft automatisch, ob Nginx auf Port 5000 erreichbar ist, und gibt eine Erfolgsmeldung aus.
6. Playbook: Benutzer und Gruppen verwalten
03-playbook-manage-users.yml
---
- name: Benutzer und Gruppen auf den Managed Nodes verwalten
hosts: sv1
become: yes
vars:
users:
- name: dbecker
groups: ["Geschäftsleitung"]
- name: spoller
groups: ["Projektleitung"]
groups:
- Geschäftsleitung
- Projektleitung
tasks:
- name: Gruppen erstellen
group:
name: "{{ item }}"
state: present
loop: "{{ groups }}"
# Erstellt die in der Variable "groups" definierten Gruppen
- name: Benutzer erstellen
user:
name: "{{ item.name }}"
groups: "{{ item.groups | join(',') }}"
shell: /bin/bash
loop: "{{ users }}"
# Erstellt die in der Variable "users" definierten Benutzer
# - groups: Fügt die Benutzer den angegebenen Gruppen hinzu
# - shell: Setzt die Standard-Shell auf Bash
7. Playbook: Automatische Updates einrichten
04-playbook-auto-update.yml
---
- name: Automatische Updates auf den Managed Nodes einrichten
hosts: ubuntu_servers
become: yes
tasks:
- name: unattended-upgrades installieren
apt:
name: unattended-upgrades
state: present
# Installiert das Paket für automatische Updates
- name: Automatische Updates aktivieren
copy:
dest: /etc/apt/apt.conf.d/20auto-upgrades
content: |
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
# Konfiguriert die automatische Aktualisierung der Paketlisten und Installation von Updates
8. Zusammenfassung
Was wurde erreicht?
- SSH-Key-Authentifizierung für sichere Ansible-Kommunikation.
- Automatisierte System-Updates und Programm-Installation.
- Benutzer- und Gruppenverwaltung.
- Automatische Sicherheitsupdates.