【问题标题】:sending an ssh -t command to multiple systems simultaneously (without ansible)同时向多个系统发送 ssh -t 命令(没有 ansible)
【发布时间】:2018-08-10 18:03:28
【问题描述】:

由于脚本的性质(在工作中完成,在工作 RHEL 机器上完成),我无法显示代码,但我至少可以提供伪代码来帮助起点。目前:

开始循环

1) 读入主机文本文件的第一行(然后是下一行等) 文件的循环)并将其分配给变量(主机名)

2) 向主机发送 ssh -t 命令(需要 2 到 6 之间的任意时间) 分钟收到回复)

3) 记录对文本文件的响应(从读入的新主机重复循环 文本文件)

结束循环

目前我必须在夜间运行这个脚本,因为这个脚本会命中多少个系统。

我希望能够实现相同的目标并从每个主机的该文件中的命令中获取响应,但我希望同时发送命令,以便在 2 到 6 分钟之间完成一起。 但是因为这是为了工作,我不允许在系统上安装ansible;是否有另一种方法来实现这个目标?如果是这样,请提供一些领域或指出正确的方向。

【问题讨论】:

  • gnu-parallel 或附加一个简单的&?
  • & 是最好的选择。伪代码回答:ssh $hostname "somecommand >./locallogfile" & 在循环中,然后 scp ./locallogfiles 到您的主系统 2-6 分钟后。
  • @jeremysprofile 可能应该使用 >> 在这里写入文件
  • @Inder,为什么?如果他只想要此命令的输出,则远程系统的每个日志文件都应使用>。一旦他将scpcat 移动到他的主系统,他将不得不使用它们。我承认我可能应该将其命名为 remotelogfile 以便更清楚,但它不会让我再编辑评论。
  • 我不允许安装 ansible 而不是通过引入大量竞争条件和糟糕的超时处理来重新发明轮子,你应该问这个规则来自哪里以及为什么(不是对于这个特定的工具,但对于任何类型的工具,你必须以相同的方式 chefpuppet 或 Python 中的 fabric 之类的库等...)通过解释说这会比它做得更好任何当地的本土解决方案。我敢肯定他们不是写本地的bashssh而是从外面安装的,那为什么要禁止其他与工作相关的工具呢?

标签: bash ssh command simultaneous hosts-file


【解决方案1】:

使用 GNU 并行:

parallel -j0 --slf hosts.txt --nonall mycommand > out.txt

但也许您想了解更多信息:

parallel -j0 --slf hosts.txt --joblog my.log --tag --nonall mycommand > out.txt

【讨论】:

    【解决方案2】:

    我在几年前使用sh 做到了这一点,使用类似:

    while true
    do
       if [ numberOfFileinSomeDir -lt N ]
       then
          (touch SomeDir/hostname; ssh hostname ... > someotherDir/hostname.txt ; rm SomeDir/hostname) &
          ...
    

    但这在大约 100 个主机后停止工作。这很糟糕 - 不要这样做。如果少于约 500 个主机 pssh 可能是最简单的 - 也许您可以安装在您的主目录中?

    Google 类似python parallel execute process multiple 之类的东西,肯定有人有一个脚本可以满足您的需求。

    超过 500 台主机,您真的需要开始安装一些工具,正如其他人在 cmets 中提到的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多