我只需执行一次状态。我找不到简单的方法来做到这一点。
现在,背景
我通过 salt 安装了两个 MySQL 服务器。我想让其中一个成为另一个的从属服务器。
为了设置从属设备,我需要在主设备安装结束时获取主设备状态信息:
SHOW MASTER STATUS;
现在,我可以使用自定义状态执行mysql.query
函数来获取它。
mysql_master_status:
mystate.query:
- query: SHOW MASTER STATUS
但是每次我的服务器执行 highstate 时它都会被执行。因此每次都会给出不同的主信息。
我尝试使用文件存在作为标志:
/tmp/only_once:
file.missing: []
mysql_master_status:
mystate.query:
- query: SHOW MASTER STATUS
- require:
- file: /tmp/only_once
它确实在运行,但我并不高兴,因为现在每次都会出现两种失败状态。
我的定制解决方案
我以一个新参数结束mystate
,flag
它在第一次执行时创建一个标志文件,如果该文件存在则返回成功:
mysql_master_status:
mystate.query:
- query: SHOW MASTER STATUS
- flag: /tmp/only_once
问题又来了
不过,我想知道是否以及如何只执行一次状态。
答案1
您可以在 minion 上设置一个 Grain,指示 MySQL-State 是否曾经运行过。只需将其添加到您的 State 中:
mysql_master_status:
mystate.query:
- query: SHOW MASTER STATUS
grains.present:
- name: mysql
- value: master
然后,您可以将只想在 if 语句之间运行一次的内容包装在您的状态中:
{% if salt['grains.get']('mysql') != 'master' %}
...
{% endif %}
这种方法的优点是,你现在还可以跟踪你的 Minions,他们是 MySQL-Master。缺点是,你必须时刻关注你的 Grain,以免信息丢失。
答案2
我认为最简单的方法是将此状态放入另一个状态文件 (mysql_master_status.sls),而不是在 top.sls 中引用它。相反,您可以使用 salt 'target' state.sls mysql_master_status 执行此状态一次
托马斯