最近受命为系统增加一个紧急关机功能,刚开始想自己写个shell脚本来控制机群中的数百台机器的关闭,后来发现有现成的软件可以使用,这使得对分布式机群管理方便不少。下面先介绍一下PDSH.
PDSH(Parallel Distributed SHell) 可以并行的执行对目标机器的操作,它采用滑动窗口机制,当目标机器数不能填满窗口时,master主机(发出操作命令的机器)可以并行的对目标执行操作,当窗口满时,对剩余的目标机器的操作会等到窗口有空时才会调度填入窗口。当pdsh接收到SIGINT(CTRL+C)中断时,会显示当前运行的连接的状态。一秒内的第二次SIGINT将会结束pdsh线程。等待的线程是指那些还没被初始化,或正在和目标主机连接中的线程。这些线会在相距SIGINT一秒内的ctrl+z所取消。如果没有指定pdsh的command,则pdsh 以交互的方式运行。
其语法如下:
pdsh [options] ... command
方括号中用来指定目标主机及其它参数,command 用来指定在目标主机上所要执行的命令。
值得注意的是,使用pdsh 时,master该机必须用所要连接目标主机的用户具有无密码访问的权限,且连接时亦不询问yes 或no才可以对目标主机操作成功,具体无密码访问方法可以查阅其它资料。
所有的参数可以通过pdsh --help来查看,下面简要介绍一下其中的常用参数:
-w TARGET, .....
TARGET用来指示目标主机或目标的过滤条件,该参数不可和-a,-g同时使用,TARGET可以直接使用主机名或主机名列表,如“pdsh -w node1,node2,node3 date” (命令中不含引号,此处只是用来和文字加以隔离,下同) ,此命令用来查看node1,node2,node3上的时间。可以对目标主机指定范围,如“pdsh -w node[1-10] date” ,在node1到node10上执行date命令。如果目标主机名前有“-”,则表示将此主机从目标中排除,如“pdsh -w node[1-10] -node5 date” ,此命令的目标主机为node1至node4,node6至node10。如果目标前为“^”,则用来指示包含目标主机的文件,文件中每行一个该机名。如“pdsh -w /home/oralce/namelist date” 。如果以“-”开始,后跟“/”,则表示用来选择目标主机的正则表达式,如
pdsh -w host[0-20],/0$/ ...表示host0-host20中选择以0结尾的主机名。此外,目标主机前还可以加连接模块名及连接的用户名。如“pdsh -w ssh:oracle@node[1-10] date” ,表示使用ssh连接目标该机的oracle用户。
-x host,host,....
用来将主机排除在目标主机之外,一般和-a,-g连用。“^”,“/”,“-”用法与上相同,不再说明。
-l user
这个选项用来指定以user连接到目标主机上。
-t seconds
用来设置连接的超时时间,以秒为单位。默认为10秒。
-u seconds
用来设置远程命令执行的超时时间,以秒为单位,以ssh 连接 时,默认时间为无限。
-f number
用来设置同时连接的目标主机的个数,
-N
用来关闭目标主机所返回值前的主机名显示。
-g groupname
指定目标主机的组名
-X groupname
用来将组名内的主机从目标主机中排除。
-V
用来显示当前pdsh的版本信息及所加载的模块信息。
-L
用来显示当块所有加载的模块信息。
pdsh -R ssh -g all -l zhangjc sudo /sbin/shutdown -h 5
pdsh -u 1 -R ssh -g all -l zhangjc sudo /sbin/shutdown -h 5