如何重启salt-minion而不导致salt状态执行失败?
解决Salt Minion配置更新后重启导致状态执行失败的问题
问题背景
我们通过Salt状态更新/etc/salt/minion中的saltenv和pillarenv配置,调用初始状态的命令为:
state.apply app.changesaltenv saltenv=newenv pillarenv=newenv
当前核心问题是:若在状态中添加service.restart操作重启minion,会因minion与master断开连接,直接导致状态执行判定为失败。此前参考过相关问题的示例方案,但均未解决该失败问题。
可行解决方案
1. 后台异步执行重启命令
通过cmd.run模块在后台启动重启操作,让minion先向master返回执行成功,再在本地完成重启,避免断连导致的失败:
restart_salt_minion: cmd.run: - name: systemctl restart salt-minion & disown - require: - file: /etc/salt/minion
& disown会让进程脱离当前会话,确保minion先返回状态结果,再执行重启操作。
2. 拆分状态分阶段执行
将配置更新与minion重启拆分为两个独立状态:
- 第一阶段:仅执行配置文件更新操作,确保修改完成
- 第二阶段:通过master批量执行或minion本地调用完成重启,例如:
或让minion本地执行重启状态:salt '*' cmd.run 'systemctl restart salt-minion' --batch 10%salt '*' salt-call state.apply app.restart_minion
3. 使用Salt Schedule模块延迟重启
通过Salt的schedule模块配置一次性延迟任务,让minion在配置更新完成后等待几秒再重启,确保状态执行流程正常结束:
schedule_restart_minion: schedule.present: - name: restart_salt_minion - function: cmd.run - job_args: - 'systemctl restart salt-minion' - once: True - delay: 5 - require: - file: /etc/salt/minion
delay: 5表示配置更新完成后5秒再执行重启,给状态结果返回留足时间。
内容的提问来源于stack exchange,提问作者Greg Long
相关产品推荐
相关产品推荐

