如何获取salt state的STDOUT输出并发送至master节点
SaltStack 获取State执行STDOUT并同步到Master的实现方案
下面是两种可直接落地的实现方式,第二种为更优的原生方案:
方案1:本地落盘后手动回传
适合需要自定义本地日志留存规则的场景:
- 第一步先在minion端执行state时将输出写入本地文件,可自行指定输出格式(支持json、pretty、yaml等多种格式),示例命令:
如果是在master端批量操作所有minion,命令调整为:salt-call state.apply 你的state名称 --out=pretty > /tmp/salt_state_result_$(date +%Y%m%d%H%M%S).log 2>&1salt '*' state.apply 你的state名称 --out=json > /tmp/batch_state_result.log - 第二步调用Salt原生的
cp.push模块将本地日志文件上传到master节点,需要提前在master配置文件中将file_recv参数设置为True并重启master服务,示例命令:
上传后的文件默认存储在master的salt '*' cp.push /tmp/salt_state_result_2024xxxx.log/var/cache/salt/master/minions/<对应minion_id>/files/目录下。
方案2:使用Returner模块直接回传结果(推荐)
是Salt原生支持的最优方案,无需手动处理文件读写和传输:
- Salt的Returner机制可以直接将state执行的所有输出(包含STDOUT、STDERR、执行状态、耗时等全量信息)直接返回给master端的指定存储位置,执行命令时指定returner即可,示例:
salt '*' state.apply 你的state名称 --return local --return-config '{"file":"/var/log/salt_state_result/{{jid}}_{{minion_id}}.log"}' - 如果有自定义格式输出、结构化存储等需求,可以自己开发简单的自定义Returner模块,放在master的
/srv/salt/_returners/目录下同步到minion后即可使用,灵活度更高。
额外注意事项
- 需要抓取单步state任务的执行细节时,可以在执行命令后添加
--verbose参数,会输出每个state块的完整STDOUT、返回码、变更内容等信息,避免遗漏关键日志。 - 可以将整个执行、落盘、回传的逻辑封装成一个独立的state文件,定时执行或者触发执行即可,无需每次手动输入多条命令。
内容的提问来源于stack exchange,提问作者Austin Bennett
相关产品推荐
相关产品推荐

