在文章 中, 我们介绍了如何实现一个容器化的跨语言定期任务调度器。
但有时候,我们可能会遇到任务无法容器化或任务必须在另一台服务器上跑的场景, 如果我们想把这些任务也加入到我们的自动化运维平台中, 那么可能会涉及到以下问题
- 如何调用远程任务?
- 如何获取到远程任务的日志?
- 如何做到安全的调度?
一个比较简单的方案,就是任务方提供一个http服务,然后我们的自动化运维平台通过调用http服务的方式,让任务方接受到调用,就执行任务,但是这个方式会带来一些问题
- 每一个定期任务,需要一个http服务,如果一台服务器上有20个定期任务呢
- 有的任务可能是用shell写的,不太方便直接启动http服务
- 这个http服务如果让任务方嵌入到自己的任务代码里,非常的重复
所以一个比较好的方案,就是我们的自动化运维平台提供一个agent,同时提供自动化安装agent的方法, 部署在我们需要远程定期任务的机器上,我们的自动化运维平台通过调用agent,来实现任务的调用
这样用户只需要在前端页面填写服务器地址,以及任务命令就ok了

当然为了安全,防止远程执行漏洞,我们需要进行严格的代码限制
- 在agent中限制来源地址,ip地址必须是我们的自动化运维平台
- token验证,每次调用必须做token的校验
- 当自动化运维平台发起任务执行时,只传输一个任务id给自动化运维平台,agent会调用自动化运维平台的API,查询到这个任务的命令,然后执行命令,不允许直接通过传命令的方式执行命令.
- 我们的agent以一个普通用户运行
这4个限制可以非常大程度上的保证我们不会被远程调用漏洞陷阱攻击,同时也可以满足我们的需求
接下来梳理一下我们的流程
- 用户在前端提交远程任务
- 管理员部署agent
- 到任务执行时间,自动化运维平台调用指定服务器的agent,并带上任务ID
- agent接受到ID,调用自动化运维平台查询任务ID对应的命令
- 执行命令,获取到命令的输出
- 通过API把日志传回给自动化运维平台
发表回复