循环遍历服务器列表的更好方法

循环遍历服务器列表的更好方法

我经常会循环遍历服务器列表以采取一些操作。例如:

for s in `cat servers.txt` ; do
    echo; echo $s
    ssh $s 'do something'
done

我想知道(从 shell 的角度来看)是否有比cat servers.txt

是的,我知道像 mcollective、capistrano 等工具 - 我经常这样做来解决 mcollective 问题 :-)

答案1

我的快速而肮脏...其中 servers.txt 有一系列主机或 IP,每行一个。

#!/bin/bash

SERVER_LIST=/path/to/servers.txt

while read REMOTE_SERVER
do
        ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST

答案2

我用集群SSH
它会打开很多小 shell,你可以同时输入所有 shell 的内容。当你想在很多服务器上执行相同的命令但仍能看到输出时,这真的很方便。
我这样使用它:clusterssh $(~/get-servers.sh),但显然你可以这样做,clusterssh $(cat servers.txt)
结果如下所示:

在此处输入图片描述

它也可以作为 Debian 软件包使用。

答案3

请帮自己一个忙,使用为此设计的东西。您已经了解 mcollective,但您和我都知道它需要一些基础设施才能工作。puppet 和 chef 也是如此。

clusterssh并行 ssh舞者壳是对 shell for 循环的简单改进。它们不需要更多基础设施。

但也有ansible,它不仅能让你做到这一点,还能编写包含多个步骤的可重复使用的“剧本”。除了 sshd 之外,它还需要安装 python,但实际上我从未单独安装过它,它一直可用。

Ansible 是我尝试过的唯一一款配置管理系统,它也可以很好地用作部署和编排工具(puppet 需要 mcollective,也许还需要 capistrano/fabric,...)

(是的,Puppet 和 Chef 以及所有其他程序都可以在没有中央服务器的情况下运行,但是您需要在主机上安装软件包来管理,而 ansible 不需要这样做)

答案4

要在不使用为此目的设计的任何工具的情况下在广泛的服务器上执行简单任务,无论它们是否需要以前的基础设施,您都可以使用一个名为的简单 shell 脚本mussh,在许多发行版中作为一个包进行分发。

您可以使用主机列表、命令列表来调用它,将两者存储在文件中,以及许多其他选项,如ssh-agent集成、代理支持......检查手册页了解所有详细信息。

一个例子可以简单如下:

$ mussh -H host_list.txt -C command_list.txt

相关内容