Tengo un único servidor con aprovisionamiento de Ansible que ejecuta varios sitios.
Mis tareas de Ansible se ven más o menos así:
- name: site nginx config
template: src="nginx-site.conf.j2" dest=/etc/nginx/conf.d/{{item.name}}.conf
owner=root group=root mode=0444
with_items: sites
notify: restart nginx
- name: nginx conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0444
notify: restart nginx
Me gustaría usar el validate
parámetro del módulo de plantilla de Ansible para llamar nginx -t
y asegurarme de que mis nuevas configuraciones sean sintácticamente válidas. Funciona para el nginx.conf principal:
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0444
validate="/usr/sbin/nginx -c %s -t"
Pero no parece captar cambios en los archivos de configuración específicos del sitio. Poner validate
en las plantillas específicas del sitio no funciona, ya que deben incluirse en una http
directiva para que sean válidas.
¿Qué puedo hacer para verificar la validez de estos archivos específicos del sitio?
No tiene sentido llamar directamente
validate
a un archivo incluido en su archivo de configuración principal nginx porque la validez de las directivas en un archivo de configuración particular puede depender del resto de sus archivos de configuración (por ejemplo, tiene dos archivos de configuración que declaran el mismo bloque de servidor etc)Siempre debe invocar
nginx -t
el archivo de configuración principal y no uno de su subparte cuando desee validar cualquier cambio de configuración de nginx.fuente
Utilicé un enfoque similar a la respuesta aceptada teniendo en cuenta las preocupaciones de la otra respuesta.
He creado este GIST para ese propósito.
La idea es copiar todo el
/etc/nginx
directorio en un directorio temporal, cambiar uno del archivo del%s
parámetro y probar la configuración principal de nginx para detectar problemas. Si supone que inicialmente la configuración de nginx es válida y todas las tareas que modifican la configuración de nginx la usan para validar, entonces supongo que no habría ningún problema.Como un trazador de líneas se vería así:
validate: bash -c 'NGINX_CONF_DIR=`mktemp -d`; cp -rTp /etc/nginx/ "$NGINX_CONF_DIR" && cp -Tp %s "$NGINX_CONF_DIR"/sites-enabled/new-site.conf && nginx -t -c "$NGINX_CONF_DIR"/nginx.conf'
fuente
Aquí hay una forma más directa que funciona al menos con Ansible 2.5:
Ejecuta el equivalente de
sudo nginx -t
y verifica su salida. Si hay un error en la configuración de nginx, devuelve un valor distinto de cero y la tarea Ansible generaría un error (changed_when
).Si instaló Nginx como usuario, simplemente elimine el
become
, aunque creo que aún funcionaría incluso con él.fuente
template
módulo y la opción de validación en Ansible, tiene una garantía para la validez de la configuración, pero si implementa la plantilla y luego realiza una verificación manual y falla, aún tiene el problema de que no es válido La plantilla se implementó y no es necesario revertirla.