Valide nginx.conf durante la implementación ansible


11

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 validateparámetro del módulo de plantilla de Ansible para llamar nginx -ty 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 validateen las plantillas específicas del sitio no funciona, ya que deben incluirse en una httpdirectiva para que sean válidas.

¿Qué puedo hacer para verificar la validez de estos archivos específicos del sitio?

Respuestas:



4

No tiene sentido llamar directamente validatea 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 -tel archivo de configuración principal y no uno de su subparte cuando desee validar cualquier cambio de configuración de nginx.


1
Okay. Entonces, ¿creo que necesito convencer a ansible de agrupar todo para validarlo de una vez?
Erin llama el

@ErinCall Idealmente, su configuración nginx debería seguir siendo completamente válida, incluso si su libro de jugadas se interrumpe a la mitad.
Michael Hampton

3

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/nginxdirectorio en un directorio temporal, cambiar uno del archivo del %spará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'


1
Necesitaba esta solución en lugar de la respuesta aceptada porque mi nginx conf incluía fastcgi_params.
Sip_It's_Me

3

Aquí hay una forma más directa que funciona al menos con Ansible 2.5:

- name: Verify Nginx config
  become: yes
  command: nginx -t
  changed_when: false

Ejecuta el equivalente de sudo nginx -ty 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.


1
Este es un mal ejemplo, cuando usa el templatemó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.
Rabin el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.