GH GambleHub

Infrastructure as Code: Terraform, Ansible

Infrastructure as Code: Terraform, Ansible

1) Warum IaC und wie sich die Werkzeuge unterscheiden

Terraform - declarative orchestrator-IaC: erstellt/ändert eine Cloud-Infrastruktur (VPC, K8s, LB, DB, IAM) über Provider. Verwaltet den Lebenszyklus von Ressourcen und speichert den Status.
Ansible - prozedurales config-IaC und Konfigurationsmanagement: konfiguriert Hosts/Software (Pakete, Dateien, Dienste), kann Anwendungen sehen, Templeating, Orchestrierung von Schritten. Ohne Agent (SSH/WinRM), mit Idempotenz der Aufgaben.

Die Kombination: Terraform - „woraus die Plattform besteht“, Ansible - „wie sie aufgebaut ist und läuft“.

2) Aufbau von Repositories und Layern

Wir empfehlen 3 Schichten:

1. Foundation (Landing Zone): Netzwerke, IAM, KMS, Basisprotokolle/Monitoring.

2. Plattform: Kubernetes-Cluster, Basen, Warteschlangen, Observability-Stack.

3. Workloads: Räume/Neymspaces, Servicekonten, Richtlinien, Configs.

Repos:
  • „iac/terraform/“ - Module und Umgebungen („ modules/“, „envs/“).
  • „iac/ansible/“ - Rollen („ roles/“), Playbooks („playbooks/“), Inventar („ inventories/“).
  • „policies/“ - OPA/Conftest-Regeln.
  • „pipelines/“ - CI/CD-Skripte (lint/plan/apply/test).

3) Terraform: Module, Staat, Umgebungen

3. 1 Module

Kleine, wiederverwendete: „vpc“, „eks“, „rds“, „redis“, „alb“, „iam-role“.
Eingänge → 'variables. tf', die Ausgänge → 'outputs. tf', Versionen - über die Registrierung von Modulen/git-Tags.

Beispiel für einen Modulaufruf:
hcl module "vpc" {
source = "git::ssh://git@repo/iac. git//modules/vpc? ref=v1. 6. 0"
name  = "prod-core"
cidr  = "10. 0. 0. 0/16"
azs  = ["eu-central-1a","eu-central-1b"]
}

3. 2 Zustand (Zustand)

Remote Backend (S3/GCS + DynamoDB/LockTable) + Sperren.
Einteilung nach Umgebung: 'prod. tfstate`, `staging. tfstate`.
State-drift: „terraform plan“ in CI nach Zeitplan; alert beim Driften.

Beispiel Backend:
hcl terraform {
backend "s3" {
bucket     = "iac-state"
key      = "prod/network/terraform. tfstate"
region     = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt    = true
}
}

3. 3 Workspaces / Envs

Die Optionen sind:
  • Die einzelnen Verzeichnisse' envs/prod', 'envs/stage' (übersichtlich).
  • Workspaces für leichte Variationen, aber vermeiden Sie das Mischen von Geheimnissen.
  • Parameter über 'tfvars': 'prod. tfvars`, `stage. tfvars`.

4) Ansible: Rollen, Inventar, Idempotenz

4. 1 Rollen und Playbooks

Galaxy-Standard:

roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Beispiel für ein Playbook:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080

4. 2 Inventar und Dynamik

`inventories/prod/hosts. yml'+ Variablen 'group _ vars/host _ vars'.
Dynamisches Inventar: 'aws _ ec2', 'gcp _ compute', 'kubernetes. core`.

4. 3 Idempotenz

Verwenden Sie Module (nicht 'shell') wo möglich.
'changed _ when '/' check _ mode' für Trockenläufe.
Handler reflektieren nur, wenn sie wechseln.

5) Geheimnisse und Configs

Terraform: Sekretion von Werten durch 'sensitiv = wahr'; Die Geheimnisse selbst befinden sich nicht im Staat (speichern Sie im AWS Secrets Manager/HashiCorp Vault/KMS und beziehen Sie sich auf die Datenquelle).
Ansible: Vault zur Verschlüsselung von Variablen ('ansible-vault encrypt'), Integration mit HashiCorp Vault/KMS.
GitOps: Geheimnisse in einem separaten Repo/Tresor, Zugriff durch Least-Privilege.

