first
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# Ansible-Beispiel: Rolle, Variablen & Templating (localhost)
|
||||
|
||||
Ein vollständiges Beispiel-Projekt, das alle Konzepte aus der Präsentation
|
||||
demonstriert:
|
||||
|
||||
- **Rollen-Struktur** (`roles/webserver/`)
|
||||
- **Variablen-Vergabe** mit Präzedenz (defaults → vars → group_vars → host_vars)
|
||||
- **Templating** mit Jinja2 (`.j2`-Dateien, Schleifen, Filter)
|
||||
- **FQCN** (`ansible.builtin.*`)
|
||||
- **Facts** (`ansible_distribution`, `ansible_hostname`, …)
|
||||
- **Handler** (`notify` → Dienst neu starten)
|
||||
|
||||
---
|
||||
|
||||
## Verzeichnisstruktur
|
||||
|
||||
```
|
||||
Beispiel/
|
||||
├── ansible.cfg # Ansible-Konfiguration
|
||||
├── inventory.yml # Ziel-Hosts (localhost)
|
||||
├── site.yml # Haupt-Playbook
|
||||
├── group_vars/
|
||||
│ └── all.yml # Variablen für ALLE Hosts
|
||||
├── host_vars/
|
||||
│ └── localhost.yml # Host-spezifische Variablen
|
||||
└── roles/
|
||||
└── webserver/
|
||||
├── tasks/main.yml # Aufgaben
|
||||
├── handlers/main.yml # Neustart-Aktionen (notify)
|
||||
├── templates/
|
||||
│ ├── nginx.conf.j2 # Jinja2-Template
|
||||
│ └── index.html.j2 # Template mit Schleife + Filter
|
||||
├── defaults/main.yml # Standard-Variablen (niedrigste Priorität)
|
||||
├── vars/main.yml # Rollen-Variablen (höhere Priorität)
|
||||
└── meta/main.yml # Rollen-Metadaten
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ausführen
|
||||
|
||||
```bash
|
||||
# Trockenlauf — zeigt nur, was passieren würde
|
||||
ansible-playbook site.yml --check
|
||||
|
||||
# Echt ausführen (benötigt sudo wegen Paket-Installation)
|
||||
ansible-playbook site.yml
|
||||
|
||||
# Variable per CLI überschreiben (HÖCHSTE Priorität!)
|
||||
ansible-playbook site.yml -e "nginx_port=9090"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Variablen-Präzedenz im Beispiel
|
||||
|
||||
Dieselbe Variable (`nginx_port`) ist an mehreren Stellen definiert — wer gewinnt?
|
||||
|
||||
| Priorität | Ort | Wert |
|
||||
|-----------|------------------------------|-----------------|
|
||||
| 1 (höchste) | Extra-Variablen `-e` | `9090` (wenn gesetzt) |
|
||||
| 2 | `host_vars/localhost.yml` | `8080` |
|
||||
| 3 | `group_vars/all.yml` | — |
|
||||
| 4 | `roles/.../vars/main.yml` | `nginx_user` |
|
||||
| 5 (niedrigste) | `roles/.../defaults/main.yml` | `80` (Default) |
|
||||
|
||||
→ Ergebnis: `nginx_port` wird **8080**, weil `host_vars` Vorrang vor `defaults`
|
||||
hat (die Default `80` wird überschrieben).
|
||||
|
||||
---
|
||||
|
||||
## Für Manjaro / Arch Linux anpassen
|
||||
|
||||
Das Beispiel nutzt `apt` (Debian/Ubuntu). Auf Manjaro ersetzt Du in
|
||||
`roles/webserver/tasks/main.yml` das Modul:
|
||||
|
||||
```yaml
|
||||
- name: Pakete installieren
|
||||
community.general.pacman:
|
||||
name: "{{ packages }}"
|
||||
state: present
|
||||
update_cache: true
|
||||
```
|
||||
|
||||
und passt die Paketnamen (`nginx`, `git`, `curl` bleiben gleich) sowie
|
||||
`nginx_user` ggf. an.
|
||||
@@ -0,0 +1,12 @@
|
||||
[defaults]
|
||||
# Inventory-Datei (relativ zum Projektordner)
|
||||
inventory = inventory.yml
|
||||
|
||||
# Kein SSH-Host-Key-Check (praktisch für lokale Tests)
|
||||
host_key_checking = False
|
||||
|
||||
# Python-Interpreter automatisch erkennen
|
||||
interpreter_python = auto_silent
|
||||
|
||||
# Retry-Dateien nicht anlegen
|
||||
retry_files_enabled = False
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
# group_vars/all.yml
|
||||
# Variablen für ALLE Hosts in der Gruppe "all" (mittlere Priorität).
|
||||
|
||||
app_name: "Meine Ansible-Demo"
|
||||
admin_email: admin@example.com
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
# host_vars/localhost.yml
|
||||
# Host-spezifische Variablen — überschreiben group_vars und Rollen-Defaults.
|
||||
|
||||
nginx_port: 8080 # überschreibt die Default 80 aus defaults/main.yml
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# Inventory — definiert die Ziel-Hosts
|
||||
# Format: YAML (alternativ auch INI möglich)
|
||||
|
||||
all:
|
||||
hosts:
|
||||
localhost:
|
||||
ansible_connection: local # läuft direkt auf diesem Rechner (kein SSH)
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
# roles/webserver/defaults/main.yml
|
||||
# Standard-Variablen — NIEDRIGSTE Priorität, leicht überschreibbar.
|
||||
|
||||
nginx_port: 80
|
||||
domain: example.com
|
||||
web_root: /var/www/html
|
||||
|
||||
packages:
|
||||
- nginx
|
||||
- git
|
||||
- curl
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
# roles/webserver/handlers/main.yml
|
||||
# Handler — laufen NUR, wenn eine Task sie per "notify" auslöst.
|
||||
# (Bsp.: erst nach einer Änderung an der Konfiguration neu starten.)
|
||||
|
||||
- name: nginx neu starten
|
||||
ansible.builtin.service:
|
||||
name: nginx
|
||||
state: restarted
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
# roles/webserver/meta/main.yml
|
||||
# Rollen-Metadaten: Name, Beschreibung, Lizenz, Abhängigkeiten.
|
||||
|
||||
galaxy_info:
|
||||
role_name: webserver
|
||||
author: Dein Name
|
||||
description: "Beispiel-Rolle: installiert & konfiguriert nginx (mit Templating)"
|
||||
license: MIT
|
||||
min_ansible_version: "2.10"
|
||||
|
||||
# Abhängigkeiten zu anderen Rollen (hier: keine)
|
||||
dependencies: []
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
# roles/webserver/tasks/main.yml
|
||||
# Die Aufgaben der Rolle. Jede Task ruft genau ein Modul auf (per FQCN).
|
||||
|
||||
- name: Betriebssystem ausgeben (Facts nutzen)
|
||||
ansible.builtin.debug:
|
||||
msg: "Läuft auf {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
||||
|
||||
- name: Pakete installieren
|
||||
ansible.builtin.apt:
|
||||
name: "{{ packages }}"
|
||||
state: present
|
||||
update_cache: true
|
||||
notify: nginx neu starten
|
||||
|
||||
- name: Webverzeichnis anlegen
|
||||
ansible.builtin.file:
|
||||
path: "{{ web_root }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Konfiguration aus Template rendern
|
||||
ansible.builtin.template:
|
||||
src: nginx.conf.j2
|
||||
dest: /etc/nginx/nginx.conf
|
||||
mode: '0644'
|
||||
notify: nginx neu starten
|
||||
|
||||
- name: Startseite aus Template rendern (mit Schleife & Filter)
|
||||
ansible.builtin.template:
|
||||
src: index.html.j2
|
||||
dest: "{{ web_root }}/index.html"
|
||||
mode: '0644'
|
||||
|
||||
- name: Dienst aktivieren und starten
|
||||
ansible.builtin.service:
|
||||
name: nginx
|
||||
state: started
|
||||
enabled: true
|
||||
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{ app_name }}</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>{{ app_name }}</h1>
|
||||
<p>Betriebssystem: {{ ansible_distribution }} {{ ansible_distribution_version }}</p>
|
||||
|
||||
<p>Installierte Pakete:</p>
|
||||
<ul>
|
||||
{% for pkg in packages %}
|
||||
<li>{{ pkg | upper }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<p>Port: {{ nginx_port }}</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,21 @@
|
||||
# {{ ansible_managed }} <- von Ansible erzeugt, nicht manuell ändern!
|
||||
|
||||
user {{ nginx_user }};
|
||||
worker_processes auto;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
server {
|
||||
listen {{ nginx_port }};
|
||||
server_name {{ domain }};
|
||||
|
||||
root {{ web_root }};
|
||||
index index.html;
|
||||
|
||||
# Fact des Zielsystems wird hier aufgelöst:
|
||||
access_log /var/log/nginx/{{ ansible_hostname }}.access.log;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
# roles/webserver/vars/main.yml
|
||||
# Rollen-Variablen — HÖHERE Priorität als defaults, nicht leicht überschreibbar.
|
||||
# Eignet sich für Werte, die fest zur Rolle gehören.
|
||||
|
||||
nginx_user: www-data
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
# site.yml — Haupt-Playbook
|
||||
# Ruft die Rolle "webserver" für localhost auf.
|
||||
|
||||
- name: Webserver auf localhost konfigurieren
|
||||
hosts: localhost
|
||||
gather_facts: true # Facts sammeln (OS, IP, Hostname, …)
|
||||
become: true # mit sudo ausführen (für Paket-Installation)
|
||||
|
||||
roles:
|
||||
- role: webserver
|
||||
vars: # Playbook-Variablen (überschreibt Defaults)
|
||||
domain: localhost
|
||||
Reference in New Issue
Block a user