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 validate
paramètre du module de modèle d'Ansible pour appeler nginx -t
et 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 validate
sur les modèles spécifiques au site ne fonctionne pas, car ils doivent être enveloppés dans une http
directive pour être valides.
Que puis-je faire pour vérifier la validité de ces fichiers spécifiques au site?
Cela n'a aucun sens d'appeler directement
validate
un 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 -t
au fichier de configuration principal et non à l'une de ses sous-parties lorsque vous souhaitez valider un changement de configuration de nginx.la source
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/nginx
répertoire dans un répertoire temporaire, de modifier un fichier du%s
paramè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'
la source
Voici un moyen plus simple qui fonctionne au moins avec Ansible 2.5:
Il exécute l'équivalent de
sudo nginx -t
et 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.la source
template
module 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é.