6) Richtlinien und Compliance (Policy as Code)

OPA/Conftest für Terraform Pläne: Verbot von öffentlichen S3, offene SG, unmarkierte Ressourcen (Tags).
Terraform Cloud/Enterprise - Sentinel als Alternative.
Ansible Lint: Stil und Sicherheit (ohne' sudo: yes' wo nicht notwendig, ohne raw-shell).

Beispiel Conftest (rego, vereinfacht):
rego package terraform. security

deny[msg] {
input. resource_type == "aws_security_group_rule"
input. values. cidr_blocks[_] == "0. 0. 0. 0/0"
input. values. from_port == 22 msg:= "SSH from 0. 0. 0. 0/0 is forbidden"
}

7) IaC-Prüfung

Terraform: 'tflint',' tfsec'/' checkov', Terratest (Go) für Integrationsprüfungen.
Ansible: 'ansible-lint', Molecule (+ Docker/Podman/EC2) zum Überprüfen der Rollen.
Smoke-Tests nach Anwendung: HTTP-Proben, Port/Prozesse, Rechte.

8) CI/CD и GitOps

Pipeline (auf Pull/Merge Request):

1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.

2. Plan: 'terraform plan' mit Veröffentlichung des Artefakts (Kommentar in MR).

3. Policy Gate: Conftest/Sentinel.

4. Apply (manual/approved): nur auf main mit der Signatur der Artefakte.

5. Ansible deploy: '--check' auf der Bühne, dann '--diff' in prod.

6. Post-checks: synthetics/Probe, dashboard release annotation.

GitOps:
  • Bewahren Sie Manifeste als Quelle der Wahrheit auf; Argo CD/Flux für Kubernetes, aber die grundlegenden Cluster/Primitive sind über Terraform.

9) Muster für Kubernetes, Netze, DB

9. 1 Kubernetes

Terraform: EKS/GKE/AKS Cluster, Knoten, IAM, StorageClass, LB.
Ansible: Vorbereitung von AMIs/Bastionen, Montage von Images/Repositories, Post-Install (Logger/Agenten/OTel).

9. 2 Netzwerke und Perimeter

Terraform: VPC/Subnetze/NAT/Transit-Gateway/WAF, Routen.
Ansible: config NGINX/Envoy/HAProxy, TLS, config WAF Regeln.

9. 3 Basen/Caches/Warteschlangen

Terraform: RDS/CloudSQL-Parametergruppen, Redis/ElastiCache, Kafka/MSK.
Ansible: Cache-Aufwärmen, Migrationsaufträge, Konfiguration von Backups/Agenten.

10) Beispiele für Config

10. 1 Terraform — RDS PostgreSQL + SG

hcl module "db" {
source        = "terraform-aws-modules/rds/aws"
engine        = "postgres"
engine_version    = "15. 4"
instance_class    = "db. m6g. large"
allocated_storage  = 100 name         = "core"
username       = var. db_user password       = var. db_password # см. secret data source vpc_security_group_ids = [module. db_sg. security_group_id]
multi_az       = true backup_retention   = 7
}

module "db_sg" {
source = "terraform-aws-modules/security-group/aws"
name  = "db-core"
vpc_id = module. vpc. vpc_id ingress_cidr_blocks = ["10. 0. 0. 0/8"]
ingress_rules    = ["postgresql-tcp"]
}

10. 2 Terraform - Datenquelle des Geheimnisses

hcl data "aws_secretsmanager_secret_version" "db" {
secret_id = "prod/db/core"
}
variable "db_password" {
type   = string sensitive = true default  = jsondecode(data. aws_secretsmanager_secret_version. db. secret_string). password
}

10. 3 Ansible - die Rolle des postgresql-Clients (Fragment)

yaml
- name: Install packages apt:
name: [ "postgresql-client-15" ]
state: present update_cache: yes

- name: Create. pgpass copy:
dest: /home/deploy/.pgpass mode: '0600'
content: "{{ db_host }}:5432:core:{{ db_user }}:{{ db_password }}"
no_log: true

