Ansible: Konfiguration und Deploy
(Abschnitt: Technologie und Infrastruktur)
Kurze Zusammenfassung
Ansible ist ein deklaratives Werkzeug für Konfigurationen und Orchestrierung, ideal für die wiederholbare Konfiguration von VMs/Hosts, Diensten und Anwendungen, wenn die Infrastruktur bereits erstellt wurde (Terraform/IaC) und die Umgebung „wiederbelebt“ werden muss: Pakete installieren, Release ausrollen, Vorlagen rollen, Dienste ohne Downtime neu starten, Sicherheitsrichtlinien anwenden. Der Schlüssel zum Erfolg: modulare Struktur (Rollen/Sammlungen), strikte Idempotenz, sorgfältiger Umgang mit Geheimnissen (Vault), dynamisches Inventar, Tests und GitOps-Disziplin.
Wann Ansible angemessen ist (und wie es mit Terraform kombiniert wird)
Terraform - Erstellt Ressourcen (VPC, Cluster, DB).
Ansible - konfiguriert OS/Software, rollt Versionen aus, treibt Migrationen voran, verwaltet Dateien und Dienste.
Bündelung: Terraform gibt 'inventory '/IP/secrets in Artefakte aus, Ansible liest sie im CD-Schritt.
Repository-Struktur (empfohlene Vorlage)
ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
ansible. cfg (Minimum):
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True
Inventar: statisch und dynamisch
Statisch (ini):ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11
[db]
db-01 ansible_host=10. 0. 2. 10
[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'
Dynamisch
Verwenden Sie Cloud-Plugins (oder Ihr eigenes Skript), um Hosts nach Tags zu ziehen. Umgebungsvariablen/Tags → 'group _ vars'.
Rollen und Sammlungen
Rolle = unabhängiges Wiederverwendungsmodul (Aufgaben, Dateien, Vorlagen, Handler).
Sammlungen - Eine Reihe von Rollen/Plugins/Modulen. Fixieren Sie die Pins der Versionen in 'collections/requirements. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: Idempotente Szenarien
Beispiel für ein allgemeines Playbook:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
Rolle' webapp'(Fragmente):
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present
- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx
- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}" # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current
- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
Handler:
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }
- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }
Jinja2 und Variablen
Speichern Sie die Default-Variablen in 'defaults/main. yml', sensibel - im Vault.
Verwenden Sie die Filter ('| to_nice_yaml','| b64encode','| default') und die Bedingungen 'when'.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Geheimnisse: Ansible Vault und die Manager der Geheimnisse
Vault zum Verschlüsseln von Variablendateien ('group _ vars/all. vault. yml`).
Es ist besser, Geheimnisse von externen Managern (KMS/Secrets Manager/SSM) über die entsprechenden Module zu lesen und nur Links/ARNs im Vault zu speichern.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Empfehlungen:
- Teilen Sie den Zugriff: Entwickler sehen dev/stage, prod nur CI.
- Aktivieren Sie Secret Rotation und Access Audit.
Idempotenz und korrekte Änderungen
Verwenden Sie die Module ('package', 'user', 'lineinfile', 'template', 'systemd') anstelle von 'shell/command'.
Markieren Sie die „lauten“ Aufgaben 'changed _ when: false', wenn sie nichts ändern.
Unterstützung von check mode ('--check') und diff für Rollen.
Für instabile Aufgaben: 'retries', 'delay', 'until'.
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
Produktivität: große Farmen und Peaks
forks: Heben Sie die Parallelität an (mit Vorsicht: überlasten Sie das Ziel nicht).
Strategie = frei - Erledigen Sie Aufgaben, ohne auf Ihre Nachbarn zu warten.
pipelining = True в `ansible. cfg 'reduziert die RTT.
gather_facts: false, wo Fakten unnötig sind.
async/poll für lange Operationen; throttle/serial für Deploywellen.
delegate_to und run_once für einzelne Aktionen (z. B. DB-Migration).
Null-Downtime-Muster
Rolling-Deploy (jeweils 20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
Führen Sie das Playbook mit '--limit web-canary' (eine Teilmenge der Gruppe) aus, überprüfen Sie die Metriken und rollen Sie es dann auf die gesamte Gruppe aus.
Blue-Green
Die beiden Hostgruppen 'web _ blue' und 'web _ green'; Bereiten Sie mit dem Playbook eine neue Welle vor, wechseln Sie dann den Verkehr (DNS/LB) mit der Aufgabe' community'. general. affiliate_lb'/API Sie Ihren Balancer.
Sicherheit und Hardening
Die Rolle des Hardening: SSH-Richtlinien, Banner, 'sudo' ohne NOPASSWD, Firewall, auditd/rsyslog, time-NTP, 'fail2ban'.
Aktivieren Sie SELinux/AppArmor, verwalten Sie Richtlinien über Module.
Bastion: SSH auf Ziele nur über Jump-Host beschränken (siehe' ProxyJump').
Minimieren Sie' become: true'; Gestalten Sie RBACs auf Inventarebene (wer kann welche Playbooks ausführen).
Windows und Netzwerkhardware
Windows: 'win _' Module, Verbindung über WinRM, PowerShell Skripte - als letztes Argument.
Network: 'network _ cli '/' httpapi', Module für Cisco/Juniper/F5; Atomarität durch „save _ when: changed“.
Prüfung und Qualität
ansible-lint + yamllint в CI.
Molecule: lokale/Container-Rollentests, Idempotenzprüfung (Doppellauf unverändert).
Sandbox: separate temporäre Inventare/VM-Images.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Integration mit CI/CD und GitOps
Typische Pipeline:1. Lint → Syntax check → Molecule.
2. Erstellen von Anwendungsartefakten.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Reporte von geänderten Hosts, ein Artefakt von Logs.
Beispielschritt (Konzept):bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff
Überwachbarkeit und Audit
Verbinden Sie Callback-Plugins (json/yaml/timer/profile_tasks) - Zeit- und Änderungsberichte.
Speichern Sie die Playbook-Protokolle in einem zentralen Speicher.
Beschriften Sie die Aufgaben 'tags:' für selektive Starts und beschleunigte Untersuchungen.
Häufige Rezepte für iGaming
Web/API nod: Nginx + systemd-unit, health-checks, secrets from manager, roll-restart.
Game-Services: Config-Muster nach Regionen/Tenanten über 'group _ vars'.
Payment Connectors: strenge Permishens für Schlüssel, Neustart durch notify, Post-Check-Endpunkte.
ETL-Jobs: Bereitstellung der CronJob-Skripte c 'cron' durch das Modul, idempotent lock-file.
Überwachung: Installation von Agenten (node_exporter/otelcol), Auto-Registrierung in der Überwachung.
Anti-Pattern
Verwendung von 'shell/command', wo ein Modul vorhanden ist.
Playbooks ohne „Handler“ → unnötige Neustarts und zitternde Dienste.
Speichern von Geheimnissen in offenen 'group _ vars'.
Fehlen von 'serial '/' max _ fail _ percentage' beim Deployment von Prod-Wellen.
Das globale' gather _ facts: true' und 'become: true' ist unnötig.
Rollen ohne Molecule-Tests und ohne' --check '-Unterstützung.
Lange Kommandos ohne' async/poll', die die ganze Welle blockieren.
Checkliste für die Implementierung
1. Stimmen Sie das Repository-Framework und die Namenskonvention ab.
2. Konfigurieren Sie Ihr dynamisches Inventar und bastion.
3. Starten Sie Rollen (webapp/hardening/monitoring) und Pin-Versionen von Sammlungen.
4. Aktivieren Sie Vault und/oder Integration mit Secret Manager.
5. Stellen Sie idempotency, '--check/--diff', handlers und Tags zur Verfügung.
6. Verbinden Sie ansible-lint, yamllint, Molecule in CI.
7. Beschreiben Sie das Deploy-Muster (Rolling/Canary/Blue-Green) und die' Serial '-Grenzen.
8. Callback-Plugins hinzufügen, Protokolle sammeln, Änderungsbericht.
9. Dokumentieren Sie die Runbook-und Rollbacks und Aktionen bei Vorfällen.
10. Regelmäßig einen Spieletag durchführen: SSH-Klippe, Node-Drop, Rollback-Version.
Ergebnisse
Ansible schließt die „letzte Meile“ zwischen etablierter Infrastruktur und laufendem Vertrieb: schnelle, sichere und vorhersehbare Änderungen an Konfigurationen und Releases. Mit der Rolle als minimale Wiederverwendungseinheit, dynamischen Inventaren, korrektem Umgang mit Geheimnissen und verifizierten Zero-Downtime-Mustern hilft Ansible iGaming-Teams, Time-to-Deploy zu reduzieren, nächtliche Vorfälle zu reduzieren und p99 auf SLO-Niveau zu halten.