Saltstack如何为长运行编排状态添加执行时实时输出的提示消息
可行实现方案
方案1:开启Salt流式输出 + 状态内插test.echo
你之前用test.echo无法实时输出的核心原因是Salt默认会将单台minion的所有状态执行结果攒到全部完成后批量回传,只要开启流式输出就能打破这个限制:
- 执行状态时添加
--stream参数即可开启实时回传:
salt '*' state.apply your_state_name --stream
- 状态文件中直接插入
test.echo步骤,放在需要提示的位置前即可:
notice_before_apply_foo: test.echo: - name: "即将在minion {{ grains['id'] }} 上应用XX状态"
开启流式输出后,master会在minion每执行完一个状态步骤后立刻打印结果,不会等待全部执行完成。
方案2:编排场景直接用salt.output.display_output runner
如果你是在master侧跑编排(orchestration),可以直接用output runner在master侧实时打印消息,不需要等待minion返回:
print_orch_notice: salt.runner: - name: salt.output.display_output - arg: - "即将在minion foo上应用某状态" - "quiet" # 确保通知在对应状态执行前打印 - require_in: - salt: apply_foo_state
方案3:用事件系统实现全链路通知
如果需要更灵活的通知逻辑,可以在状态中插入事件发送步骤,配合master侧的事件监听实现实时告警:
- 状态文件中插入
event.send步骤:
send_running_notice: event.send: - name: custom/state/running_notice - data: msg: "即将在minion {{ grains['id'] }} 上应用XX状态" state_name: xxx
- 执行状态的同时在master侧开事件监听即可实时看到所有通知:
salt-run state.event pretty=True
之前方案失效原因说明
- Jinja日志是在状态渲染阶段执行的:Salt会先把所有状态文件的Jinja逻辑全部渲染完成,生成完整的YAML执行计划后才会按顺序执行状态,所以日志会提前打印。
- 未开流式输出时的
test.echo是minion侧执行的模块:默认minion会把所有状态执行结果缓存,全部完成后才批量回传给master,所以消息会最后统一打印。
内容的提问来源于stack exchange,提问作者GloomyDay
相关产品推荐
相关产品推荐

