Dezember 21, 2025
16 Min. Lesezeit

Vorstellungsgespräch Junior DevOps Engineer: Der komplette Leitfaden

interview
career-advice
job-search
entry-level
Vorstellungsgespräch Junior DevOps Engineer: Der komplette Leitfaden
MB

Milad Bonakdar

Autor

Meistern Sie die wichtigsten DevOps-Grundlagen mit umfassenden Fragen für Vorstellungsgespräche, die Linux, Git, CI/CD, Docker, Cloud-Grundlagen und Infrastructure as Code für Junior DevOps Engineers abdecken.


Einführung

DevOps Engineering schlägt eine Brücke zwischen Entwicklung und Betrieb und konzentriert sich auf Automatisierung, Zusammenarbeit und kontinuierliche Verbesserung. Als Junior DevOps Engineer benötigst du grundlegende Kenntnisse in Linux, Versionskontrolle, CI/CD-Pipelines, Containerisierung und Cloud-Plattformen.

Dieser Leitfaden behandelt wichtige Interviewfragen für Junior DevOps Engineers, die nach Themen geordnet sind, um dir bei der effektiven Vorbereitung zu helfen. Jede Frage enthält detaillierte Antworten, praktische Beispiele und praktische Code-Snippets.


Linux Grundlagen

1. Erläutere gängige Linux-Befehle, die du täglich als DevOps Engineer verwendest.

Antwort: Wesentliche Linux-Befehle für die DevOps-Arbeit:

# Dateioperationen
ls -la                    # Listet Dateien mit Details auf
cd /var/log              # Verzeichnis wechseln
cat /etc/hosts           # Dateiinhalte anzeigen
tail -f /var/log/app.log # Log-Datei in Echtzeit verfolgen
grep "error" app.log     # Suche nach Mustern

# Prozessmanagement
ps aux | grep nginx      # Prozesse auflisten
top                      # Systemressourcen überwachen
kill -9 1234            # Prozess zwangsweise beenden
systemctl status nginx   # Dienststatus prüfen
systemctl restart nginx  # Dienst neu starten

# Dateiberechtigungen
chmod 755 script.sh      # Dateiberechtigungen ändern
chown user:group file    # Eigentümerschaft ändern
ls -l                    # Berechtigungen anzeigen

# Festplattennutzung
df -h                    # Festplattenspeicher-Nutzung
du -sh /var/log          # Verzeichnisgröße
free -h                  # Speichernutzung

# Netzwerk
netstat -tulpn           # Zeigt abhörende Ports an
curl https://api.com     # HTTP-Anfrage stellen
ping google.com          # Konnektivität testen
ssh user@server          # Remote-Anmeldung

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


2. Wie behebst du das Problem, wenn ein Dienst unter Linux nicht startet?

Antwort: Systematischer Ansatz zur Fehlerbehebung:

# 1. Dienststatus prüfen
systemctl status nginx
# Nach Fehlermeldungen suchen

# 2. Logs prüfen
journalctl -u nginx -n 50
# oder
tail -f /var/log/nginx/error.log

# 3. Konfigurationssyntax prüfen
nginx -t

# 4. Prüfen, ob der Port bereits verwendet wird
netstat -tulpn | grep :80
# oder
lsof -i :80

# 5. Dateiberechtigungen prüfen
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. Festplattenspeicher prüfen
df -h

# 7. Manuelles Starten versuchen, um weitere Details zu erhalten
nginx -g 'daemon off;'

# 8. SELinux/AppArmor prüfen (falls aktiviert)
getenforce
ausearch -m avc -ts recent

Häufige Probleme:

  • Syntaxfehler in der Konfiguration
  • Port bereits in Verwendung
  • Berechtigung verweigert
  • Fehlende Abhängigkeiten
  • Unzureichender Festplattenspeicher

Seltenheit: Sehr häufig
Schwierigkeit: Mittel


Versionskontrolle mit Git

3. Erkläre den grundlegenden Git-Workflow und gängige Befehle.

Antwort: Git-Workflow für tägliche DevOps-Aufgaben:

# Repository initialisieren
git init
git clone https://github.com/user/repo.git

# Status prüfen
git status
git log --oneline

