web-dev-qa-db-ja.com

SaltStack:状態を1度だけ実行できる方法は?

状態を実行する必要があるのは1回だけです。これを行う簡単な方法が見つかりませんでした。

さて、コンテキスト

2つのMySQLサーバーをsalt経由でインストールします。私は一方を他方の奴隷にしたいのです。

スレーブをセットアップするには、マスターインストールの最後にマスターステータス情報を取得する必要があります。

SHOW MASTER STATUS;

これで、mysql.query関数を実行するカスタム状態を使用して取得できます。

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

しかし、私のサーバーでハイステートが実行されるたびに実行されます。したがって、毎回異なるマスター情報を提供します。

フラグとしてファイルの存在を使用しようとしました:

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

それは機能していますが、毎回2つの障害状態になっているので、私は不満でした。

私のカスタムソリューション

mystateflagの新しいパラメーターで終了しました。最初に実行されたときにフラグファイルが作成され、ファイルが存在する場合は成功して返されます。

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

そして再び質問

それでも、状態を1回だけ実行するかどうか、またその方法を知りたいのです。

MySQLの状態が以前に実行されたかどうかを示す細分をミニオンに設定できます。これをあなたの州に追加してください:

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

その後、ifステートメントの間に1回だけ実行したい状態をラップできます。

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

この方法の利点は、MySQLマスターであるミニオンも追跡できるようになることです。欠点は、情報が失われないように穀物に目を離さないことです。

15
Denis Witt

私は、この状態を別の状態ファイル(mysql_master_status.sls)に入れ、top.slsでそれを参照しないのが最も簡単な方法だと思います。代わりに、salt 'target' state.sls mysql_master_statusを使用してこの状態を1回実行します。

トーマス

2