无Salt Master权限且不使用编排,如何实现跨Minion的Salt State依赖?
无Salt Master权限下的跨集群State协调方案
因为无法使用Salt Orchestrate,只能在Minion本地执行state.apply,要实现clusterC的iisreset依赖clusterA、clusterB的stop_service执行成功,可采用以下两种方案:
方案一:共享标志文件(半自动化,无需手动干预)
利用共享存储(如NFS、SMB挂载目录)让Minion之间传递执行完成的信号,修改State文件如下:
{% set cluster = grains['prodcluster'] %} # 替换为所有Minion都能访问的共享目录路径 {% set shared_flag_dir = '/mnt/shared/cluster_flags' %} # clusterA、clusterB执行停止服务并标记完成 {% if cluster in ["clusterA","clusterB"] %} stop_service: service.dead: - name: my_service mark_cluster_done: file.touch: - name: {{ shared_flag_dir }}/{{ cluster }}.finished - makedirs: true - require: - service: stop_service {% endif %} # 所有集群执行IIS重置,clusterC需等待A、B的标志 reset_iis: cmd.run: - name: iisreset - require: {% if cluster == 'clusterC' %} - file: wait_for_clusterA - file: wait_for_clusterB {% else %} - service: stop_service {% endif %} # clusterC专属:等待A、B的完成标志 {% if cluster == 'clusterC' %} wait_for_clusterA: file.wait_for_exists: - name: {{ shared_flag_dir }}/clusterA.finished - timeout: 300 # 超时时间,单位秒,可按需调整 wait_for_clusterB: file.wait_for_exists: - name: {{ shared_flag_dir }}/clusterB.finished - timeout: 300 {% endif %}
执行说明
- 确保所有Minion已挂载指定的共享目录,且有读写权限
- 同时在所有三个集群的Minion上执行
state.apply your_state_name:- clusterA、clusterB会先停止服务,完成后创建标志文件
- clusterC会持续等待两个标志文件出现,待检测到后自动执行IIS重置
方案二:手动分阶段执行(完全依赖人工确认)
如果没有可用的共享存储,可分两步手动执行:
第一阶段:仅在clusterA、clusterB的所有Minion上执行State,完成服务停止:
salt-call state.apply your_state_name执行完成后,手动确认所有clusterA、clusterB的
my_service已停止。第二阶段:在clusterA、clusterB、clusterC的所有Minion上执行State,触发IIS重置:
salt-call state.apply your_state_name此时clusterA、clusterB会直接执行
iisreset(因为stop_service已完成),clusterC也会执行iisreset。
内容的提问来源于stack exchange,提问作者aven
相关产品推荐
相关产品推荐

