SaltStack:如何才能只执行一次状态?

SaltStack:如何才能只执行一次状态?

我只需执行一次状态。我找不到简单的方法来做到这一点。

现在,背景

我通过 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

它确实在运行,但我并不高兴,因为现在每次都会出现两种失败状态。

我的定制解决方案

我以一个新参数结束mystateflag它在第一次执行时创建一个标志文件,如果该文件存在则返回成功:

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 执行此状态一次

托马斯

相关内容