Überprüfen Sie die Datei nginx.conf während der ansiblen Bereitstellung

11

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 validateParameter für das Vorlagenmodul von Ansible verwenden, um aufzurufen nginx -tund 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 validateder ortsspezifischen Vorlagen funktioniert nicht, da sie in eine httpDirektive eingeschlossen werden müssen, um gültig zu sein.

Was kann ich tun, um die Gültigkeit dieser ortsspezifischen Dateien zu überprüfen?

Erin Call
quelle

Antworten:

9

Sie können dort einen Trick machen und platzierte Dateien wie (Idee von https://gist.github.com/psd/5042334 entlehnt ) validieren : validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'

Hubbitus
quelle
das funktioniert tatsächlich, upvote!
13dimitar
4

Es ist nicht sinnvoll, validateeine 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 -tdie Hauptkonfigurationsdatei und nicht einen ihrer Unterabschnitte aufrufen, wenn Sie die Konfigurationsänderung eines Nginx überprüfen möchten.

Xavier Lucas
quelle
1
OK. Also muss ich wohl ansible überzeugen, alles für die Validierung in einem Schlag zu bündeln?
Erin Call
@ErinCall Idealerweise sollte Ihre Nginx-Konfiguration auch dann vollständig gültig bleiben, wenn Ihr Playbook teilweise unterbrochen ist.
Michael Hampton
3

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/nginxVerzeichnis in ein temporäres Verzeichnis zu kopieren , eine Datei aus dem %sParameter 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'

jadkik94
quelle
1
Ich brauchte diese Lösung anstelle der akzeptierten Antwort, da meine nginx conf fastcgi_params enthielt.
Yep_It's_Me
3

Hier ist eine einfachere Methode, die zumindest mit Ansible 2.5 funktioniert:

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

Es führt das Äquivalent von aus sudo nginx -tund ü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.

Juha Untinen
quelle
1
Dies ist ein schlechtes Beispiel. Wenn Sie das templateModul 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.
Rabin