使用解耦,冗余和异步在远程服务器上执行命令

时间:2015-11-19 07:56:51

标签: python git ssh server

我有一些服务器需要在其他服务器上执行命令。例如,Bitbucket Server post接收挂钩在另一台服务器上执行git pull。另一个例子是CI服务器提取新的docker镜像并在另一台服务器上重新启动实例。

我通常会使用ssh进行此操作,专门为具有有限权限的作业创建一个用户/组。

ssh的一些缺点:

  • 同步ssh来电意味着git push必须等到完成。
  • 如果主机因任何原因无法联系,ssh命令将失败。
  • 维护密钥,用户和sudoers权限可能会变得难以处理。

几种可能性:

  • 找到一个开箱即用的开源解决方案(到目前为止,我试过没有运气)
  • 在每台服务器上设置REST API,接受具有某种类型身份验证的呼叫,例如:发布https://server/git/pull/?apikey=a1b2c3
  • 设置Python / Celery以在每个主机的不同队列上执行任务。这意味着每个服务器上的芹菜工作者可以执行命令,并且可能是接受REST API调用的服务,将它们转换为Celery任务。

这个问题有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

定义问题

  1. 您希望能够在不等待其完成的情况下触发远程任务。
  2. 这可以通过多种方式实现,包括使用SSH。您可以通过关闭或重定向所有I / O流来执行远程命令,而无需等待它完成,例如,像这样:

    ssh user@host "/usr/bin/foobar </dev/null >/dev/null 2>&1"
    
    1. 如果主机当前不可用,您希望能够推迟任务。
    2. 这需要某种排队/重试系统。您还需要确定目标主机是否将查询消息(&#34; pull&#34;)或是否将消息从其他地方发送到目标主机(&#34; push&#34;)。

      1. 您希望尽可能简化访问控制。
      2. 没有办法完全避免这个问题。一种解决方案是将大多数身份验证逻辑放在集中式任务服务器中。这将问题分为两部分:在任务服务器中配置访问权限,以及在任务服务器和目标主机之间配置身份验证。

        示例解决方案

        • 主机尝试使用上述方法通过SSH启动任务以进行异步。如果主机不可用,则将任务写入本地文件。 Cron作业定期重试发送失败的任务。通过SSH密钥进行访问控制。

        • 主机通过将命令写入SFTP服务器上的文件来添加任务。目标主机上的Cron作业会定期检查新命令并在找到时执行它们。通过SFTP服务器上的SSH密钥管理访问控制。

        • 主机将任务发布到REST API,将其添加到队列中。每个目标主机上的Celery守护程序从队列中消耗并执行任务。访问主要由发送到任务排队服务器的凭据管理。

        • 主持将任务发布到API,从而将任务添加到队列中。任务使用者节点将任务从队列中拉出,并将请求发送到目标主机上的API。通过附加到请求的发送方的加密签名管理的身份验证,由目标主机上的任务服务器验证。

        您还可以查看开箱即用的部分或全部所需功能的工具。例如,一些Google搜索提出了Rundeck,它似乎有一些作业调度功能和REST API。您还应该考虑是否可以利用系统中已存在的任何现有自动部署或管理工具。

        结论

        归根结底,这个问题没有一个正确答案。这实际上取决于您的特殊需求。问问自己:您想花多少时间和精力来创建这个系统?维修怎么样?它需要多么可靠?它需要多少才能扩展?等等, ad infinitum ...