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

2024-05-31 23:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我通常会使用ssh来实现这一点,为具有有限权限的作业创建一个用户/组。在

ssh的一些缺点:

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

几乎没有可能:

  • 找到一个开箱即用的开源解决方案(到目前为止,我已经尝试过,但没有运气)
  • 在每台服务器上设置一个restapi,该服务器接受具有某种身份验证的调用,例如POSThttps://server/git/pull/?apikey=a1b2c3
  • 设置Python/Celery以在每个主机的不同队列上执行任务。这意味着每台服务器上都有一个celery worker可以执行命令,也可能是一个接受RESTAPI调用并将其转换为celery任务的服务。在

这个问题有好的解决办法吗?在


Tags: 实例docker用户git服务器ci权限作业
1条回答
网友
1楼 · 发布于 2024-05-31 23:35:03

定义问题

  1. 您希望能够触发远程任务而不必等待它完成。在

这可以通过多种方式实现,包括使用SSH。您可以通过关闭或重定向所有I/O流来执行远程命令,而无需等待它完成,例如:

ssh user@host "/usr/bin/foobar </dev/null >/dev/null 2>&1"
  1. 如果主机当前不可用,您希望能够延迟任务。在

这需要某种排队/重试系统。您还需要决定目标主机是查询消息(“pull”)还是消息将从其他地方发送到目标主机(“push”)。在

  1. 您希望尽可能简化访问控制。在

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

示例解决方案

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

  • 主机通过向SFTP服务器上的文件写入命令来添加任务。目标主机上的Cron作业定期检查新命令,如果找到新命令,则执行这些命令。通过SFTP服务器上的SSH密钥管理的访问控制。

  • 主机将任务发布到restapi,后者将任务添加到队列中。每个目标主机上的Celery守护进程从队列中消费并执行任务。访问主要由发送到任务队列服务器的凭据管理。

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

您还可以查看一些工具,这些工具可以实现一些或所有所需的功能。例如,一些Google搜索发现了Rundeck,它似乎具有一些作业调度功能和restapi。您还应该考虑是否可以利用系统中已经存在的任何现有的自动化部署或管理工具。在

结论

最终,这个问题没有一个正确的答案。这取决于你的特殊需要。扪心自问:你想花多少时间和精力来创建这个系统?保养怎么样?它需要多可靠?它需要多少规模?以此类推,无限。。。在

相关问题 更多 >