状態を実行する必要があるのは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つの障害状態になっているので、私は不満でした。
mystate
、flag
の新しいパラメーターで終了しました。最初に実行されたときにフラグファイルが作成され、ファイルが存在する場合は成功して返されます。
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マスターであるミニオンも追跡できるようになることです。欠点は、情報が失われないように穀物に目を離さないことです。
私は、この状態を別の状態ファイル(mysql_master_status.sls)に入れ、top.slsでそれを参照しないのが最も簡単な方法だと思います。代わりに、salt 'target' state.sls mysql_master_statusを使用してこの状態を1回実行します。
トーマス