在 Salt 中为变化的环境结束动态状态

winding-up dynamic states in Salt for changed environments

考虑一些基于某些颗粒/支柱值的动态形状。例如,网络服务器可以为调试端点添加额外的站点定义:

{% if grains['dev'] %}
/etc/nginx/sites-enabled/logaccess.conf:
  file.managed:
    - source: salt://some/path/logaccess.conf
{% endif %}

这工作正常,除非开发服务器改变其角色并成为高效服务器。没有状态了,文件驻留在minion上。

我当然可以加一个对方

/etc/nginx/sites-enabled/logaccess.conf:
{% if grains['dev'] %}
  file.managed:
    - source: salt://some/path/logaccess.conf
{% else %}
  file.absent: []
{% endif %}

这是丑陋的,不适用于例如。包(不需要为特定状态安装软件并不总是它不需要另一个或故意手动安装)。

我如何正确处理这些状态的变化以及创建的工件、安装的软件等的最终结束?

其实你问的是:"does the Salt support state rollbacks?"

答案是否定的,但各州本身经常提供某种 "rollback",例如file 状态可以 restore backup 当您的示例发生 dev -> prod 转换时。

我从未尝试过这样的备份,而且它们仅适用于 file 州。

我同意添加这些讨厌的 ifs grains['dev'] 是丑陋的,但是 我看到了其他几个选项,您可以如何处理这个问题:

  1. 使用rector系统,检测例如通过单独的状态 minion 转换 (dev->prod) 并在发生这种情况时传播自定义事件。 适当地处理此事件(给定的已执行状态列表创建将恢复一些 minion 更改的状态)
  2. 也许(在这样的转变中)丢弃整个奴才并从头开始提供他是可行的。毕竟你有 自动配置管理 - 为什么不利用此功能并丢弃 minions(可选地备份数据)
  3. 编写自定义状态,包装原始状态但存储初始 minion 状态并提供回滚(例如,对于 pkg,您可以列出安装在 OS 上的初始包,并在回滚期间清除所有其他包)。不幸的是,我认为这并不容易甚至不可能

<crazy>
如果 minion 使用提供快照的文件系统(如 btrfs),您可以尝试在转换事件
时将快照恢复到某个 initial/different 状态 </crazy>

如果我是你,我会选择 1)