2016-05-03 3 views
1

Ich habe vor kurzem einen Salz-Status geschrieben, die die Nginx-Konfiguration für eine Reihe von Servern aus einigen statischen Variablen in der Säule behandelt. Ich wollte dies auf allen Servern ausrollen, aber bevor ich das tat, wollte ich sicherstellen, bevor die Konfiguration auf einem Server angewendet wird, der zuerst getestet wurde.Reload Nginx Config von Salz-Zustand, nur wenn der Configtest

Nginx hat einen eingebauten conftest, den ich häufig in der Befehlszeile verwende, und ich fand, dass salt ein nginx-Modul hat, das verwendet werden kann, um conftetest auszuführen.

Ich habe folgendes in meiner Statusdatei:

reload-nginx: 
    service.running: 
    - enabled: True 
    - reload: True 
    - watch: 
     - pkg: nginx 
     - file: /etc/nginx/sites-available/* 
     - file: /etc/nginx/nginx.conf 

Dies sollte nginx nachladen, wenn die Konfigurationsdateien ändern oder wenn die nginx installieren aktualisiert wird/geändert. Ich glaube, ich kann einen Config-Test führt Sie die folgend in meiner Statusdatei (ungetestet) mit:

nginx-config-test: 
    module.run: 
    - name: nginx.configtest 

Und ich glaube, wenn ich diesen Zustand auf die Uhr in dem Reload-nginx Zustand hinzufügen, würde es neu zu laden, wenn die configtest weitergegeben .

Allerdings möchte ich das Nachladen nur geschehen, wenn eine der Konfigurationsdateien haben UND die Config-Test bestanden wird geändert, oder wenn nginx ändert UND die configtest Pässe. Ich sehe, dass ich onlyif verwenden kann, um einen Staat zu laufen, wenn ALLE der der Sachen wahr sind, und von der Erfahrung können Sie mehrfache Gebrauch der gleichen Methode haben (also kann ich 3 verschiedene onlyif nicht haben - korrigieren Sie mich, wenn ich falsch bin).

Aber ich sehe keine Möglichkeit, Nginx nur neu zu laden, wenn die Konfigurationsdateien geändert (oder Nginx wurde aktualisiert) und der Configtest bestanden hat.

Ist das möglich?

+1

ich meine Antwort aktualisiert haben; Es scheint, dass Sie module.wait anstelle von module.run verwenden müssen, damit die Eigenschaft watch wie erwartet funktioniert. Das erste Mal habe ich das nicht verstanden, tut mir leid. – Andrew

Antwort

1

Lassen Sie den Status "Neu laden" den Konfig-Test-Status anzeigen; Habe den Config-Test-Status und beobachte den Status der Konfigurationsdateien und den Status von pkg. Der Test wird nur ausgeführt, wenn sich etwas ändert, und das Neuladen findet nur statt, wenn der Test ausgeführt wird und ausgeführt wird.

Vorbehalt: Strukturell wird dies funktionieren, aber ich habe nginx.configtest nie verwendet, so kann ich nicht versprechen, es verhält sich so, wie Sie denken.

Sie müssen auch module.wait anstelle von module.run verwenden; Watch-Anweisungen funktionieren nicht mit .run. Referenz here.

Damit wird:

reload-nginx: 
    service.running: 
    - name: nginx 
    - enable: True 
    - reload: True 
    - watch: 
     - module: nginx-config-test 

nginx-config-test: 
    module.wait: 
    - name: nginx.configtest 
    - watch: 
     - file: /etc/nginx/sites-available/* 
+0

Danke, ich werde es versuchen! – Rumbles

+0

Vielen Dank für Ihren Vorschlag, ich habe die Frage mit dem, was ich gefunden habe, mit Ihrem Vorschlag aktualisiert. Ich bin mir nicht sicher, ob das, was ich mit der for-Schleife gemacht habe, dazu führt, dass der folgende Teil nicht funktioniert. Alle weiteren Vorschläge werden sehr geschätzt! – Rumbles

+0

Danke nochmal, ich werde das morgens versuchen! – Rumbles

Verwandte Themen