【问题标题】:How can I send a command to X number of EC2 instances via SSH如何通过 SSH 向 X 个 EC2 实例发送命令
【发布时间】:2021-06-15 20:05:44
【问题描述】:

我有很多 AWS EC2 实例,我需要同时从它们执行一个 python 脚本。

我一直在尝试从我的电脑通过 ssh 发送所需的命令来执行脚本。为此,我创建了另一个 python 脚本,它打开一个 cmd 终端,然后执行一些命令(我需要在每个实例上执行 python 脚本的命令)。因为我需要同时打开所有这些 cmd 终端,所以我使用了 ThreatPoolExecutor,它(具有我的 PC 特性)允许我并行运行 60 次。这是代码:

import os
from concurrent.futures import ThreadPoolExecutor

ipAddressesList=list(open("hosts.txt").read().splitlines())

def functionMain(threadID):
    os.system(r'start cmd ssh -o StrictHostKeyChecking=no -i mysshkey.pem ec2-user@'+ipAddressesList[threadID]+' "cd scripts && python3.7 script.py"')

functionMainList =list(range(0,len(ipAddressesList)))

with ThreadPoolExecutor() as executor:

    results = executor.map(functionMain, functionMainList)

问题在于执行script.py 的命令会阻塞终端直到进程结束,因此functionMain 一直在等待结果。我想找到在发送命令python3.7 script.py 后函数结束但脚本继续在实例中执行的方式。所以池执行器可以继续线程。

【问题讨论】:

    标签: python-3.x amazon-ec2 ssh cmd python-multiprocessing


    【解决方案1】:

    AWS Systems Manager Run Command 可用于在多个 Amazon EC2 实例(甚至是安装了 Systems Manager 代理的本地计算机)上运行脚本。

    运行命令还可以提供在每个实例上运行的命令的返回结果。

    这绝对是最好通过 SSH 连接到实例来运行命令。

    【讨论】:

    • 感谢您的回复!是否可以为 50 多个目标运行文档类型“AWS-RunShellScript”?我需要在 1000 个实例中运行相同的命令。
    • 不确定。这是对限制的引用,但它可能是每个实例而不是实例数:python - AWS Systems Manager "In Progress" commands limit to 5? - Stack Overflow。服务配额列在:AWS Systems Manager endpoints and quotas - AWS General Reference。您在哪里看到 50 的限制?
    • 在手动选择目标时使用运行命令 GUI(而不是通过 AWS cloudshell 中的命令)。它设置了 50 个实例的限制。无论如何,我会尝试联系亚马逊,因为我需要升级我的帐户,因为我使用的是免费套餐。
    • AWS Free Tier 是计费折扣。它免费提供一定数量的服务。但是,您的帐户是“完整帐户”,而不是“免费帐户”。没有帐户“升级”之类的东西,因为所有帐户都是相同的。免费套餐的某些部分仅适用于帐户的前 12 个月,而某些部分则始终适用。
    【解决方案2】:

    请原谅我没有提供“代码”答案,但我相信现有的工具已经解决了这个问题。这听起来像是ClusterShell 的理想用法:

    ClusterShell 提供了一个轻量级且统一的命令执行 Python 框架来帮助管理 GNU/Linux 或 BSD 集群。使用 ClusterShell 的一些最重要的好处是:

    • 在 Python 中提供高效、并行且高度可扩展的命令执行引擎,

    使用clush,您可以跨多个节点并行执行命令。它还具有按主机名对输出进行分组的选项。

    另一种选择是使用Ansible,但在这种情况下,您需要创建一个剧本,而使用 ClusterShell,您运行命令的方式与使用 SSH 相同。使用 Ansible,您将为 playbook 创建一个目标组,它将连接到每个实例并告诉它运行 playbook。要在命令仍在运行时断开连接,请查看 asynchronous 操作:

    默认情况下,Ansible 同步运行任务,保持与远程节点的连接处于打开状态,直到操作完成。这意味着在剧本中,每个任务默认阻止下一个任务,这意味着后续任务将在当前任务完成之前不会运行。这种行为会带来挑战。例如,某项任务可能需要比 SSH 会话允许的时间更长的时间才能完成,从而导致超时。或者,您可能希望在同时执行其他任务的同时在后台执行一个长时间运行的进程。异步模式可让您控制长时间运行的任务的执行时间。

    我已经在超过 5,000 台机器的 HPC 环境中使用了这两种方法,它们都可以很好地满足您的目的。

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多