Ansible Nginx es la solución definitiva para automatizar la instalación y configuración de servidores web a escala. En esta guía completa, aprenderás a desplegar configuraciones consistentes, gestionar múltiples sitios virtuales, implementar SSL/TLS automático, y optimizar tus servidores Nginx de forma declarativa y reproducible mediante playbooks de Ansible.
Gestionar manualmente decenas de servidores web Nginx es tedioso, propenso a errores y difícil de escalar. Con Ansible Nginx, transformas horas de trabajo manual en minutos de automatización inteligente, garantizando configuraciones idénticas y auditables en toda tu infraestructura.
¿Qué es Ansible Nginx?
Ansible Nginx es la combinación de la herramienta de automatización Ansible con el servidor web de alto rendimiento Nginx. Esta integración permite gestionar configuraciones de servidores web mediante infraestructura como código (IaC), eliminando la necesidad de conexiones SSH manuales y comandos repetitivos.
Nginx es el servidor web más popular del mundo, utilizado por el 33.6% de todos los sitios web activos según W3Techs. Su arquitectura event-driven y bajo consumo de recursos lo convierten en la elección ideal para servir contenido estático, actuar como reverse proxy, balanceador de carga o gateway API.
Ansible, por su parte, es una plataforma de automatización sin agentes que utiliza SSH para ejecutar tareas en servidores remotos. Al combinar ambas tecnologías, obtienes capacidades de:
- Despliegue consistente: Configura 1 o 100 servidores con el mismo playbook
- Idempotencia: Ejecuta el playbook múltiples veces sin efectos secundarios
- Versionado: Almacena configuraciones en Git para auditoría completa
- Templates dinámicos: Genera configuraciones Nginx específicas por entorno
- Orquestación avanzada: Coordina reinicios, validaciones y rollbacks
Casos de Uso de Ansible Nginx
La automatización con Ansible Nginx se aplica en múltiples escenarios de infraestructura moderna:
- Microservicios y contenedores: Desplegar reverse proxies para clusters Kubernetes o servicios Docker
- Sitios multi-tenant: Gestionar cientos de sitios virtuales con configuraciones individualizadas
- Edge computing: Distribuir configuraciones a nodos edge geográficamente dispersos
- DevOps CI/CD: Integrar despliegues de configuración en pipelines automatizados
- Compliance y auditoría: Garantizar configuraciones de seguridad consistentes (TLS 1.3, headers de seguridad)
Arquitectura de Ansible Nginx
La arquitectura de una solución Ansible Nginx se compone de tres elementos principales:
Control Node (Nodo de Control)
Es la máquina donde ejecutas Ansible. Requiere Python 3.8+ y Ansible 2.9 o superior. Desde aquí se orquestan todas las operaciones hacia los servidores Nginx.
Managed Nodes (Servidores Nginx)
Son los servidores donde se instalará y configurará Nginx. Solo requieren Python 2.7+ o 3.5+ y acceso SSH. Ansible no instala agentes, lo que reduce la superficie de ataque y simplifica el mantenimiento.
Playbooks y Roles
Los playbooks son archivos YAML que describen el estado deseado del sistema. Los roles son componentes reutilizables que encapsulan tareas relacionadas con Nginx: instalación, configuración, certificados SSL, y gestión de sitios.
El flujo de ejecución típico es:
- Ansible lee el inventario de servidores
- Establece conexiones SSH a los managed nodes
- Transfiere módulos Python temporales
- Ejecuta tareas (instalar paquetes, copiar templates, reiniciar servicios)
- Recolecta resultados y muestra el estado final
Requisitos Previos para Ansible Nginx
Antes de implementar Ansible Nginx, asegúrate de cumplir con estos requisitos:
En el Control Node
- Sistema operativo: Linux, macOS o WSL2 en Windows
- Python: 3.8 o superior
- Ansible: Versión 2.9+ (recomendado 2.14+)
- SSH client: OpenSSH o compatible
- Git: Para versionado de playbooks (opcional pero recomendado)
Instalar Ansible en Ubuntu/Debian:
sudo apt update
sudo apt install -y ansible python3-pip
ansible --version
En los Managed Nodes (Servidores Nginx)
- Sistema operativo: Ubuntu 20.04+, Debian 11+, CentOS 8+, Rocky Linux 8+
- Python: 2.7+ o 3.5+ (generalmente preinstalado)
- SSH server: OpenSSH configurado y activo
- Usuario con privilegios sudo: Para instalar paquetes y modificar configuraciones
- Puertos abiertos: 22 (SSH), 80 (HTTP), 443 (HTTPS)
Conocimientos Previos
- Sintaxis básica de YAML
- Conceptos de SSH y autenticación por clave pública
- Fundamentos de Nginx (virtual hosts, proxy_pass, ubicación de archivos de configuración)
- Comandos básicos de Linux (systemctl, grep, cat)
Crear Ansible Nginx Playbook Paso a Paso
Vamos a crear un playbook completo de Ansible Nginx que instale, configure y gestione múltiples sitios web con SSL automático.
Paso 1: Estructura de Directorios
Crea la estructura de directorios del proyecto:
mkdir -p ansible-nginx/{inventory,roles/nginx/{tasks,templates,handlers,defaults},group_vars}
cd ansible-nginx
tree
Estructura resultante:
ansible-nginx/
├── inventory/
│ └── hosts.ini
├── group_vars/
│ └── all.yml
├── roles/
│ └── nginx/
│ ├── tasks/
│ │ └── main.yml
│ ├── templates/
│ │ ├── nginx.conf.j2
│ │ └── site.conf.j2
│ ├── handlers/
│ │ └── main.yml
│ └── defaults/
│ └── main.yml
└── site.yml
Paso 2: Configurar el Inventario
Define tus servidores en inventory/hosts.ini:
[webservers]
web1.example.com ansible_host=192.168.1.10 ansible_user=ubuntu
web2.example.com ansible_host=192.168.1.11 ansible_user=ubuntu
web3.example.com ansible_host=192.168.1.12 ansible_user=ubuntu
[webservers:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_ssh_private_key_file=~/.ssh/id_rsa
Paso 3: Variables Globales
Configura variables en group_vars/all.yml:
---
nginx_version: latest
nginx_worker_processes: auto
nginx_worker_connections: 1024
nginx_keepalive_timeout: 65
nginx_client_max_body_size: 20M
nginx_sites:
- name: example.com
root: /var/www/example.com/html
index: index.html index.htm
port: 80
ssl: false
- name: api.example.com
root: /var/www/api
port: 443
ssl: true
ssl_certificate: /etc/ssl/certs/api.example.com.crt
ssl_certificate_key: /etc/ssl/private/api.example.com.key
proxy_pass: http://localhost:3000
Paso 4: Tasks del Rol Nginx
Crea las tareas en roles/nginx/tasks/main.yml:
---
- name: Actualizar caché de paquetes apt
ansible.builtin.apt:
update_cache: yes
cache_valid_time: 3600
when: ansible_os_family == "Debian"
- name: Instalar Nginx
ansible.builtin.apt:
name: nginx
state: "{{ 'latest' if nginx_version == 'latest' else 'present' }}"
notify: restart nginx
- name: Asegurar que Nginx esté habilitado y corriendo
ansible.builtin.service:
name: nginx
state: started
enabled: yes
- name: Crear directorios para sitios web
ansible.builtin.file:
path: "{{ item.root }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
loop: "{{ nginx_sites }}"
- name: Desplegar configuración principal de Nginx
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
validate: 'nginx -t -c %s'
notify: reload nginx
- name: Desplegar configuraciones de sitios virtuales
ansible.builtin.template:
src: site.conf.j2
dest: "/etc/nginx/sites-available/{{ item.name }}.conf"
owner: root
group: root
mode: '0644'
loop: "{{ nginx_sites }}"
notify: reload nginx
- name: Habilitar sitios creando enlaces simbólicos
ansible.builtin.file:
src: "/etc/nginx/sites-available/{{ item.name }}.conf"
dest: "/etc/nginx/sites-enabled/{{ item.name }}.conf"
state: link
loop: "{{ nginx_sites }}"
notify: reload nginx
- name: Deshabilitar sitio default de Nginx
ansible.builtin.file:
path: /etc/nginx/sites-enabled/default
state: absent
notify: reload nginx
- name: Validar sintaxis de configuración de Nginx
ansible.builtin.command: nginx -t
register: nginx_test
changed_when: false
failed_when: nginx_test.rc != 0
Paso 5: Templates de Configuración
Crea el template roles/nginx/templates/nginx.conf.j2:
user www-data;
worker_processes {{ nginx_worker_processes }};
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections {{ nginx_worker_connections }};
use epoll;
multi_accept on;
}
http {
# Basic Settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout {{ nginx_keepalive_timeout }};
types_hash_max_size 2048;
client_max_body_size {{ nginx_client_max_body_size }};
include /etc/nginx/mime.types;
default_type application/octet-stream;
# SSL Settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
# Logging
access_log /var/log/nginx/access.log;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss
application/rss+xml font/truetype font/opentype
application/vnd.ms-fontobject image/svg+xml;
# Virtual Host Configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Crea el template roles/nginx/templates/site.conf.j2:
server {
listen {{ item.port }}{% if item.ssl | default(false) %} ssl http2{% endif %};
server_name {{ item.name }};
root {{ item.root }};
index {{ item.index | default('index.html') }};
{% if item.ssl | default(false) %}
# SSL Configuration
ssl_certificate {{ item.ssl_certificate }};
ssl_certificate_key {{ item.ssl_certificate_key }};
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
# Security Headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
{% endif %}
{% if item.proxy_pass is defined %}
# Reverse Proxy Configuration
location / {
proxy_pass {{ item.proxy_pass }};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
{% else %}
# Static Site Configuration
location / {
try_files $uri $uri/ =404;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
{% endif %}
# Logs
access_log /var/log/nginx/{{ item.name }}_access.log;
error_log /var/log/nginx/{{ item.name }}_error.log;
}
Paso 6: Handlers
Define handlers en roles/nginx/handlers/main.yml:
---
- name: restart nginx
ansible.builtin.service:
name: nginx
state: restarted
- name: reload nginx
ansible.builtin.service:
name: nginx
state: reloaded
Paso 7: Playbook Principal
Crea el playbook principal site.yml:
---
- name: Desplegar y configurar Ansible Nginx en servidores web
hosts: webservers
become: yes
roles:
- nginx
post_tasks:
- name: Verificar que Nginx responde en puerto 80
ansible.builtin.uri:
url: "http://{{ ansible_default_ipv4.address }}"
status_code: 200
register: nginx_check
retries: 3
delay: 5
until: nginx_check.status == 200
Paso 8: Ejecutar el Playbook
Ejecuta el playbook de Ansible Nginx:
# Verificar sintaxis
ansible-playbook site.yml --syntax-check
# Modo dry-run (check mode)
ansible-playbook -i inventory/hosts.ini site.yml --check
# Ejecución real
ansible-playbook -i inventory/hosts.ini site.yml
# Con verbosidad para debugging
ansible-playbook -i inventory/hosts.ini site.yml -vvv
Output esperado:
PLAY [Desplegar y configurar Ansible Nginx en servidores web] *****************
TASK [Gathering Facts] *********************************************************
ok: [web1.example.com]
ok: [web2.example.com]
TASK [nginx : Actualizar caché de paquetes apt] *******************************
ok: [web1.example.com]
ok: [web2.example.com]
TASK [nginx : Instalar Nginx] **************************************************
changed: [web1.example.com]
changed: [web2.example.com]
TASK [nginx : Asegurar que Nginx esté habilitado y corriendo] *****************
ok: [web1.example.com]
ok: [web2.example.com]
PLAY RECAP *********************************************************************
web1.example.com : ok=12 changed=4 unreachable=0 failed=0
web2.example.com : ok=12 changed=4 unreachable=0 failed=0
Configurar Ansible Nginx con Variables Avanzadas
La potencia de Ansible Nginx radica en su capacidad de parametrizar configuraciones mediante variables. Veamos técnicas avanzadas para gestionar entornos complejos.
Variables por Entorno
Crea archivos de variables separados por entorno:
# group_vars/production.yml
nginx_worker_processes: 4
nginx_worker_connections: 2048
nginx_client_max_body_size: 50M
# group_vars/staging.yml
nginx_worker_processes: 2
nginx_worker_connections: 1024
nginx_client_max_body_size: 20M
Ejecuta con el entorno específico:
ansible-playbook -i inventory/production site.yml
ansible-playbook -i inventory/staging site.yml
Gestión de Secretos con Ansible Vault
Cifra credenciales y certificados SSL:
# Crear archivo cifrado
ansible-vault create group_vars/vault.yml
# Contenido de vault.yml
---
ssl_certificate_content: |
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKZ...
-----END CERTIFICATE-----
ssl_private_key_content: |
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhki...
-----END PRIVATE KEY-----
Ejecutar con vault:
ansible-playbook -i inventory/hosts.ini site.yml --ask-vault-pass
Inventarios Dinámicos
Para infraestructuras cloud con servidores dinámicos, utiliza inventarios dinámicos. Si gestionas infraestructura en AWS con Terraform AWS EC2, puedes integrar el inventario dinámico de AWS:
# inventory/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
filters:
tag:Role: webserver
instance-state-name: running
keyed_groups:
- key: tags.Environment
prefix: env
Ejecutar con inventario dinámico:
ansible-playbook -i inventory/aws_ec2.yml site.yml
Gestión Avanzada con Ansible Nginx
Profundicemos en casos de uso avanzados de Ansible Nginx para escenarios de producción.
Automatización de SSL con Let’s Encrypt
Integra certificados SSL automáticos con Certbot:
- name: Instalar Certbot
ansible.builtin.apt:
name:
- certbot
- python3-certbot-nginx
state: present
- name: Obtener certificado Let's Encrypt
ansible.builtin.command:
cmd: >
certbot --nginx
--non-interactive
--agree-tos
--email [email protected]
-d {{ item.name }}
creates: "/etc/letsencrypt/live/{{ item.name }}/fullchain.pem"
loop: "{{ nginx_sites }}"
when: item.ssl | default(false)
- name: Configurar renovación automática
ansible.builtin.cron:
name: "Renovar certificados Let's Encrypt"
minute: "0"
hour: "3"
job: "certbot renew --quiet && systemctl reload nginx"
Balanceo de Carga y High Availability
Configura Ansible Nginx como balanceador de carga:
# group_vars/all.yml
nginx_upstream_backends:
- name: backend_api
servers:
- 192.168.1.20:3000 weight=3
- 192.168.1.21:3000 weight=2
- 192.168.1.22:3000 backup
method: least_conn
# Template site.conf.j2
upstream {{ item.upstream.name }} {
{{ item.upstream.method }};
{% for server in item.upstream.servers %}
server {{ server }};
{% endfor %}
}
server {
listen 443 ssl http2;
server_name {{ item.name }};
location / {
proxy_pass http://{{ item.upstream.name }};
proxy_next_upstream error timeout http_502 http_503;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
Rate Limiting y Protección DDoS
Implementa rate limiting con Ansible Nginx:
# nginx.conf.j2
http {
# Rate limiting zones
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=general_limit:10m rate=100r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# Configuraciones de rate limit por sitio
include /etc/nginx/sites-enabled/*;
}
# site.conf.j2
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_conn conn_limit 10;
proxy_pass http://backend_api;
}
Monitorización y Logging
Habilita el módulo de estadísticas de Nginx:
- name: Configurar Nginx stub_status
ansible.builtin.blockinfile:
path: /etc/nginx/sites-available/monitoring.conf
create: yes
block: |
server {
listen 127.0.0.1:8080;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
notify: reload nginx
Integra logs con stack ELK o exporta métricas a Prometheus. Para monitorización completa de infraestructura, puedes combinar con Uptime Kuma para alertas de disponibilidad.
Optimización y Best Practices de Ansible Nginx
Aplica estas mejores prácticas para maximizar la eficiencia de Ansible Nginx en producción.
Seguridad
- Principio de mínimo privilegio: Ejecuta Nginx como usuario www-data sin privilegios de root
- Ocultar versión de Nginx: Añade
server_tokens off;en nginx.conf - Headers de seguridad: Implementa CSP, X-Frame-Options, HSTS
- Validación de configuración: Siempre usa
validate: 'nginx -t -c %s'en módulos template - Certificados robustos: TLS 1.2+ únicamente, deshabilita protocolos obsoletos
- Logs de auditoría: Centraliza logs de acceso y errores con syslog o agregadores
Rendimiento
- Worker processes: Configura
worker_processes auto;para detectar CPUs automáticamente - Keepalive connections: Aumenta
keepalive_timeouta 65s para reducir overhead de conexiones - Compresión gzip: Habilita gzip con nivel 6 para balance compresión/CPU
- Caché de archivos estáticos: Configura
open_file_cachepara reducir I/O de disco - Buffer sizes: Ajusta
client_body_buffer_sizeyclient_header_buffer_sizesegún tu carga
# Optimización de rendimiento en nginx.conf.j2
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
# File cache
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Buffer optimization
client_body_buffer_size 128k;
client_max_body_size 50m;
client_header_buffer_size 1k;
large_client_header_buffers 4 16k;
}
Mantenimiento
- Versionado con Git: Almacena todos los playbooks, roles y templates en repositorio Git
- Testing con Molecule: Implementa tests automatizados de roles Ansible
- Documentación inline: Comenta tareas complejas con
# Comentarios explicativos - Tags para ejecuciones parciales: Añade tags a tareas para ejecutar solo subconjuntos
- Rollback strategy: Mantén backups de configuraciones con
backup: yesen templates - Notificaciones: Integra webhooks a Slack/Teams cuando ocurran cambios
# Ejemplo de tags
- name: Instalar Nginx
ansible.builtin.apt:
name: nginx
state: present
tags:
- nginx
- install
- name: Configurar SSL
ansible.builtin.template:
src: ssl.conf.j2
dest: /etc/nginx/ssl.conf
tags:
- nginx
- ssl
- config
# Ejecutar solo tareas de SSL
ansible-playbook site.yml --tags ssl
Idempotencia Garantizada
Asegura que tu playbook de Ansible Nginx sea completamente idempotente:
- Usa
state: presenten lugar de comandos imperativos - Implementa
createsen módulos command/shell cuando sea necesario - Valida cambios con
changed_whenyfailed_when - Utiliza
check_mode: yespara verificar impacto antes de ejecutar
- name: Generar clave DH para SSL
ansible.builtin.command:
cmd: openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
creates: /etc/ssl/certs/dhparam.pem
notify: reload nginx
Troubleshooting Ansible Nginx
Soluciones a errores comunes al trabajar con Ansible Nginx.
Error: «nginx: [emerg] bind() to 0.0.0.0:80 failed»
Causa: Otro proceso (Apache, otro Nginx) está usando el puerto 80/443.
Solución:
# Verificar qué proceso usa el puerto
sudo lsof -i :80
sudo netstat -tulpn | grep :80
# Detener servicio conflictivo
sudo systemctl stop apache2
# Reintentar playbook
ansible-playbook site.yml
Error: «nginx: configuration file /etc/nginx/nginx.conf test failed»
Causa: Sintaxis incorrecta en templates Jinja2 o configuración Nginx.
Solución:
# Validar configuración manualmente en el servidor
ssh user@server
sudo nginx -t
# Ver detalles del error
sudo nginx -t 2>&1 | grep -A 5 "emerg"
# Validar template localmente antes de desplegar
ansible-playbook site.yml --check --diff
Error: «502 Bad Gateway»
Causa: El backend especificado en proxy_pass no responde o no está disponible.
Solución:
# Verificar que el backend esté activo
curl http://localhost:3000
# Revisar logs de Nginx
sudo tail -f /var/log/nginx/error.log
# Añadir timeouts en proxy_pass
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
Error: «Permission denied» al escribir configuración
Causa: Usuario de Ansible no tiene privilegios sudo.
Solución:
# Asegurar que playbook use become: yes
- name: Configurar Nginx
hosts: webservers
become: yes # ← CRÍTICO
# O configurar NOPASSWD en sudoers del servidor
echo "ansible_user ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/ansible
Error: Handlers no se ejecutan
Causa: El nombre del handler en notify no coincide exactamente con el definido en handlers/main.yml.
Solución:
# Verificar que los nombres sean idénticos
# tasks/main.yml
notify: reload nginx # ← debe coincidir
# handlers/main.yml
- name: reload nginx # ← exactamente igual (case-sensitive)
# Forzar ejecución de handlers
ansible-playbook site.yml --force-handlers
Conclusión
Ansible Nginx transforma la gestión manual y propensa a errores de servidores web en un proceso automatizado, reproducible y escalable. Al implementar infraestructura como código con Ansible, garantizas configuraciones consistentes en toda tu flota de servidores, reduces drásticamente el tiempo de despliegue y minimizas riesgos operacionales.
Los playbooks que hemos construido en esta guía cubren desde instalaciones básicas hasta configuraciones enterprise con SSL automático, balanceo de carga, rate limiting y monitorización. La combinación de templates Jinja2, variables parametrizadas y roles reutilizables te permite adaptar estos ejemplos a cualquier arquitectura.
Los próximos pasos recomendados son: integrar testing con Molecule, implementar CI/CD para despliegues automáticos mediante pipelines GitLab CI o GitHub Actions, explorar Ansible AWX para gestión centralizada con interfaz web, y combinar con herramientas de orquestación como Ansible Kubernetes para arquitecturas de microservicios.
Recuerda siempre validar configuraciones con nginx -t antes de aplicar cambios, mantener backups de configuraciones críticas, y documentar decisiones de diseño en tu repositorio Git. La automatización efectiva no solo acelera despliegues, sino que también mejora la seguridad y confiabilidad de tus sistemas.
FAQ sobre Ansible Nginx
¿Qué versión de Ansible necesito para gestionar Nginx?
Se recomienda Ansible 2.9 o superior, aunque la versión 2.14+ es preferible por incluir mejoras en módulos de gestión de paquetes y templates. Los ejemplos de esta guía son compatibles con Ansible 2.9+.
¿Es idempotente el playbook de Ansible Nginx?
Sí, todos los playbooks presentados son completamente idempotentes. Puedes ejecutarlos múltiples veces sin efectos secundarios, Ansible solo aplicará cambios cuando detecte diferencias entre el estado actual y el deseado.
¿Cómo gestiono secretos y certificados SSL con Ansible Vault?
Utiliza ansible-vault create para cifrar archivos con credenciales, luego referéncialos en tus playbooks. Ejecuta con --ask-vault-pass o usa --vault-password-file para automatización en CI/CD.
¿Puedo usar roles de Ansible Galaxy para Nginx?
Sí, roles como geerlingguy.nginx ofrecen configuraciones preempaquetadas. Instálalos con ansible-galaxy install geerlingguy.nginx y personalízalos mediante variables. Sin embargo, crear roles propios te da control total sobre configuraciones específicas.
¿Cómo testeo playbooks antes de ejecutarlos en producción?
Usa tres estrategias: --check para dry-run sin aplicar cambios, --diff para ver diferencias de archivos, y Molecule para testing automatizado en contenedores o VMs temporales antes de despliegue real.
