From f296ef68b7547c9cc8b5c9bcb289f5aca397aded Mon Sep 17 00:00:00 2001 From: Florian Hensel Date: Thu, 11 Dec 2025 16:29:58 +0100 Subject: [PATCH] =?UTF-8?q?Ansible=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- ...Windows_Freigaben_fuer_Linux-Einsteiger.md | 1 - mkdocs/docs/basics/image.png | Bin 9576 -> 0 bytes .../docs/bonus/automatisierung-mit-ansible.md | 346 ++++++++++++++++++ mkdocs/mkdocs.yml | 2 +- 5 files changed, 350 insertions(+), 3 deletions(-) delete mode 100644 mkdocs/docs/basics/image.png create mode 100644 mkdocs/docs/bonus/automatisierung-mit-ansible.md diff --git a/.gitignore b/.gitignore index 799a9f3..4af7a39 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -mkdocs/site/ \ No newline at end of file +mkdocs/site/ +*.pdf +*.PDF \ No newline at end of file diff --git a/mkdocs/docs/basics/Windows_Freigaben_fuer_Linux-Einsteiger.md b/mkdocs/docs/basics/Windows_Freigaben_fuer_Linux-Einsteiger.md index 8033d1f..b9da8bd 100644 --- a/mkdocs/docs/basics/Windows_Freigaben_fuer_Linux-Einsteiger.md +++ b/mkdocs/docs/basics/Windows_Freigaben_fuer_Linux-Einsteiger.md @@ -454,7 +454,6 @@ Für fortgeschrittene Anwendungsfälle können Spezialrechte gesetzt werden: **Samba-spezifische Nutzung:** * **SGID** ist nützlich, um sicherzustellen, dass neue Dateien/Ordner in einer Freigabe automatisch der richtigen Gruppe gehören: ````bash - sudo chmod 2770 /srv/samba/dokumente # SGID + Besitzer/Gruppe: rwx ```` diff --git a/mkdocs/docs/basics/image.png b/mkdocs/docs/basics/image.png deleted file mode 100644 index 9c4c79799c9833f4419eb709f42590aa90c6f17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9576 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 Erwartete Ausgabe: +````json +"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: +````yaml +--- +- name + 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: +````bash +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 + +````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: | + + + + Nginx auf Port 5000 + + + +

Willkommen auf der Nginx-Beispielseite!

+

Diese Seite wird auf Port {{ nginx_port }} bereitgestellt.

+

Ansible-Playbook erfolgreich ausgeführt!

+ + + + 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```` + +````nginx +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: +````bash +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```` +````yaml +--- +- 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```` + +````yaml +--- +- 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. + +--- + +## Inhaltsverzeichnis + +[TOC] + + + + + + + + diff --git a/mkdocs/mkdocs.yml b/mkdocs/mkdocs.yml index 7b26650..27a8ad9 100644 --- a/mkdocs/mkdocs.yml +++ b/mkdocs/mkdocs.yml @@ -17,7 +17,7 @@ nav: - Bonuskapitel: - Linux als Active Directory Server: bonus/linux-als-ad-server.md - Linux als Client in Active Directory: bonus/linux-als-ad-client.md - + - Automatisierung mit Ansible: bonus/automatisierung-mit-ansible.md # Theme theme: logo: assets/Logo.png