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

Chr*_*uet 9 saltstack

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

现在,上下文

我通过 salt 安装了两个 MySQL 服务器。我想让一个人成为另一个人的奴隶。

为了设置从站,我需要在主站安装结束时获取主站状态信息:

SHOW MASTER STATUS;
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用执行mysql.query函数的自定义状态来获取它。

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
Run Code Online (Sandbox Code Playgroud)

但是每次为我的服务器执行 highstate 时它都会执行。从而每次都给出不同的主信息。

我尝试使用文件存在作为标志:

/tmp/only_once:
  file.missing: []
mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - require:
      - file: /tmp/only_once
Run Code Online (Sandbox Code Playgroud)

它正在工作,但我并不高兴,因为我现在每次都有两个失败的状态。

我的自定义解决方案

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

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - flag:  /tmp/only_once
Run Code Online (Sandbox Code Playgroud)

还有这个问题

不过,我想知道是否以及如何只执行一次状态。

小智 16

您可以在 minion 上设置一个粒度,指示 MySQL-State 之前是否运行过。只需将此添加到您的状态:

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
  grains.present:
    - name: mysql
    - value: master
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的 State 中包装你只想在 if 语句之间运行一次的东西:

{% if salt['grains.get']('mysql') != 'master' %}
...
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您现在还可以跟踪作为 MySQL 主控的 Minion。缺点是您必须密切注意您的谷物,以免信息丢失。