GH GambleHub

Infrastructure as Code: Terraform, Ansible

Infrastructure as Code: Terraform, Ansible

1) Por qué IaC y en qué difieren las herramientas

Terraform es un orchestrator-IaC declarativo: crea/modifica infraestructura en la nube (VPC, K8s, LB, DB, IAM) a través de proveedores. Administra el ciclo de vida de los recursos y almacena el estado.
Ansible es un config-IaC de procedimiento y gestión de configuración: configura hosts/software (paquetes, archivos, servicios), sabe navegar aplicaciones, template, orquestación de pasos. Sin agente (SSH/WinRM), con idempotencia de tareas.

Combinación: Terraform - «de lo que está hecha la plataforma», Ansible - «cómo se configura y se ejecuta».

2) Estructura de repositorios y capas

Recomendamos 3 capas:

1. Foundation (Landing Zone): redes, IAM, KMS, registros básicos/monitoreo.

2. Plataforma: clústeres de Kubernetes, bases, colas, pila de observabilidad.

3. Workloads: espacios/no espacios, cuentas de servicio, políticas, confecciones.

Repo:
  • 'iac/terraform/' - módulos y entornos (' módulos/', 'envs/').
  • 'iac/ansible/' - roles (' roles/'), playbooks ('playbooks/'), inventarios (' inventories/').
  • 'policies/' - Regla OPA/Conftest.
  • 'pipelines/' - scripts CI/CD (lint/plan/apply/test).

3) Terraform: módulos, estate, entorno

3. 1 Módulos

Pequeños, reutilizables: 'vpc', 'eks', 'rds',' redis ',' amb ',' iam-role '.
Entradas → 'variables. tf ', salidas →' outputs. tf ', versiones - a través del registro de módulos/git-tags.

Ejemplo de llamada de módulo:
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 Estado (estado)

Backend remoto (S3/GCS + DynamoDB/LockTable) + bloqueos.
Separación por entornos: 'prod. tfstate`, `staging. tfstate`.
State-drift: 'terraform plan' en CI según lo programado; alerta a la deriva.

Backend de ejemplo:
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

Opciones:
  • Directorios individuales 'envs/prod',' envs/stage '(visualmente).
  • Talleres para variaciones ligeras, pero evitar mezclar secretos.
  • Opciones a través de 'tfvars': 'prod. tfvars`, `stage. tfvars`.

4) Ansible: roles, inventarios, idempotencia

4. 1 Roles y playbucks

Estándar Galaxy:

roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Ejemplo de playbook:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080

4. 2 Inventario y altavoz

`inventories/prod/hosts. yml '+ variables' group _ vars/host _ vars'.
Inventario dinámico: 'aws _ ec2', 'gcp _ compute', 'kubernetes. core`.

4. 3 Idempotencia

Utilice módulos (no 'shell') donde sea posible.
'changed _ when '/' check _ mode' para carreras en seco.
Los handlers solo se reflejan cuando se producen cambios.

5) Secretos y confecciones

Terraform: secreción de valores a través de 'sensitive = true'; los secretos en sí no se encuentran en el estado (guarde en AWS Secrets Manager/HashiCorp Vault/KMS y enlace la fuente de datos).
Ansible: Vault para cifrado de variables ('ansible-vault encrypt'), integración con HashiCorp Vault/KMS.
GitOps: secretos en reposo/almacenamiento independiente, acceso a través de least-privilege.

6) Políticas y cumplimiento (Policy as Code)

OPA/Conftest para planes de Terraform: prohibición de los S3 públicos abiertos por SG, recursos no etiquetados (tags).
Terraform Cloud/Enterprise - Sentinel como alternativa.
Ansible Lint: estilo y seguridad (sin 'sudo: yes' donde no hace falta, sin raw-shell).

Ejemplo Conftest (rego, simplificado):
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) Pruebas de IaC

Terraform: 'tflint', 'tfsec '/' checkov', Terratest (Go) para los controles de integración.
Ansible: 'ansible-lint', Molecule (+ Docker/Podman/EC2) para validar roles.
Pruebas de smoke después de apply: pruebas HTTP, puerto/procesos, derechos.

8) CI/CD и GitOps

Pipeline (en Pull/Merge Request):

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

2. Plan: 'plan de superficie' con la publicación del artefacto (comentario en MR).

3. Policy Gate: Conftest/Sentinel.

4. Apply (manual/approved): sólo en main con la firma de artefactos.

5. Ansible deploy: '--check' en el escenario, luego '--diff' en el prod.

6. Post-checks: sintético/Probe, anotación de dashboard de lanzamiento.

GitOps:
  • Guarde los manifiestos como fuente de la verdad; Argo CD/Flux para Kubernetes, pero los clústeres/primitivos básicos son a través de Terraform.

