引言:
1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少。
2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?
3.如果你想让你所管理的几万台服务器执行同一个刚刚写好的备份脚本怎么办?
一台一台的去处理?这当然不行。
所以你最有可能想到的,就是写一个循环,在这几万台机器中循环,执行同样的操作。
可是、如果经常需要做这样的操作,每天写数次循环会不会太累了呢?
更要命的是,当你要循环的主机列表或IP地址池每次都不同时,你又该怎么办呢?
所以,本文中的脚本,就是来解决这个问题的。
---------------------------------------------
哇咔咔,好久不写博客了。两年前,本人还是个新手,有很多已有的工具可以实现各种功能,但是当时的我并不知道有这些东西。所以无论需要什么功能,都是自己动手写。当时有个需求,需要对很多服务器做相同的操作,而当时的我,并不知道有puppet之类的东西,所以没办法,只能自己写脚本了。
现在两年过去了,这脚本仍然在使用,因为有些功能puppet无法实现,或者说:无法立刻部署成功。所以当初写的这脚本,如今看来仍然有用武之处,所以,今天就贴出来供大家分享。
由于脚本是很久之前写的了,年久失修,里面有些东西已经不适用本公司现在的架构了,但是为了演示功能,那些已被弃用的功能,仍然贴了出来。与本人在线上使用的脚本相比,本文几乎没有任何删改(当然:公司的域名被我替换成example.com了)。
阅读本文的前提是:你已经了解过bash4的新特性了,并且你的所有服务器之间都已经有了信任关系。
本脚本的架构是:
在中控机(本人的是:d008.example.com)上执行要执行的命令,以及在哪些机器上执行这些命令。
脚本有一函数对用户指定的主机列表进行解析,得到最终要执行某命令的主机列表。
例如:m001-m123,表示用户要在m001至m123共123台机器上执行某命令。而该函数的功能就是:
把m001-m123解析成:m001,m002,m003....m123这样的主机列表。
最后再在解析出的主机列表中循环,依次ssh过去并执行用户指定的命令。如果用户要执行的是个脚本,而不是普通命令,那么要先把脚本scp过去,再进行执行。
大体就是这么个思想,具体实现时,可以设置不同选项来控制脚本的行为。
本人已实现的选项有如下几个(仿man page格式做的使用说明,对齐做的不太好)
.
rchange是脚本名,部署在了/bin目录下,由于是批量更改N多服务器的配置,所以就把脚本命名为rchange
已实现的选项有:
-a COMMAND 指定要执行的命令,当使用-a时,rchange的所有剩余位置参数都是要执行的命令的一部分。
-c COMMAND 指定要执行的命令,当使用-c时,只有跟在-c后面的第一个参数,才是要执行的命令,第二个及之后的参数,均为rchange的其他option,如果该命令有参数,要把命令和参数放进同一对引号里(推荐单引号)
说明下-a和-c的区别,如下例所示:
rchange -a ls -l该命令表示要执行'ls -l'这个命令,因为-a后面所有的参数都会被认定为命令的一部分
rchange -c ls -l该命令表示要执行'ls’这个命令,而'-l'是rchange的另外一个选项,'-l'并不属于要执行的命令,而属于rchange
为避免歧义,强烈推荐将要执行的命令用一对单引号引起来,不推荐双引号,因为使用双引号时,命令中的通配符会被解析,进而造成命令执行失败,脚本行为将不可预期。
-d debug的意思,显示一些debug信息,方便调试。
-H 指定要执行命令的主机列表,可以使用'-'来指定一个范围,如:m001-m100表示100台机器。多个主机用逗号隔开,如:rchange -H d015,f018-f023,n005-n522
-e except排除,在已指定的主机或IP列表中排除某个或某段IP,比如想使m001-m100(m052除外)这99台机器执行某命令,执行如下命令即可:rchange -H m001-m100 -e m052,这样就会排除m052这台机器。排除多个主机可用逗号隔开,如:rchange -H m001-m100 -e m052,m067,m091-m-94这样一共会排除6台主机,最终有94台会执行你指定的命令。
-h --help 打印帮助
-v --version 显示程序版本
-x --example 显示使用示例
这3个没什么可说的。
-m (mode)改变运行模式。当在很多主机执行同一个命令时,脚本默认会并行执行,即、在所有机器上同时执行,当使用-m选项时,脚本会改成串行执行。就是一个接一个地来。
-n (name)在每一台主机上执行某命令之前,先打印该主机的主机名。当你想查看系统的什么属性时,这个选项会很有用,他会使显示更人性化。当使用-n选项时,脚本的运行模式会强制使用串行,因为并行执行时,无法判断主机名和程序输出的对应关系,一瞬间屏幕就满了,根本什么也看不出来。
-s (script)当使用-s选项时,-s后面跟着的第一个参数,会被认为是个脚本,而不是普通的命令,此时rchange会把这个脚本scp到所有要执行这个脚本的主机上,之后再执行,rchange以该脚本的扩展名来判断要调用的解释器,如:.pl会被认定是perl脚本,.py会被认定是python脚本,.php会被认定是php脚本,其他所有都会被认定是shell脚本(bash),当然,您也可以根据其他方式来判断,这里我就是这么设置并演示的。
还有如下3个长选项,这3个选项是后加进去的,所以当使用时,不要使用其他选项,如果非要使用,必须把长格式选项放在前面,其他短选项放在后面,因为本人使用这几个选项时,基本不指定主机列表,所以就没考虑那么多。
--md5 <filename> 显示所有主机中的filename的md5值。此选项强制使用串行模式,并强制打印主机名。
使用该选项时,默认主机列表包括中控机(d008)
--sync <filename> 从中控机同步filename这个文件,使得所有主机中的该文件,都和中控机中的该文件一致。
--list <filename> 在所有主机中执行ls -lh <filename>,查看所有机器中这文件的属性神马的。
--md5和--list的执行结果如下:(--sync只是同步,没有输出)
其他选项的使用示例:
好了,现在开始贴代码,最近比较懒,中文注释就不写了,原文中有注释,但是是英文写的,对付看吧,不过我也没用什么生僻的单词,所以理解起来应该不费劲。
首先,贴的是/bin/rchange.doc,因为帮助的内容也很多,所以单独放在这个文件里了。
rchang.doc.part1:
rchange.doc.part2:
rchange.doc.part3:
接下来就是脚本的功能代码了:
rchang.part1:
rchang.part2:
rchang.part3:
rchang.part4:
rchang.part5:
rchang.part6:
rchang.part7:
rchang.part8
:
rchang.part9:
完结。
因为本人所在公司所有服务器的域名都是d001-d***和z001-z***这样的规则命名的,所以我就按这个规则写的解析主机列表,如果你的公司服务器明明规则不同(大部分人都会和我这里不同),那么重新写一个适合自己公司的解析函数即可。
我注释写的不是很多,但也写了几句,应该不至于看不懂吧。本文仅提供思想,仅供参考。