有时候我们需要在若干台linux主机上执行相同的命令,或者安装相同的软件,可以使用如下两种方法:

实验环境,有9台RHEL5.5_x64的主机,host表如下:

test-1 10.9.1.1

test-2 10.9.1.2

test-3 10.9.1.3

test-4 10.9.1.4

test-5 10.9.1.5

test-6 10.9.1.6

test-7 10.9.1.7

test-8 10.9.1.8

test-login 10.10.1.1

其中test-login为登陆节点,test-login到其他8台主机的ssh信任连接已经建立。

方法一:

for i in {1..8}; do ssh test-$i ‘hostname; mkdir –p /root/test’; done

如果ssh后面有多条命令要在远程主机上执行,必须用引号把所有的命令括起来,否则只会有第一条命令在远程主机上执行。

 

方法二:

安装tentakel, tentakel是一个可以在多台linux主机上执行相同命令的脚本。

下载tentakel-2.2.tgz,解压后make && make install

配制tentakel,把tentakel.conf.simple拷贝为/etc/tentakel.conf,编辑该配置文件:

# first section: global parameters
set ssh_path=”/usr/bin/ssh” //设置ssh的路径
set method=”ssh” //设置命令使用的方法,先ssh到目标主机,然后执行相关的命令
#set user=”root” # 设置ssh时使用的帐号,如果不指定,用户为使用tentakel的帐号
#set format=”%d %o\n”
#set maxparallel=”3″ # run at most 3 commands in parallel

# second section: groups
group default () //默认的组,也可以使用-g参数指定不同的主机组
@test

group test ()
+test-1
+test-2
+test-3
+test-4
+test-5
+test-6
+test-7
+test-8

group test-login ()
+test-login

group all ()
@test
@test-login

上面这个配制文件定义了三个主机组,@test包括了test1-test8这8台节点,@test-login包括了test-login这台节点,@all包括了@test和@test-login这两个主机组,共9台节点。同时定义了默认主机组为@test。

常用的参数:

tentakel –l 列出可用的主机组

tentakel –g groupname‘command’在groupname上执行command,command要用引号引起来。

配置完成以后发现报错:

tentakel –g test ‘hostname’
Traceback (most recent call last):
File “/usr/local/bin/tentakel”, line 42, in ?
import lekatnet.error as error
ImportError: No module named lekatnet.error

原因是没有拷贝lekatnet文件:cp -r py/lekatnet/ /usr/lib/python2.4/site-packages/

tentakel –g test ‘mkdir –p /root/test’