如何在Salt-Master上针对Minion不可达情况做出响应
这确实是个常见的痛点——当minion离线时,它自己没法主动上报状态变化,所以得换个思路,从Salt Master这边入手来监控状态并触发后续动作。下面是两种经过验证的可靠方案:
方案一:使用Salt Master的minion_status Beacon(推荐)
Salt Master本身可以通过minion_status beacon监控所有minion的在线状态,当minion1从在线变为离线时,master会主动触发事件,咱们就可以基于这个事件配置reactor来控制minion2。
步骤1:配置Master的Beacon
在Salt Master上创建(或修改)beacon配置文件,比如/etc/salt/master.d/beacons.conf,添加以下内容:
beacons: minion_status: - interval: 60 # 每隔60秒检查一次minion状态 - nodes: minion1: {} # 只监控minion1的状态 - disable_during_state_run: True
这个配置会让master每60秒检查一次minion1的状态,当它从在线切换到离线时,会触发salt/beacon/<master_id>/minion_status/minion1/down事件。
步骤2:配置Reactor规则
接下来配置master的reactor,让它监听上面的离线事件并执行动作。创建(或修改)/etc/salt/master.d/reactor.conf:
reactor: - 'salt/beacon/*/minion_status/minion1/down': - /srv/reactor/minion1_down.sls
这里指定了当minion1的离线事件触发时,执行/srv/reactor/minion1_down.sls这个reactor文件。
步骤3:编写Reactor执行脚本
创建/srv/reactor/minion1_down.sls文件,添加以下内容,实现让minion2启动目标服务(替换成你实际需要启动的服务名,比如nginx):
start_service_on_minion2: local.cmd.run: - tgt: minion2 - fun: service.start - arg: - your_service_name # 替换成你要启动的服务名
保存后,重启Salt Master服务让配置生效:
systemctl restart salt-master
方案二:使用Master的Schedule定期检查
如果beacon的方式不符合你的需求,还可以用Salt Master的schedule功能,定期主动检查minion1的在线状态,发现离线后直接触发动作。
配置Master的Schedule
在Master配置文件(比如/etc/salt/master.d/schedule.conf)中添加以下内容:
schedule: check_minion1_status: function: salt.cmd args: - run.manage.down kwargs: outputter: json interval: 60 # 每隔60秒检查一次 onchanges: - local.cmd.run: tgt: minion2 fun: service.start arg: - your_service_name # 替换成目标服务名 require_in: - local.cmd.run: check_minion1_status
这个配置会让master每60秒执行salt-run manage.down命令,检查离线的minion列表。当minion1出现在离线列表中时,就会触发在minion2上启动服务的动作。
测试验证
- 手动停止minion1的服务:
systemctl stop salt-minion - 等待配置的检查间隔(比如60秒)
- 查看minion2上的服务状态:
salt minion2 service.status your_service_name,确认服务已启动
另外,你可以通过salt-run state.event pretty=True在master上实时查看事件流,确认离线事件是否正常触发。
内容的提问来源于stack exchange,提问作者bluefish

