Valider nginx.conf pendant le déploiement ansible


11

J'ai un seul serveur provisionné par Ansible exécutant un certain nombre de sites.

Mes tâches Ansible ressemblent à peu près à:

- 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

Je voudrais utiliser le validateparamètre du module de modèle d'Ansible pour appeler nginx -tet m'assurer que mes nouvelles configurations sont syntaxiquement valides. Cela fonctionne pour le 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"

Mais il ne semble pas récupérer les modifications apportées aux fichiers de configuration spécifiques au site. La mise validatesur les modèles spécifiques au site ne fonctionne pas, car ils doivent être enveloppés dans une httpdirective pour être valides.

Que puis-je faire pour vérifier la validité de ces fichiers spécifiques au site?

Réponses:


9

Vous pouvez y faire quelques trucs et valider le fichier placé comme (idée empruntée à https://gist.github.com/psd/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'


cela fonctionne réellement, vote positif!
13dimitar

4

Cela n'a aucun sens d'appeler directement validateun fichier inclus dans votre fichier de configuration principal nginx car la validité des directives dans un fichier de configuration particulier peut dépendre du reste de vos fichiers de configuration (par exemple, vous avez deux fichiers de configuration qui déclarent le même bloc serveur etc).

Vous devez toujours faire appel nginx -tau fichier de configuration principal et non à l'une de ses sous-parties lorsque vous souhaitez valider un changement de configuration de nginx.


1
D'accord. Donc je suppose que je dois convaincre ansible de tout regrouper pour validation dans un seul thwack?
Erin Call

@ErinCall Idéalement, votre configuration nginx devrait rester complètement valide même si votre playbook est interrompu à mi-chemin.
Michael Hampton

3

J'ai utilisé une approche similaire à la réponse acceptée en tenant compte des préoccupations de l'autre réponse.

J'ai créé cet essentiel à cet effet.

L'idée est de copier tout le /etc/nginxrépertoire dans un répertoire temporaire, de modifier un fichier du %sparamètre et de tester la configuration principale de nginx pour détecter les problèmes. Si vous supposez qu'au départ la configuration nginx est valide et que toutes les tâches qui modifient la configuration nginx l'utilisent pour valider, alors je suppose qu'il n'y aurait pas de problème.

En tant que doublure, cela ressemblerait à ceci:

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
J'avais besoin de cette solution au lieu de la réponse acceptée car ma conf nginx comprenait fastcgi_params.
Yep_It's_Me

3

Voici un moyen plus simple qui fonctionne au moins avec Ansible 2.5:

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

Il exécute l'équivalent de sudo nginx -tet vérifie sa sortie. S'il y a une erreur dans la configuration nginx, elle retourne non nulle et la tâche Ansible affichera error ( changed_when).

Si vous avez installé Nginx en tant qu'utilisateur, supprimez simplement le become, même si je pense que cela fonctionnerait toujours avec.


1
Ceci est un mauvais exemple, lorsque vous utilisez le templatemodule et l'option de validation dans Ansible, vous avez une garantie pour la validité de la configuration, mais si vous déployez le modèle et ensuite pour vérifier et échouer manuellement, vous avez toujours le problème qu'un invalide le modèle a été déployé et n'a pas besoin d'être annulé.
Rabin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.