expect命令通过预测远程终端将要显示的提示字符串,自动输入密码或其他用户指定的字符串,实现自动化安装。有关expect命令的使用方法请见:
shell脚本学习之expect命令 http://www.linuxidc.com/Linux/2014-02/96262.htm
有关实现Hadoop集群一键安装的步骤,首先写好需要分发到集群每台机器上运行的脚本,然后保证你的管理结点已安装tcl、expect、JDK、Hadoop安装包、hosts文件、profile文件、authorized_keys。
将集群的机器列表写到一个文件中,其中要包括IP地址、域名、root用户密码、Hadoop管理账户名、Hadoop管理账户密码。
将需要运行的shell脚本scp到需要安装Hadoop的机器上,过程中需要使用expect。之后再使用ssh执行远程机器上的shell脚本。所有的expect语句都写在一个exp文件中,通过给每个命令set一个type来区分执行的是哪个命令。
安装配置Hadoop集群的步骤这里就不细讲,主要说一下如何使用expect命令实现自动化安装。例如在集群的每台机器上新建一个用户,你可以这么做:
在管理结点上有脚本run.sh
#!/bin/bash host_ip=192.168.71.202 pwd_root=iflytek pwd_jcsong=iflytek echo "Start create user jcosng..." expect ./login.exp $host_ip root $pwd_root jcsong $pwd_jcsong
脚本login.exp
#!/usr/bin/expect -f set timeout 300 set ip_addr [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set newuser [lindex $argv 3] set newpwd [lindex $argv 4] spawn ssh "$user@$ip_addr" bash "/home/adduser.sh $newuser" expect "Enter new UNIX password:" send "$newpwdr" sleep 1 expect "Retype new UNIX password:" send "$newpwdr" sleep 1 for {set i 0} {$i<5} {incr i} { expect ":" send "r" sleep 1 }
puts "r" send "r" expect "n]" send "Yr"
为了演示的方便,这里的所有参数大部分都是直接写到脚本里的,其实这些参数应该从一个集群列表中读取。在安装之前首先要scp安装脚本到集群的每台机器中去,其他步骤也大致如此。