获取更新每个 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
而不是失败的高状态。
有没有办法解决这个问题:
- 除非文件内容发生变化,否则不得重新启动服务
- 文件必须提取更新
- 如果文件已经存在,Highstate 不能失败,但无法提取更新
编辑:我应该提到文件的内容每次都会改变。该文件是从中央服务器获取的随机生成的密钥,并附有特定标签,例如 1-xxxxxxx
或 2-yyyyyy
。然而,1-xxxxx
与 1-zzzzzz
相同,即使实际内容不同,这就是为什么当 1-xxxxx
更改为 1-zzzzz
时 evil
不应该重新启动,而只是当它变为 2-yyyyyyy
.
您已经有一个执行提取的自定义模块,为什么不创建一个处理其余部分的自定义状态模块?通过这种方式,您可以确定文件是否实际更改,在更改时进行处理,并在提取不起作用时更正错误。
然而,在第一个示例中,它不应该执行任何触发文件更改的操作,除非文件中的某些内容确实发生了更改。您可能需要仔细检查文件中发生的变化。
我有一个 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
而不是失败的高状态。
有没有办法解决这个问题:
- 除非文件内容发生变化,否则不得重新启动服务
- 文件必须提取更新
- 如果文件已经存在,Highstate 不能失败,但无法提取更新
编辑:我应该提到文件的内容每次都会改变。该文件是从中央服务器获取的随机生成的密钥,并附有特定标签,例如 1-xxxxxxx
或 2-yyyyyy
。然而,1-xxxxx
与 1-zzzzzz
相同,即使实际内容不同,这就是为什么当 1-xxxxx
更改为 1-zzzzz
时 evil
不应该重新启动,而只是当它变为 2-yyyyyyy
.
您已经有一个执行提取的自定义模块,为什么不创建一个处理其余部分的自定义状态模块?通过这种方式,您可以确定文件是否实际更改,在更改时进行处理,并在提取不起作用时更正错误。
然而,在第一个示例中,它不应该执行任何触发文件更改的操作,除非文件中的某些内容确实发生了更改。您可能需要仔细检查文件中发生的变化。