通过SSH在多台服务器上运行相同的脚本

通过SSH在多台服务器上运行相同的脚本

我经常需要更新一些 Ubuntu 12.04(Precise Pangolin)服务器(机架空间)。

我现在做的是:

  • 使用 SCP 将文件复制到服务器
  • 使用SSH登录服务器
  • 停止雄猫
  • 对上传的文件进行一些复制和移动
  • 启动Tomcat

在第二台服务器上使用相同的文件重复完全相同的过程(现在有 12 台服务器,而且数量还在增长)。

是否可以编写一个循环遍历服务器列表的脚本并为我完成所有这一切?

我该怎么办呢?优选地,该解决方案不需要安装任何东西。公司内的大多数人都在 MacBook 上工作,但 Windows 虚拟机也很丰富。

理想情况下,可以简单地添加/删除要更新的服务器来更改服务器列表。然而,任何可以节省我做同样事情 12 次的时间的解决方案都非常值得赞赏:)

答案1

对此有多种解决方案 - 您是否想要手动控制步骤并同时运行它们?看看计算机安全网关(如果您来自 Linux 系统)或超级腻子(如果您来自 Windows 系统)。如果您只是想自动化一切,请查看预计

答案2

@戴夫

根据脚本,您可以通过 ssh 运行:

for server in s1 s2 s3; do
    ssh $server "command one; command two; ..."
done

或者将其分成多个调用:

for server in s1 s2 s3; do
    ssh $server command one
    ssh $server command two
    ...
done

请随意将其添加到您的答案中,只是路过..

答案3

帮自己一个忙并检查一下安西布尔。听起来这正是您所需要的。它使用 SSH 并轻松扩展,您所要做的就是根据需要将服务器添加到列表中。学习制作剧本会花费你一个下午的时间,但将来会为你节省无数的时间。

答案4

正如其他人提到的,有一些设计用于管理多台机器的工具,但对于纯粹的 bash 解决方案,您可以编写一个 for 循环并通过 ssh 在少数节点上执行命令。

假设 host1 和 host2 是您希望发生这种情况的 ndo 的主机名:

for node in host1 host2; do
    scp /tmp/script.sh user@$node:/tmp/script.sh
    if [[ "$?" == "0" ]];then #checks that last command didn't return an error
        ssh -oBatchMode=yes user@$node /tmp/script.sh
    fi
done

如果您打算使用此解决方案,我建议您配置 ssh 密钥,这样您就不必每次都输入密码。 BatchMode 选项将导致脚本跳过而不是等待输入,您可以决定这是否更可取。

相关内容