# Grundlegender Workflow
git add .                    # Änderungen stagen
git commit -m "Add feature"  # Änderungen committen
git push origin main         # Zum Remote pushen

# Branching
git branch feature-x         # Branch erstellen
git checkout feature-x       # Branch wechseln
git checkout -b feature-y    # Erstellen und wechseln

# Merging
git checkout main
git merge feature-x

# Neueste Änderungen ziehen
git pull origin main

# Änderungen rückgängig machen
git reset --hard HEAD        # Lokale Änderungen verwerfen
git revert abc123           # Bestimmten Commit rückgängig machen

# Änderungen stashen
git stash                    # Änderungen temporär speichern
git stash pop               # Gestashte Änderungen wiederherstellen

# Unterschiede anzeigen
git diff                     # Nicht gestagte Änderungen
git diff --staged           # Gestagte Änderungen

Bewährte Methoden:

  • Klare Commit-Nachrichten schreiben
  • Häufig committen, regelmäßig pushen
  • Feature-Branches verwenden
  • Vor dem Pushen pullen
  • Änderungen vor dem Committen überprüfen

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


4. Wie löst man einen Merge-Konflikt in Git?

Antwort: Schritt-für-Schritt-Konfliktlösung:

# 1. Merge versuchen
git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 2. Konfliktdateien prüfen
git status
# Unmerged paths:
#   both modified:   file.txt

# 3. Konfliktdatei öffnen
cat file.txt
# <<<<<<< HEAD
# Inhalt des aktuellen Branch
# =======
# Inhalt des eingehenden Branch
# >>>>>>> Feature-Branch

# 4. Datei bearbeiten, um den Konflikt zu lösen
# Konfliktmarkierungen entfernen und gewünschte Änderungen beibehalten

# 5. Gelöste Datei stagen
git add file.txt

# 6. Merge abschließen
git commit -m "Resolve merge conflict"

# Alternative: Merge abbrechen
git merge --abort

Konfliktmarkierungen:

  • <<<<<<< HEAD - Dein aktueller Branch
  • ======= - Trennzeichen
  • >>>>>>> branch-name - Eingehende Änderungen

Seltenheit: Häufig
Schwierigkeit: Leicht-Mittel


CI/CD Grundlagen

5. Was ist CI/CD und warum ist es wichtig?

Antwort: CI/CD steht für Continuous Integration und Continuous Deployment/Delivery.

Continuous Integration (CI):

  • Automatisches Erstellen und Testen von Code bei jedem Commit
  • Bugs frühzeitig erkennen
  • Sicherstellen, dass Code ordnungsgemäß integriert wird

Continuous Deployment (CD):

  • Automatisches Deployment in die Produktion, nachdem die Tests bestanden wurden
  • Schnellere Release-Zyklen
  • Reduzierte manuelle Fehler
Loading diagram...

Vorteile:

  • Schnellere Feedbackschleifen
  • Reduzierte Integrationsprobleme
  • Automatisierte Tests
  • Konsistente Deployments
  • Schnellere Markteinführungszeit

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


6. Erläutere eine grundlegende CI/CD-Pipeline mit GitHub Actions.

Antwort: Beispiel für einen GitHub Actions-Workflow:

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Run tests
      run: npm test
    
    - name: Build application
      run: npm run build
    
    - name: Run linter
      run: npm run lint

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Deploy to production
      run: |
        echo "Deploying to production..."
        # Hier Deployment-Befehle hinzufügen

Wichtige Konzepte:

  • Trigger: Wann die Pipeline ausgeführt wird (Push, PR, Zeitplan)
  • Jobs: Unabhängige Aufgaben, die parallel ausgeführt werden können
  • Steps: Einzelne Befehle innerhalb eines Jobs
  • Artifacts: Dateien, die zwischen Jobs ausgetauscht werden

Seltenheit: Sehr häufig
Schwierigkeit: Mittel


Docker & Containerisierung

7. Was ist Docker und warum verwenden wir Container?

Antwort: Docker ist eine Plattform zum Entwickeln, Ausliefern und Ausführen von Anwendungen in Containern.

Container vs. VMs:

  • Container teilen sich den Kernel des Host-Betriebssystems (leichtgewichtig)
  • VMs enthalten ein vollständiges Betriebssystem (schwer)
  • Container starten in Sekunden
  • Bessere Ressourcenauslastung

