Ich habe einen einzelnen von Ansible bereitgestellten Server, auf dem mehrere Websites ausgeführt werden.
Meine Ansible-Aufgaben sehen ungefähr so aus:
- 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
Ich möchte den validate
Parameter für das Vorlagenmodul von Ansible verwenden, um aufzurufen nginx -t
und sicherzustellen, dass meine neuen Konfigurationen syntaktisch gültig sind. Es funktioniert für die Haupt-nginx.conf:
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0444
validate="/usr/sbin/nginx -c %s -t"
Es scheint jedoch keine Änderungen an den ortsspezifischen Konfigurationsdateien zu erfassen. Das Einfügen validate
der ortsspezifischen Vorlagen funktioniert nicht, da sie in eine http
Direktive eingeschlossen werden müssen, um gültig zu sein.
Was kann ich tun, um die Gültigkeit dieser ortsspezifischen Dateien zu überprüfen?
Es ist nicht sinnvoll,
validate
eine in Ihrer Nginx-Hauptkonfigurationsdatei enthaltene Datei direkt aufzurufen, da die Gültigkeit von Anweisungen in einer bestimmten Konfigurationsdatei möglicherweise vom Rest Ihrer Konfigurationsdateien abhängt (z. B. haben Sie zwei Konfigurationsdateien, die denselben Serverblock deklarieren usw).Sie müssen immer
nginx -t
die Hauptkonfigurationsdatei und nicht einen ihrer Unterabschnitte aufrufen, wenn Sie die Konfigurationsänderung eines Nginx überprüfen möchten.quelle
Ich habe einen ähnlichen Ansatz wie die akzeptierte Antwort verwendet, wobei die Bedenken der anderen Antwort berücksichtigt wurden.
Ich habe diesen Kern für diesen Zweck erstellt.
Die Idee ist, das gesamte
/etc/nginx
Verzeichnis in ein temporäres Verzeichnis zu kopieren , eine Datei aus dem%s
Parameter zu ändern und die Hauptkonfiguration von nginx auf Probleme zu testen. Wenn Sie davon ausgehen, dass die Nginx-Konfiguration anfangs gültig ist und alle Aufgaben, die die Nginx-Konfiguration ändern, diese zur Validierung verwenden, gibt es vermutlich kein Problem.Als Einzeiler würde es so aussehen:
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'
quelle
Hier ist eine einfachere Methode, die zumindest mit Ansible 2.5 funktioniert:
Es führt das Äquivalent von aus
sudo nginx -t
und überprüft seine Ausgabe. Wenn in der nginx-Konfiguration ein Fehler auftritt, wird ein Wert ungleich Null zurückgegeben, und die Ansible-Task würde error (changed_when
) ausführen .Wenn Sie Nginx als Benutzer installiert haben, entfernen Sie einfach das
become
, obwohl ich denke, dass es auch damit noch funktionieren würde.quelle
template
Modul und die Validierungsoption in Ansible verwenden, haben Sie eine Garantie für die Gültigkeit der Konfiguration. Wenn Sie jedoch die Vorlage bereitstellen und dann manuell prüfen und fehlschlagen, haben Sie immer noch das Problem, dass eine ungültige Vorlage wurde bereitgestellt und muss nicht zurückgesetzt werden.