SaltStack: Wie kann man einen Zustand nur einmal ausführen?

7

Ich muss einen Zustand nur einmal ausführen. Ich konnte keinen einfachen Weg finden, dies zu tun.

Nun zum Kontext

Ich installiere zwei MySQL-Server über Salt. Ich möchte einen zum Sklaven des anderen machen.

Um den Slave einzurichten, muss ich am Ende der Master-Installation die Master-Statusinformationen erhalten:

SHOW MASTER STATUS;

Jetzt kann ich einen benutzerdefinierten Status verwenden, der die mysql.queryFunktion ausführt , um sie abzurufen.

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS

Es wird jedoch jedes Mal ausgeführt, wenn der Highstate für meinen Server ausgeführt wird. So geben Sie jedes Mal andere Stamminformationen.

Ich habe versucht, eine Dateiexistenz als Flag zu verwenden:

/tmp/only_once:
  file.missing: []
mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - require:
      - file: /tmp/only_once

Es funktioniert, aber ich war nicht glücklich, da ich jetzt jedes Mal zwei fehlerhafte Zustände habe.

Meine benutzerdefinierte Lösung

Ich endete mit einem neuen Parameter für mystate, der bei flagder ersten Ausführung eine Flag-Datei erstellt und mit Erfolg zurückgibt, wenn die Datei vorhanden ist:

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - flag:  /tmp/only_once

Und nochmal die Frage

Trotzdem würde ich gerne wissen, ob und wie man einen Zustand nur einmal ausführen würde.

Christophe Drevet-Droguet
quelle

Antworten:

15

Sie können dem Minion ein Korn setzen, das angibt, ob der MySQL-Status zuvor ausgeführt wurde. Fügen Sie dies einfach Ihrem Bundesstaat hinzu:

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
  grains.present:
    - name: mysql
    - value: master

Dann können Sie Dinge in Ihrem Bundesstaat einschließen, die Sie nur einmal zwischen einer if-Anweisung ausführen möchten:

{% if salt['grains.get']('mysql') != 'master' %}
...
{% endif %}

Der Vorteil dieser Methode ist, dass Sie jetzt auch Ihre Minions verfolgen können, die MySQL-Master sind. Der Nachteil ist, dass Sie Ihre Körner im Auge behalten müssen, damit die Informationen nicht verloren gehen.

Denis Witt
quelle
An diesem Punkt scheint es die beste Lösung zu sein.
Christophe Drevet-Droguet
2

Ich denke, der einfachste Weg wäre, diesen Status in eine andere Statusdatei (mysql_master_status.sls) zu verschieben und ihn nicht in der Datei top.sls zu referenzieren. Stattdessen führen Sie diesen Status einmal mit salt 'target' state.sls mysql_master_status aus

Thomas

Thomas Werkmeister
quelle
Ja, aber ich wollte dies ohne manuelle Interaktion tun. Mein letztendliches Ziel wäre es, sowohl den Master- als auch den Slave-MySQL-Server mit Salt zu erstellen und die Replikation automatisch zu starten, wobei Daten verwendet werden, die durch den Status "einmal ausgeführt" auf dem Master angegeben werden. Vielen Dank für Ihre Antwort.
Christophe Drevet-Droguet