9) Patrones para Kubernetes, redes, DB

9. 1 Kubernetes

Terraform: clústeres EKS/GKE/AKS, nodos, IAM, StorageClass, LB.
Ansible: preparación de AMI/bastiones, ensamblaje de imágenes/repositorios, instalación posterior (loggers/agentes/OTel).

9. 2 Redes y perímetro

Terraform: VPC/subredes/NAT/Transit-Gateway/WAF, rutas.
Ansible: Confit NGINX/Envoy/HAProxy, TLS, WAF configuraciones de reglas.

9. 3 Bases/caché/cola

Terraform: RDS/CloudSQL parámetro-group, Redis/ElastiCache, Kafka/MSK.
Ansible: calentamiento de caché, trabajos de migración, configuración de backups/agentes.

10) Ejemplos de confecciones

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 - fuente de datos del secreto

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 - rol postgresql-client (fragmento)

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 con 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) Gestión de la deriva y el cumplimiento

El 'plan de terraforma' periódico en una clave de lectura única; crea un ticket cuando hay una discrepancia.
Ansible --check programado para roles críticos (modo audit).
Informes: políticas OPA/Conftest no cumplidas, recursos sin etiquetas/backup/monitoreo.

12) Observabilidad y auditoría

Logs 'terraform apply' y artefactos de planos - guardar en el almacén de objetos.
Ansible: 'callback _ plugins' (json) → registro central/ELK; incluya job ID, commit SHA, trace_id.
Métricas: tiempo de ejecución de planes/playbooks, frecuencia de cambios, cobertura de pruebas.

13) Seguridad

Firma de módulos/roles o etiquetas/hashes fijos.
Derechos mínimos de IAM ('plan' ≠ 'apply'), comparte los roles de CI y appruver humano.
Cifrado de estado/registro, registros privados de módulos/roles.
La política «no plaintext secrets in VCS», los escáneres de secreto (gitleaks/trufflehog).

14) Anti-patrones

Un módulo monstruo de Terraform «por todo»; ausencia de versiones de módulos.
Local 'terraform. tfstate 'y ningún bloqueo.
Correcciones manuales en la nube sobre IaC → una deriva eterna.
Ansible 'shell '/' command' en lugar de módulos (rompe la idempotencia).
Inventario «en un solo archivo» sin grupos/variables, mezcla prod/stage.
Secretos en vars/repositorio, sin Vault/KMS.
Apply sin Plan y sin Peer Review.

15) Lista de verificación de implementación (0-45 días)

0-10 días

Configurar backend/lock remoto, descomponer los módulos de Terraform.
Habilitar tflint/tfsec/checkov, ansible-lint; negociar etiquetas/etiquetas de recursos.
Crear roles ansibles para NGINX/agentes/logers; Organizar los inventarios.

11-25 días

Agregar Conftest/OPA, Terratest y Molecule para módulos/roles críticos.
CI: 'plan' sobre MR, el artefacto del plan, manual-apply con appruve; Ansible `--check` на stage.
Integrar almacenamiento secreto (Vault/KMS/Secrets Manager).

26-45 días

Plan de Auto-Plan para el Bebé Drift, Informes de Políticas.
Directorio de módulos/roles versionados; documentación 'README. md 'en cada uno.
GitOps: anotaciones de lanzamientos, un conjunto de monitoreo y alert gates.

16) Métricas de madurez

% de los entornos con state y locks remotos = 100%.
Porcentaje de módulos/roles con pruebas (Terratest/Molecule) ≥ 70%.
El tiempo promedio desde MR hasta apply (prod) es horas, no días.
Cero «deriva manual» (todos los cambios pasan por MR).
El 100% de los recursos críticos están cubiertos por Policy as Code (etiquetas, cifrado, copia de seguridad).

17) Conclusión

Terraform especifica una base de infraestructura predecible y repetible; Ansible lleva a los hosts y servicios al estado requerido. Agregue Policy as Code, un estado remoto con ubicación, pruebas, gestión secreta y CI/CD con plan→review→apply, y su circuito IaC será manejable, seguro y rápido, y las versiones serán atómicas y reversibles.

Contact

Póngase en contacto

Escríbanos ante cualquier duda o necesidad de soporte.¡Siempre estamos listos para ayudarle!

Telegram
@Gamble_GC
Iniciar integración

El Email es obligatorio. Telegram o WhatsApp — opcionales.

Su nombre opcional
Email opcional
Asunto opcional
Mensaje opcional
Telegram opcional
@
Si indica Telegram, también le responderemos allí además del Email.
WhatsApp opcional
Formato: +código de país y número (por ejemplo, +34XXXXXXXXX).

Al hacer clic en el botón, usted acepta el tratamiento de sus datos.