You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:04