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?

Erin Call
fuente

Respuestas:

9

Puede hacer algún truco y validar el archivo colocado como (idea tomada de https://gist.github.com/psd/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'

Hubbitus
fuente
esto realmente funciona, ¡vota a favor!
13dimitar
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.

Xavier Lucas
fuente
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'

jadkik94
fuente
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.

Juha Untinen
fuente
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