获取更新每个 Salt highstate 而不会因错误而导致 highstate 失败,而不是恢复为默认值

Fetching updates every Salt highstate without failing highstate on error, instead reverting to defaults

我有一个 systemd 服务 evil,其状态在 init.sls 中描述。此服务需要文件 /etc/evil/wicked.txt。此文件从联系服务器的 python 函数 fetch_darkness 获取更新,服务器的响应很少更改。

evil:
  pkg.installed:
    - name: {{ package_name }}
    - watch:
      - file: /etc/evil/wicked.txt
      - pkg: evil

/etc/evil/wicked.txt:
  file.managed:
    - contents: {{ salt.evil.fetch_darkness(grains['id'], pillar.node.hostname }} # this changes infrequently
    - show_changes: false
    - allow_empty: false
    - user: evil
    - group: evil
    - mode: 600
    - makedirs: true
    - require:
      - user: evil
    - watch_in:
      - service: evil

这会产生一个问题,因为每个高状态都会导致服务 evil 重新启动,即使文件 /etc/evil/wicked.txt 的实际内容没有改变,这是 99%时间。

因此下一个解决方案是创建一个 /etc/evil/wicked-temp.txt 未被 evil 监视的临时文件。 /etc/evil/wicked.txt 在更改时从 wicked-temp.txt 中提取其内容,这样 evil 仅在文件实际更新而不是每个高状态时重新启动:

evil:
  pkg.installed:
    - name: {{ package_name }}
    - watch:
      - file: /etc/evil/wicked.txt
      - pkg: evil

/etc/evil/wicked-temp.txt:
  file.managed:
    - contents: {{ salt.evil.fetch_darkness(grains['id'], pillar.node.hostname }} # this changes infrequently
    - show_changes: false
    - allow_empty: false
    - user: evil
    - group: evil
    - mode: 600
    - makedirs: true
    - require:
      - user: evil

/etc/evil/wicked.txt:
  file.managed:
    - source: /etc/evil/wicked-temp.txt
    - show_changes: false
    - allow_empty: false
    - user: evil
    - group: evil
    - mode: 600
    - makedirs: true
    - onchanges:
      - file: /etc/evil/wicked-temp.txt
    - require:
      - user: evil
    - watch_in:
      - service: evil

"rm /etc/evil/wicked-temp.txt":
  cmd.run:
    - onfail:
      - file: /etc/evil/wicked.txt

但是,现在的问题是,有几台服务器都处于高状态,而且很多时候 fetch_darkness 无法连接到主服务器,导致高状态失败 wicked.txt/wicked-temp.txt 无法填充。

这不太好,因为在 >99% 的时间里,服务器响应的内容不会改变。如果 wicked.txt 不存在,那么当然,高状态应该失败。但如果确实如此,那么我想继续使用文件中已经存在的任何内容 wicked.txt 而不是失败的高状态。

有没有办法解决这个问题:

  1. 除非文件内容发生变化,否则不得重新启动服务
  2. 文件必须提取更新
  3. 如果文件已经存在,Highstate 不能失败,但无法提取更新

编辑:我应该提到文件的内容每次都会改变。该文件是从中央服务器获取的随机生成的密钥,并附有特定标签,例如 1-xxxxxxx2-yyyyyy。然而,1-xxxxx1-zzzzzz 相同,即使实际内容不同,这就是为什么当 1-xxxxx 更改为 1-zzzzzevil 不应该重新启动,而只是当它变为 2-yyyyyyy.

您已经有一个执行提取的自定义模块,为什么不创建一个处理其余部分的自定义状态模块?通过这种方式,您可以确定文件是否实际更改,在更改时进行处理,并在提取不起作用时更正错误。

然而,在第一个示例中,它不应该执行任何触发文件更改的操作,除非文件中的某些内容确实发生了更改。您可能需要仔细检查文件中发生的变化。