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?

Erin Call
la source

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; }"'

Hubbitus
la source
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.

Xavier Lucas
la source
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'

jadkik94
la source
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.

Juha Untinen
la source
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