Convalida nginx.conf durante la distribuzione ansible


11

Ho un unico server con provisioning Ansible che esegue un numero di siti.

Le mie attività Ansible assomigliano approssimativamente a:

- 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

Vorrei usare il validateparametro per il modulo template di Ansible per chiamare nginx -te assicurarmi che le mie nuove configurazioni siano sintatticamente valide. Funziona con il nginx.conf principale:

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
            validate="/usr/sbin/nginx -c %s -t"

Ma non sembra rilevare le modifiche ai file di configurazione specifici del sito. L'inserimento validatedei modelli specifici del sito non funziona, poiché devono essere racchiusi in una httpdirettiva per essere validi.

Cosa posso fare per verificare la validità di questi file specifici del sito?

Risposte:


9

Puoi fare qualche trucco e convalidare il file inserito come (idea presa in prestito da https://gist.github.com/psd/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'


funziona davvero, voto positivo!
13

4

Non ha senso chiamare direttamente validateun file incluso nel file di configurazione principale di nginx poiché la validità delle direttive in un determinato file di configurazione può dipendere dal resto dei file di configurazione (ad esempio, hai due file di configurazione che dichiarano lo stesso blocco server eccetera).

È sempre necessario chiamare nginx -til file di configurazione principale e non uno dei suoi sottoparti ogni volta che si desidera convalidare qualsiasi modifica alla configurazione di nginx.


1
Ok. Quindi immagino di dover convincere Ansible a raggruppare tutto per la convalida in un unico colpo?
Erin Chiama il

@ErinCall Idealmente la tua configurazione nginx dovrebbe rimanere completamente valida anche se il tuo playbook viene interrotto a metà.
Michael Hampton,

3

Ho usato un approccio simile alla risposta accettata tenendo conto delle preoccupazioni dell'altra risposta.

Ho creato questa idea per quello scopo.

L'idea è di copiare l'intera /etc/nginxdirectory in una directory temporanea, cambiare uno dei file dal %sparametro e testare la configurazione principale di nginx per i problemi. Se supponi che inizialmente la configurazione di nginx sia valida e che tutte le attività che modificano la configurazione di nginx lo utilizzino per convalidare, allora suppongo che non ci sarebbero problemi.

Come una fodera sarebbe simile a questo:

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
Avevo bisogno di questa soluzione anziché della risposta accettata perché la mia conf di nginx includeva fastcgi_params.
Yep_It's_Me

3

Ecco un modo più semplice che funziona almeno con Ansible 2.5:

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

Esegue l'equivalente di sudo nginx -te controlla il suo output. Se si verifica un errore nella configurazione di nginx, viene restituito un valore diverso da zero e l'attività Ansible avrebbe un errore ( changed_when).

Se hai installato Nginx come utente, rimuovi semplicemente become, anche se penso che funzionerebbe ancora anche con esso.


1
Questo è un cattivo esempio, quando si utilizza il templatemodulo e l'opzione di convalida in Ansible si ha una garanzia per la validità della configurazione, ma se si distribuisce il modello e quindi si verifica e fallisce manualmente, si ha ancora il problema che un invalido il modello è stato distribuito e non è necessario ripristinarlo.
Rabin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.