引言


本文将介绍一个叫做clustersh的命令行小工具。

如果你想要在许多刚刚装完linux系统的服务器(可能有上百台) 上统一执行某个shell脚本,那么clustersh就非常适合你。

“刚刚装完linux操作系统”仅仅是为强调clustersh不需要在集群上 安装任何东西,并不是clustersh运行的必要条件。

如果你的集群中包含很多不同种类的Linux发行版系统,clustersh还可以自动 识别操作系统类型,并为你选择执行相应的脚本。

Github地址


https://github.com/DQinYuan/clustersh/tree/master/zhdocs

如果觉得有用的,欢迎给个Star。Github上有更加完善的文档

使用介绍


clustersh的使用非常简单。只需任选一台与集群网络联通的linux机器 ,在其上按照如下步骤操作.

假设我们的任务是给集群内所有机器统一安装一个nfs客户端,集群内有centos机器和 ubuntu机器

下载clustersh

去下载地址下载clustersh的二进制文件(使用wget命令), 然后将其移动到linux的PATH路径下:

wget https://github.com/DQinYuan/clustersh/releases/download/v0.1.0/clustersh
chmod a+x clustersh
mv clustersh /usr/local/bin

尝试运行一下命令:

clustersh --help

可以看到相关的帮助信息

准备一个文件夹

之后准备一个文件夹(假设是~/clustershtest):

mkdir ~/clustershtest
cd ~/clustershtest

配置ips

在文件夹下创建一个名叫ips的文件:

touch ips

然后在里面配置上集群中所有机器的ip, 假设我的集群中有5台机器,分别是10.10.108.23,10.10.108.71, 10.10.108.72,10.10.108.73,10.10.108.90。 于是我们可以如下配置ips:

10.10.108.23
10.10.108.71-73
10.10.108.90

这里我们使用了71-73直接指定了一个范围的ip来简化配置,clustersh 目前只支持在ip地址的第四段使用范围指定。

默认情况下配置文件名叫做ips,如果你不想让它叫做ips的花,可以在后面 执行clustersh命令是使用--ips指定。

编写shell脚本

在文件夹下写如下两个脚本:

#!/bin/sh

yum install -y  nfs-utils
#!/bin/sh

apt install -y nfs-common

在开始下一步之前,你最好确保你写的 所有shell脚本在对应操作系统上都测试通过。

执行clustersh

最后在文件夹下执行如下命令即可:

clustersh nfs -U root -P xxxxxx

clustersh会寻找当前目录下的ips文件,将其中 的ip地址读出,依次使用命令行提供的用户名和密码 (这里的用户名为root,密码为xxxxxx)登陆 这些ip。(在实践中,集群大多有统一的用户名和密码, 所以这里就使用统一的用户名与密码登陆集群了)

nfs是shell脚本的简称clustersh会根据服务器 的操作系统类型将其扩充为nfs_操作系统类型.sh, 如果nfs_操作系统类型.sh文件不存在的话则扩充为nfs.sh.

比如clustersh登陆到一台centos服务器后,发现 操作系统是centos,于是就会尝试寻找nfs_centos.sh, 如果有的话就执行它,没有的话则执行nfs.sh

如果在集群中还有更多的操作系统类型,请以如下格式命名脚本:

简称_操作系统类型.sh

clustersh当前支持识别的操作系统类型有:

操作系统类型
centos
rhel
aliyun
fedora
debian
ubuntu
raspbian

你也可以再提供一个简称.sh用于在操作系统类型无法识别或者 是没有提供针对该种操作系统的脚本时执行。

如果你写的脚本对所有操作系统都通用的话,你直接给一个简称.sh即可。

查看输出

虽然shell脚本在相应的操作系统上都测试通过了, 但是在集群中某些机器运行时还是有可能因为一些 难以预料的原因(比如磁盘空间不足,DNS配置错误等等) 失败,clustersh在运行时会打印每台机器运行的成败情况, 对于少数失败的机器,最好手动登陆上去完成操作。

clustersh fail

比如从上面的输出中看到10.10.108.41因为某些原因没能成功 执行脚本,最好手工登陆上去操作,不过这种情况属于少数, 并不会花费太多的精力。

案例源代码

更多特性


cluster还有一个比较重要的特性就是,在你的shell脚本中,可以使用当前工作目录及其子目录的任意文件,因为这些目录与文件都会被clustersh自动拷贝到目标服务器上去。

对于集群中的每一台服务器,clustersh example的执行流程如下:

clustersh summary