我有一些服务器需要在其他服务器上执行命令。例如,Bitbucket Server post接收挂钩在另一台服务器上执行git pull
。另一个例子是CI服务器提取新的docker镜像并在另一台服务器上重新启动实例。
我通常会使用ssh
进行此操作,专门为具有有限权限的作业创建一个用户/组。
ssh
的一些缺点:
ssh
来电意味着git push
必须等到完成。ssh
命令将失败。几种可能性:
这个问题有一个很好的解决方案吗?
答案 0 :(得分:1)
这可以通过多种方式实现,包括使用SSH。您可以通过关闭或重定向所有I / O流来执行远程命令,而无需等待它完成,例如,像这样:
ssh user@host "/usr/bin/foobar </dev/null >/dev/null 2>&1"
这需要某种排队/重试系统。您还需要确定目标主机是否将查询消息(&#34; pull&#34;)或是否将消息从其他地方发送到目标主机(&#34; push&#34;)。
没有办法完全避免这个问题。一种解决方案是将大多数身份验证逻辑放在集中式任务服务器中。这将问题分为两部分:在任务服务器中配置访问权限,以及在任务服务器和目标主机之间配置身份验证。
主机尝试使用上述方法通过SSH启动任务以进行异步。如果主机不可用,则将任务写入本地文件。 Cron作业定期重试发送失败的任务。通过SSH密钥进行访问控制。
主机通过将命令写入SFTP服务器上的文件来添加任务。目标主机上的Cron作业会定期检查新命令并在找到时执行它们。通过SFTP服务器上的SSH密钥管理访问控制。
主机将任务发布到REST API,将其添加到队列中。每个目标主机上的Celery守护程序从队列中消耗并执行任务。访问主要由发送到任务排队服务器的凭据管理。
主持将任务发布到API,从而将任务添加到队列中。任务使用者节点将任务从队列中拉出,并将请求发送到目标主机上的API。通过附加到请求的发送方的加密签名管理的身份验证,由目标主机上的任务服务器验证。
您还可以查看开箱即用的部分或全部所需功能的工具。例如,一些Google搜索提出了Rundeck,它似乎有一些作业调度功能和REST API。您还应该考虑是否可以利用系统中已存在的任何现有自动部署或管理工具。
归根结底,这个问题没有一个正确答案。这实际上取决于您的特殊需求。问问自己:您想花多少时间和精力来创建这个系统?维修怎么样?它需要多么可靠?它需要多少才能扩展?等等, ad infinitum ...