SaltStack高态拉取更新不失败且仅文件有效变更时重启服务方案问询
实现方案
你可以通过改造拉取函数 + 自定义版本校验逻辑同时满足三个需求,核心思路是绕过Salt默认的文件全量对比规则,自己控制文件更新和服务重启的触发条件:
前置修改
首先调整你自定义的fetch_darkness执行模块函数:
- 拉取成功时返回完整的密钥字符串(如
1-xxxxxx) - 拉取失败(网络不通、服务不可用等)时返回
None,不要抛出异常中断State渲染
完整State配置
# 安装evil包、定义服务运行状态 evil: pkg.installed: - name: {{ package_name }} service.running: - enable: true - watch: - file: /etc/evil/wicked.txt - pkg: evil {% set new_key = salt.evil.fetch_darkness(grains['id'], pillar.node.hostname) %} {% set local_key_path = '/etc/evil/wicked.txt' %} {% set local_key_exists = salt.file.file_exists(local_key_path) %} {% set local_key = salt.file.read(local_key_path) if local_key_exists else '' %} {% set new_version = new_key.split('-')[0] if new_key is not none else '' %} {% set local_version = local_key.split('-')[0] if local_key else '' %} {% if new_key is not none %} # 拉取成功时,仅版本标签变更或本地文件不存在时才更新目标文件 {% if new_version != local_version or not local_key_exists %} /etc/evil/wicked.txt: file.managed: - contents: {{ new_key }} - show_changes: false - allow_empty: false - user: evil - group: evil - mode: 600 - makedirs: true - require: - user: evil {% endif %} {% else %} # 拉取失败时,仅本地文件不存在才报错退出 verify_local_wicked_file: test.fail_without_changes: - name: "拉取密钥失败且本地/etc/evil/wicked.txt不存在,无法继续部署" - onlyif: - test ! -f {{ local_key_path }} {% endif %}
逻辑说明
- 仅有效变更触发重启:只会对比密钥前缀的版本标签,同一标签下的内容变化不会触发文件更新,自然不会重启服务
- 定期拉取更新:每次highstate执行时都会调用
fetch_darkness尝试拉取最新内容,满足定期更新要求 - 拉取失败降级处理:拉取失败时如果本地已有文件,不会执行任何操作,highstate正常成功;只有本地无文件时才会报错,符合预期
内容的提问来源于stack exchange,提问作者fraiser
相关产品推荐
相关产品推荐