Vorteile:

  • Konsistenz: Überall die gleiche Umgebung
  • Isolation: Apps beeinträchtigen sich nicht gegenseitig
  • Portabilität: Überall ausführbar
  • Effizienz: Leichtgewichtig und schnell
# Beispiel Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


8. Erläutere gängige Docker-Befehle.

Antwort: Wesentliche Docker-Befehle:

# Images
docker pull nginx:latest          # Image herunterladen
docker images                     # Images auflisten
docker rmi nginx:latest          # Image entfernen
docker build -t myapp:1.0 .      # Image erstellen

# Containers
docker run -d -p 80:80 nginx     # Container ausführen
docker ps                         # Laufende Container auflisten
docker ps -a                      # Alle Container auflisten
docker stop container_id          # Container stoppen
docker start container_id         # Container starten
docker restart container_id       # Container neu starten
docker rm container_id            # Container entfernen

# Logs und Debugging
docker logs container_id          # Logs anzeigen
docker logs -f container_id       # Logs verfolgen
docker exec -it container_id bash # Container betreten
docker inspect container_id       # Detaillierte Informationen

# Aufräumen
docker system prune              # Unbenutzte Daten entfernen
docker volume prune              # Unbenutzte Volumes entfernen

# Docker Compose
docker-compose up -d             # Dienste starten
docker-compose down              # Dienste stoppen
docker-compose logs -f           # Logs anzeigen

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


9. Schreibe eine docker-compose.yml für eine Webanwendung mit einer Datenbank.

Antwort: Beispiel für eine Multi-Container-Anwendung:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    restart: unless-stopped

volumes:
  postgres_data:

Wichtige Konzepte:

  • services: Container definieren
  • depends_on: Dienstabhängigkeiten
  • volumes: Persistente Datenspeicherung
  • environment: Umgebungsvariablen
  • ports: Port-Mapping
  • restart: Neustartrichtlinie

Seltenheit: Häufig
Schwierigkeit: Mittel


Cloud Grundlagen

10. Erkläre den Unterschied zwischen IaaS, PaaS und SaaS.

Antwort: Cloud-Servicemodelle:

IaaS (Infrastructure as a Service):

  • Bietet: Virtuelle Maschinen, Speicher, Netzwerke
  • Du verwaltest: Betriebssystem, Laufzeitumgebung, Anwendungen
  • Beispiele: AWS EC2, Azure VMs, Google Compute Engine
  • Anwendungsfall: Volle Kontrolle über die Infrastruktur

PaaS (Platform as a Service):

  • Bietet: Laufzeitumgebung, Datenbanken, Middleware
  • Du verwaltest: Anwendungen und Daten
  • Beispiele: AWS Elastic Beanstalk, Heroku, Google App Engine
  • Anwendungsfall: Konzentration auf Code, nicht auf Infrastruktur

SaaS (Software as a Service):

  • Bietet: Vollständige Anwendungen
  • Du verwaltest: Benutzerdaten und Einstellungen
  • Beispiele: Gmail, Salesforce, Office 365
  • Anwendungsfall: Sofort einsatzbereite Anwendungen
Loading diagram...

Seltenheit: Häufig
Schwierigkeit: Leicht


11. Welche grundlegenden AWS-Dienste sollte ein DevOps Engineer kennen?

Antwort: Wesentliche AWS-Dienste:

Compute:

  • EC2: Virtuelle Server
  • Lambda: Serverlose Funktionen
  • ECS/EKS: Container-Orchestrierung

Storage:

  • S3: Objektspeicher
  • EBS: Blockspeicher für EC2
  • EFS: Gemeinsamer Dateispeicher

Networking:

  • VPC: Virtual Private Cloud
  • Route 53: DNS-Dienst
  • CloudFront: CDN
  • ELB: Load Balancing

Database:

  • RDS: Verwaltete relationale Datenbanken
  • DynamoDB: NoSQL-Datenbank

DevOps Tools:

  • CodePipeline: CI/CD-Dienst
  • CodeBuild: Build-Dienst
  • CloudWatch: Überwachung und Protokollierung
  • IAM: Zugriffsverwaltung

