Python 在具有解耦、冗余和异步功能的远程服务器上执行命令

Python 在具有解耦、冗余和异步功能的远程服务器上执行命令,python,git,ssh,server,Python,Git,Ssh,Server,我有一些服务器需要在其他服务器上执行命令。例如,Bitbucket服务器post接收钩子在另一台服务器上执行git pull。另一个例子是CI服务器拉取一个新的docker映像并重新启动另一台服务器上的实例 我通常会为此使用ssh,专门为作业创建一个具有有限权限的用户/组 ssh的一些缺点是: 同步ssh调用意味着git推送将必须等待完成 如果由于任何原因无法联系主机,ssh命令将失败 维护密钥、用户和sudoers权限可能会变得很麻烦 几乎没有可能: 找到一个开箱即用的开源解决方案(到目

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

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

ssh的一些缺点是:

  • 同步
    ssh
    调用意味着
    git推送将必须等待完成
  • 如果由于任何原因无法联系主机,
    ssh
    命令将失败
  • 维护密钥、用户和sudoers权限可能会变得很麻烦
几乎没有可能:

  • 找到一个开箱即用的开源解决方案(到目前为止,我一直在尝试,但运气不佳)
  • 在每台服务器上设置一个RESTAPI,该服务器接受具有某种身份验证类型的调用,例如POST
  • 设置Python/Cellery以在每个主机的不同队列上执行任务。这意味着每台服务器上都有一个芹菜工人,可以执行命令,还可能有一个服务接受RESTAPI调用,将它们转换为芹菜任务
这个问题有好的解决方案吗?

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

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

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

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

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

    • 主机将任务发布到REST API,该API将任务添加到队列中。每个目标主机上的芹菜守护进程使用队列中的数据并执行任务。访问主要由发送到任务队列服务器的凭据管理

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

    您还可以查看一些工具,这些工具可以直接完成某些或所有必需的功能。例如,一些Google搜索结果似乎具有一些作业调度功能和RESTAPI。您还应该考虑是否可以利用现有系统中已经存在的任何自动化部署或管理工具。 结论 最终,这个问题没有单一的正确答案。这取决于你的特殊需要。问问你自己:你想花多少时间和精力来创建这个系统?保养怎么样?它需要有多可靠?它需要扩展多少?等等,无限的