需求
在kubernetes/docker容器化应用中,业务应用由大量容器组成,由于生产环境中出于安全考虑,一般不会允许用户直接登入集群机器,然后登入机器上的容器。况且数量之多,也没有效率。因此设计了一个命令行工具,以权限受控的账号ssh远程连接到容器所在宿主机,然后docker exec到容器内执行命令。而且该过程必须能够批量化的进行。
实现
下面是并发执行远程ssh命令的核心实现
jobs := make(chan *model.Command, len(instanceList))
results := make(chan *model.CommandResult, len(instanceList))
// 开启多个goroutine去远程登入容器,执行命令
for e := 1; e <= parallelism; e++ {
go service.Executor(e, jobs, results)
}
for _, ins := range instanceList {
jobs <- &model.Command{
Host: ins.Host,
ContainerId: ins.ContainerId,
Command: cmd,
}
}
close(jobs)
failCount := 0
size := len(instanceList)
for j := 1; j <= size; j++ {
rst := <-results
success := "Success"
if rst.CmdError != nil {