Beispiel: EC2-Instanz mit AWS CLI starten:

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-group-ids sg-0123456789abcdef0 \
  --subnet-id subnet-0123456789abcdef0 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'

Seltenheit: Sehr häufig
Schwierigkeit: Mittel


Infrastructure as Code

12. Was ist Infrastructure as Code (IaC) und warum ist es wichtig?

Antwort: IaC ist die Verwaltung der Infrastruktur durch Code anstelle manueller Prozesse.

Vorteile:

  • Versionskontrolle: Änderungen an der Infrastruktur verfolgen
  • Reproduzierbarkeit: Identische Umgebungen erstellen
  • Automatisierung: Manuelle Fehler reduzieren
  • Dokumentation: Code dient als Dokumentation
  • Konsistenz: Überall die gleiche Konfiguration

Beliebte IaC-Tools:

  • Terraform: Multi-Cloud-Provisionierung
  • Ansible: Konfigurationsmanagement
  • CloudFormation: AWS-spezifisch
  • Pulumi: Codebasiertes IaC

Beispiel Terraform:

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "WebServer"
    Environment = "Production"
  }
}

resource "aws_security_group" "web_sg" {
  name        = "web-sg"
  description = "Allow HTTP traffic"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Seltenheit: Sehr häufig
Schwierigkeit: Mittel


13. Erläutere den grundlegenden Terraform-Workflow.

Antwort: Terraform-Workflow-Schritte:

# 1. Terraform initialisieren
terraform init
# Lädt Provider und Module herunter

# 2. Code formatieren
terraform fmt
# Formatiert .tf-Dateien

# 3. Konfiguration validieren
terraform validate
# Überprüft die Syntax

# 4. Änderungen planen
terraform plan
# Zeigt, was erstellt/geändert/zerstört wird

# 5. Änderungen anwenden
terraform apply
# Erstellt/aktualisiert die Infrastruktur
# Fordert zur Bestätigung auf

# 6. Status anzeigen
terraform show
# Zeigt den aktuellen Status an

# 7. Infrastruktur zerstören
terraform destroy
# Entfernt alle Ressourcen

Terraform-Dateistruktur:

project/
├── main.tf          # Hauptkonfiguration
├── variables.tf     # Eingabevariablen
├── outputs.tf       # Ausgabewerte
├── terraform.tfvars # Variablenwerte
└── .terraform/      # Provider-Plugins

Beispielvariablen:

# variables.tf
variable "instance_type" {
  description = "EC2-Instanztyp"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "Umgebungsname"
  type        = string
}

# terraform.tfvars
environment = "production"
instance_type = "t2.small"

Seltenheit: Häufig
Schwierigkeit: Mittel


Überwachung & Protokollierung

14. Welche Metriken würdest du für eine Webanwendung überwachen?

Antwort: Wichtige Überwachungsmetriken:

Anwendungsmetriken:

  • Antwortzeit / Latenz
  • Anfragerate (Anfragen pro Sekunde)
  • Fehlerrate (4xx, 5xx Fehler)
  • Durchsatz

Systemmetriken:

  • CPU-Auslastung
  • Speichernutzung
  • Festplatten-I/O
  • Netzwerk-I/O

Infrastrukturmetriken:

  • Container-/Pod-Status
  • Dienstverfügbarkeit
  • Load-Balancer-Integrität

Beispiel Prometheus-Abfrage:

# Durchschnittliche Antwortzeit
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

# Fehlerrate
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

# CPU-Auslastung
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

Alarmierungsschwellenwerte:

  • Antwortzeit > 500 ms
  • Fehlerrate > 1%
  • CPU-Auslastung > 80%
  • Speichernutzung > 85%
  • Festplattennutzung > 90%

Seltenheit: Häufig
Schwierigkeit: Mittel


15. Wie zentralisiert man Logs von mehreren Servern?

Antwort: Zentralisierte Protokollierungsarchitektur:

Loading diagram...

Gängiger Stack (ELK):

  • Elasticsearch: Logs speichern und indizieren
  • Logstash/Fluentd: Logs sammeln und verarbeiten
  • Kibana: Logs visualisieren und durchsuchen

Beispiel Filebeat-Konfiguration:

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    app: myapp
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  index: "app-logs-%{+yyyy.MM.dd}"

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

Bewährte Methoden:

  • Strukturierte Protokollierung verwenden (JSON)
  • Korrelations-IDs einbeziehen
  • Aufbewahrungsrichtlinien festlegen
  • Strategisch indizieren
  • Log-Volumen überwachen

Seltenheit: Häufig
Schwierigkeit: Mittel


Kubernetes Grundlagen

16. Was ist Kubernetes und was sind seine grundlegenden Komponenten?

Antwort: Kubernetes ist eine Container-Orchestrierungsplattform, die die Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen automatisiert.

Grundlegende Komponenten:

Control Plane:

  • API Server: Einstiegspunkt für alle Befehle
  • etcd: Key-Value-Store für Clusterdaten
  • Scheduler: Weist Pods Knoten zu
  • Controller Manager: Verwaltet den gewünschten Zustand

Worker Nodes:

  • kubelet: Verwaltet Pods auf dem Knoten
  • kube-proxy: Netzwerk-Routing
  • Container Runtime: Führt Container aus (Docker, containerd)
Loading diagram...

Grundlegende Kubernetes-Objekte:

1. Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

2. Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

3. Service:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

Gängige kubectl-Befehle:

# Ressourcen abrufen
kubectl get pods
kubectl get deployments
kubectl get services

# Ressource beschreiben
kubectl describe pod nginx-pod

# Aus Datei erstellen
kubectl apply -f deployment.yaml

# Ressource löschen
kubectl delete pod nginx-pod

# Logs anzeigen
kubectl logs nginx-pod

# Befehl in Pod ausführen
kubectl exec -it nginx-pod -- /bin/bash

# Portweiterleitung
kubectl port-forward pod/nginx-pod 8080:80

Seltenheit: Sehr häufig
Schwierigkeit: Leicht


Konfigurationsmanagement

17. Erläutere die Grundlagen von Ansible und schreibe ein einfaches Playbook.

Antwort: Ansible ist ein agentenloses Konfigurationsmanagement-Tool, das SSH verwendet, um Server zu konfigurieren.

Wichtige Konzepte:

  • Inventory: Liste der zu verwaltenden Server
  • Playbook: YAML-Datei, die Aufgaben definiert
  • Modules: Wiederverwendbare Arbeitseinheiten
  • Roles: Organisierte Sammlung von Aufgaben

Inventory-Datei:

# inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com

[all: vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

Einfaches Playbook:

# playbook.yml
---
- name: Webserver einrichten
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: apt-Cache aktualisieren
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: Erforderliche Pakete installieren
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: Anwendungsbenutzer erstellen
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: nginx-Konfiguration kopieren
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: nginx neu starten
    
    - name: Sicherstellen, dass nginx läuft
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: Anwendung bereitstellen
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main
      become_user: "{{ app_user }}"
  
  handlers:
    - name: nginx neu starten
      service:
        name: nginx
        state: restarted

Beispielvorlage:

# templates/nginx.conf.j2
server {
    listen {{ app_port }};
    server_name {{ ansible_hostname }};
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Playbooks ausführen:

# Syntax überprüfen
ansible-playbook playbook.yml --syntax-check

# Trockenlauf (Check-Modus)
ansible-playbook playbook.yml --check

# Playbook ausführen
ansible-playbook -i inventory.ini playbook.yml

# Mit bestimmten Tags ausführen
ansible-playbook playbook.yml --tags "deploy"

# Auf bestimmte Hosts beschränken
ansible-playbook playbook.yml --limit webservers

Ansible-Rollenstruktur:

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    ├── vars/
    │   └── main.yml
    └── defaults/
        └── main.yml

Rollen verwenden:

---
- name: Infrastruktur einrichten
  hosts: all
  become: yes
  
  roles:
    - common
    - webserver
    - monitoring

Ad-hoc-Befehle:

# Alle Hosts anpingen
ansible all -i inventory.ini -m ping

# Befehl auf allen Hosts ausführen
ansible all -i inventory.ini -a "uptime"

# Paket installieren
ansible webservers -i inventory.ini -m apt -a "name=nginx state=present" --become

# Datei kopieren
ansible all -i inventory.ini -m copy -a "src=/local/file dest=/remote/file"

# Dienst neu starten
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

Seltenheit: Häufig
Schwierigkeit: Mittel


Skripting & Automatisierung

18. Schreibe ein Bash-Skript, um eine gängige DevOps-Aufgabe zu automatisieren.

Antwort: Bash-Skripting ist für die Automatisierung in DevOps unerlässlich.

Beispiel 1: Backup-Skript

#!/bin/bash

# Datenbank-Backup-Skript mit Rotation
set -e  # Beenden bei Fehler
set -u  # Beenden bei undefinierter Variable

# Konfiguration
DB_NAME="myapp"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
LOG_FILE="/var/log/mysql_backup.log"

# Funktion zum Protokollieren von Nachrichten
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Funktion zum Senden von Benachrichtigungen
send_notification() {
    local status=$1
    local message=$2
    
    # An Slack senden
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# Backup-Verzeichnis erstellen, falls es nicht existiert
mkdir -p "$BACKUP_DIR"

# Backup starten
log "Starte Backup der Datenbank: $DB_NAME"

# Backup durchführen
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "Backup erfolgreich abgeschlossen: $BACKUP_FILE"
    
    # Dateigröße abrufen
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "Backup-Größe: $SIZE"
    
    # Alte Backups entfernen
    log "Entferne Backups, die älter als $RETENTION_DAYS Tage sind"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # Zu S3 hochladen (optional)
    if command -v aws &> /dev/null; then
        log "Lade Backup zu S3 hoch"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "Datenbank $DB_NAME erfolgreich gesichert ($SIZE)"
else
    log "FEHLER: Backup fehlgeschlagen"
    send_notification "FAILED" "Datenbank $DB_NAME Backup fehlgeschlagen"
    exit 1
fi

log "Backup-Prozess abgeschlossen"

Beispiel 2: Health-Check-Skript

#!/bin/bash

# Skript zur Überprüfung des Dienstzustands
SERVICES=("nginx" "mysql" "redis")
ENDPOINTS=("http://localhost:80" "http://localhost:8080/health")
ALERT_EMAIL="[email protected]"

check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "✓ $service läuft"
        return 0
    else
        echo "✗ $service läuft NICHT"
        return 1
    fi
}

check_endpoint() {
    local url=$1
    local response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
    
    if [ "$response" -eq 200 ]; then
        echo "✓ $url ist fehlerfrei (HTTP $response)"
        return 0
    else
        echo "✗ $url ist fehlerhaft (HTTP $response)"
        return 1
    fi
}

check_disk_space() {
    local threshold=80
    local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$usage" -lt "$threshold" ]; then
        echo "✓ Festplattennutzung: ${usage}%"
        return 0
    else
        echo "✗ Festplattennutzung kritisch: ${usage}%"
        return 1
    fi
}

# Haupt-Health-Check
echo "=== System-Health-Check ==="
echo "Datum: $(date)"
echo

failed_checks=0

# Dienste prüfen
echo "Prüfe Dienste..."
for service in "${SERVICES[@]}"; do
    if ! check_service "$service"; then
        ((failed_checks++))
    fi
done
echo

# Endpunkte prüfen
echo "Prüfe Endpunkte..."
for endpoint in "${ENDPOINTS[@]}"; do
    if ! check_endpoint "$endpoint"; then
        ((failed_checks++))
    fi
done
echo

# Festplattenspeicher prüfen
echo "Prüfe Festplattenspeicher..."
if ! check_disk
Newsletter subscription

Wöchentliche Karrieretipps, die wirklich funktionieren

Erhalten Sie die neuesten Einblicke direkt in Ihr Postfach

Decorative doodle

Heben Sie sich bei Recruitern ab und Landen Sie Ihren Traumjob

Schließen Sie sich Tausenden an, die ihre Karriere mit KI-gestützten Lebensläufen transformiert haben, die ATS passieren und Personalverantwortliche beeindrucken.

Jetzt erstellen

Diesen Beitrag teilen

Nutzen Sie Ihre 6 Sekunden Optimal

Recruiter scannen Lebensläufe durchschnittlich nur 6 bis 7 Sekunden. Unsere bewährten Vorlagen sind darauf ausgelegt, sofort Aufmerksamkeit zu erregen und sie weiterlesen zu lassen.