- name: Smoke query shell: psql -h {{ db_host }} -U {{ db_user }} -d core -c "select 1"
register: psql_out changed_when: false

10. 4 Ansible - NGINX mit Template

yaml
- name: Deploy nginx. conf template:
src: templates/nginx. conf. j2 dest: /etc/nginx/nginx. conf notify: Restart nginx

- name: Ensure nginx running service:
name: nginx state: started enabled: true

handlers:
- name: Restart nginx service: { name: nginx, state: restarted }

11) Drift- und Compliance-Management

Periodischer 'terraform plan' im read-only Schlüssel; erstellt ein Ticket bei einer Diskrepanz.
Ansible --check nach Zeitplan für kritische Rollen (Audit-Modus).
Berichte: OPA/Conftest-Richtlinien nicht erfüllt, Ressourcen ohne Tags/Backup/Überwachung.

12) Beobachtbarkeit und Audit

'terraform apply' -Protokolle und Planartefakte - im Objektspeicher speichern.
Ansible: 'callback _ plugins' (json) → zentrales Log/ELK; Aktivieren Sie Job-ID, Commit SHA, trace_id.
Metriken: Ausführungszeit der Pläne/Playbooks, Änderungshäufigkeit, Testabdeckung.

13) Sicherheit

Signieren Sie Module/Rollen oder feste Tags/Hashes.
Minimale IAM-Rechte ('plan' ≠ 'apply'), trennen Sie die Rollen von CI und Appruver-Person.
Status-/Logverschlüsselung, private Modul-/Rollenregister.
Politik „keine plaintext Geheimnisse in VCS“, geheime Scanner (gitleaks/trufflehog).

14) Anti-Muster

Ein Terraform-Monster „für alles“; keine Modulversionen.
Lokal 'terraform. tfstate' und keine Sperren.
Manuelle Änderungen in der Cloud über IaC → ewige Drift.
Ansible' shell '/' command 'anstelle von Modulen (bricht Idempotenz).
Inventar „in einer Datei“ ohne Gruppen/Variablen, Mischung prod/stage.
Geheimnisse in vars/repository, kein Vault/KMS.
Bewerben Sie sich ohne Plan und ohne Peer Review.

15) Implementierung Checkliste (0-45 Tage)

0-10 Tage

Konfigurieren Sie Remote Backend/Lock, erweitern Sie Terraform-Module.
Aktivieren Sie tflint/tfsec/checkov, ansible-lint; verhandeln über Ressourcen-Tags/Labels.
Starten Sie Ansible Rollen für NGINX/Agenten/Logger; organisieren Inventar.

11-25 Tage

Fügen Sie Conftest/OPA, Terratest und Molecule für kritische Module/Rollen hinzu.
CI: 'plan' auf MR, Artefakt des Plans, manuelle Anwendung mit Appruv; Ansible `--check` на stage.
Integration von Secret Storage (Vault/KMS/Secrets Manager).

26-45 Tage

Auto-Plan nach Zeitplan für Drift-Detect, Berichte über Richtlinien.
Modul-/Rollenkatalog mit Versionierung; Dokumentation 'README. md 'in jedem.
GitOps: Release-Annotationen, Verknüpfung mit Monitoring und Alert-Gates.

16) Reifegradkennzahlen

% der Umgebungen mit Remote-Status und Locs = 100%.
Der Anteil der Module/Rollen mit Tests (Terratest/Molecule) ≥ 70%.
Die durchschnittliche Zeit von MR bis apply (prod) ist Stunden, nicht Tage.
Null „manuelle Drift“ (alle Änderungen gehen über MR).
100% der kritischen Ressourcen werden durch Policy as Code (Tags, Verschlüsselung, Backup) abgedeckt.

17) Fazit

Terraform legt eine vorhersehbare, wiederholbare Infrastruktur-Basis fest; Ansible bringt Hosts und Services in den gewünschten Zustand. Fügen Sie Policy as Code, Remote State mit Standort, Tests, Secret Management und CI/CD mit plan→review→apply hinzu - und Ihre IaC-Schleife wird überschaubar, sicher und schnell und die Releases sind atomar und reversibel.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Telegram
@Gamble_GC
Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.