在变化的环境中,在Salt中清理动态状态

时间:2018-02-17 14:50:58

标签: salt-stack

根据某些颗粒/柱子值考虑一些动态状态形状。例如,Web服务器可以为调试端点添加其他站点定义:

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

这样可以正常工作,除非例如开发服务器改变其角色并成为高效的角色。没有剩下的状态,文件驻留在小兵身上。

我当然可以添加对应的

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

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

如何正确处理这些状态的更改以及最终清理已创建的工件,已安装的软件等?

1 个答案:

答案 0 :(得分:1)

实际上你在问:“Salt支持状态回滚吗?”

答案是否定的,但各州本身往往提供某种形式 “回滚”,例如file州可以restore backupdev - >发生prod从您的示例转换。

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

我同意添加这些令人讨厌的if s grains['dev']是丑陋的,但是 我看到了其他几个选项如何处理:

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

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