Ansible: configuración y deploy
(Sección: Tecnologías e Infraestructura)
Resumen breve
Ansible es una herramienta declarativa de configuración y orquestación, ideal para la configuración repetitiva de VM/hosts, servicios y aplicaciones cuando ya se ha creado la infraestructura (Terraform/IaC) y necesita «revitalizar» el entorno: instalar paquetes, desplegar versiones, rodar plantillas, reiniciar servicios sin downtime, aplicar políticas de seguridad. Clave del éxito: estructura modular (roles/colecciones), idempotencia rigurosa, trabajo ordenado con secretos (Vault), inventario dinámico, pruebas y disciplina GitOps.
Cuándo es apropiado Ansible (y cómo se combina con Terraform)
Terraform: crea recursos (VPC, clústeres, DB).
Ansible: configura el sistema operativo/software, patina versiones, impulsa migraciones, regula archivos y servicios.
Ligamento: Terraform lleva 'inventory '/IP/secretos a los artefactos, Ansible los lee en un paso de CD.
Estructura del repositorio (plantilla recomendada)
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 (mínimo):
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
Inventario: estático y dinámico
Estático (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'
Utilice los complementos de nube (o su propio script) para colocar los hosts en las etiquetas. Variables de entorno/etiquetas → 'group _ vars'.
Roles y
Rol = módulo de reutilización independiente (tareas, archivos, plantillas, handlers).
Colecciones: conjunto de roles/plugins/módulos. Fije los pines de las versiones en 'collections/requirements. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: escenarios idempotentes
Ejemplo de un playbook compartido:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
Función 'webapp' (fragmentos):
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
Handlers:
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 }
Plantillas de Jinja2 y variables
Almacena las variables default en 'defaults/main. yml ', sensibles - en Vault.
Utilice filtros ('| to_nice_yaml',' | b64encode ',' | default ') y condiciones' when '.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Secretos: Ansible Vault y gestores de secretos
Vault para cifrar archivos de variables ('group _ vars/all. vault. yml`).
Es mejor leer los secretos de los administradores externos (KMS/Secrets Manager/SSM) a través de los módulos adecuados y almacenar sólo enlaces/ARN en Vault.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Recomendaciones:
- Divida el acceso: los desarrolladores ven dev/stage, prod - sólo CI.
- Habilite la rotación de secretos y la auditoría de acceso.
Idempotencia y cambios correctos
Utilice módulos ('package', 'user', 'lineinfile', 'template', 'systemd') en lugar de' shell/command '.
Marca las tareas «ruidosas» de 'changed _ when: false' si no cambian nada.
Mantenga el modo check ('--check') y diff para los roles.
Para tareas inestables: '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
Productividad: grandes granjas y picos
forks: elevar el paralelismo (con precaución: no sobrecargar el objetivo).
strategy = free: realice tareas sin esperar a los vecinos.
pipelining = True в `ansible. cfg 'reduce RTT.
gather_facts: false donde los hechos no son necesarios.
async/poll para operaciones prolongadas; throttle/serial para las ondas del deboy.
delegate_to y run_once para acciones aisladas (por ejemplo, migración DB).
Patrones de downtime cero
Rolling deploy (20% cada uno)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
Inicie el playbook con '--limit web-canary' (subconjunto del grupo), compruebe las métricas y, a continuación, gire en todo el grupo.
Blue-Green
Dos grupos de hosts 'web _ blue' y 'web _ green'; por el playbook prepare una nueva ola, luego cambie el tráfico (DNS/LB) por la tarea 'community. general. affiliate_lb'/API su equilibrador.
Seguridad y hardening
Papel hardening: políticas SSH, banners, 'sudo' sin NOPASSWD, firewall, auditd/rsyslog, time-NTP, 'fail2ban'.
Habilite SELinux/AppArmor, administre las políticas a través de módulos.
Bastión: limite el SSH a los objetivos sólo a través del jump-host (ver 'ProxyJump').
Minimice 'become: true'; formalice RBAC a nivel de inventario (quién puede ejecutar qué playbooks).
Windows y hardware de red
Windows: módulos 'win _', conexión WinRM, scripts PowerShell - como el último argumento.
Red: 'network _ cli '/' http papi', módulos para Cisco/Juniper/F5; atomicidad a través de 'save _ when: changed'.
Pruebas y calidad
ansible-lint + yamllint в CI.
Molecule: pruebas de roles locales/contenedores, verificación de idempotencia (doble ejecución sin cambios).
Sandbox: inventario temporal/imágenes de VM individuales.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Integración con CI/CD y GitOps
Paipeline tipo:1. Lint → Syntax check → Molecule.
2. Construcción de artefactos de aplicación.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Reportaje de hosts alterados, artefacto de registro.
Ejemplo de paso (concepto):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
Supervisión y auditoría
Conectar complementos de llamada (json/yaml/timer/profile_tasks): informes de tiempo y cambios.
Guarde los registros de playbooks en un almacenamiento centralizado.
Etiquetar las tareas de 'tags:' para lanzamientos selectivos y agilizar las investigaciones.
Recetas frecuentes para iGaming
Web/API noda: Nginx + systemd-unit, health-checks, secrets of manager, roll-restart.
Servicios de juegos: plantillas de configuración por región/tenante a través de 'group _ vars'.
Conectores de pago: permiches estrictos en las llaves, reinicio por notify, inspección posterior de endpoints.
ETL-jobs: implementación de scripts CronJob c 'cron' módulo, archivo de bloqueo idempotent.
Monitoreo: instalación de agentes (node_exporter/otelcol), auto-registro en el monitoreo.
Antipattern
El uso de 'shell/command' donde hay un módulo.
Los playbucks sin 'handlers' → restarts superfluos y servicios temblorosos.
Almacenar secretos en 'group _ vars' abierto.
Ausencia de 'serial '/' max _ fail _ percentage' en las ondas prod deply.
Global 'gather _ facts: true' y 'become: true' sin necesidad.
Roles sin pruebas Molecule y sin soporte '--check'.
Largos comandos sin 'async/poll' bloqueando toda la ola.
Lista de comprobación de implementación
1. Alinee el marco del repositorio y las convenciones de nombres.
2. Configure el inventario dinámico y el bastión.
3. Arranca roles (webapp/hardening/monitoring) y versiones pin de las colecciones.
4. Habilitar Vault y/o integración con el gestor de secretos.
5. Proporcionar idempotencia, '--check/--diff', handlers y etiquetas.
6. Conectar ansible-lint, yamllint, Molecule en CI.
7. Describir el patrón deploy (rolling/canary/blue-green) y los límites 'serial'.
8. Añadir complementos de llamada, recopilación de registros, informe de cambios.
9. Documentar runbook y reversión y acciones en caso de incidentes.
10. Llevar a cabo regularmente el juego-día: acantilado SSH, caída del nodo, reversión de la versión.
Resultados
Ansible cierra la «última milla» entre la infraestructura creada y la venta en funcionamiento: cambios rápidos, seguros y predecibles en las configuraciones y lanzamientos. Con el papel de unidad de reutilización mínima, inventario dinámico, funcionamiento correcto de los secretos y patrones de downtime cero verificados, Ansible ayuda a los comandos iGaming a reducir el tiempo a deploy, reducir el número de incidentes nocturnos y mantener el p99 en el nivel de SLO.