最近因为在学运维,所以开了很多虚拟机,这些虚拟机需要安装很多相同的初始组件,一个一个安装太费劲了,然后就根据我所学的shell脚本知识写了一个批量部署应用的脚本:
#!/bin/bash
if [ "$#" -lt 2 ];then
echo "Arg error!"
exit 2;
fi
if [ ! -f "$1" ];then
echo "$1 not found!"
exit 1;
fi
if [ $2 = "-script" ];then
if [ -f $3 ];then echo "Script mode." && command=$(cat $3);fi
else
command=$2
fi
while read line
#逐行读取文件并将行的内容赋给变量line
do
if [ "$line" != "" ];then
host=$(echo "$line"|awk {'print $1'})
#利用awk获取文件中的各种参数,包括用户名,密码,主机地址
user=$(echo "$line"|awk {'print $2'})
pwd=$(echo "$line"|awk {'print $3'})
echo "$host is execing command:$2 login:$user"
nohup sshpass -p $pwd ssh $user@$host <<-EOF &
#将程序挂入后台运行,日志将会输出在nohup.out
$command
#在远程主机中执行命令
exit
EOF
fi
done <$1
#yum update -y && yum install -y libcurl-devel wget tar gcc make zip unzip openssl openssl-devel gcc libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
这个脚本的核心是由sshpass和<<-EOF支撑的
<<-EOF可以将后面的参数传入sshpass命令实现由此自动部署
主机文件配置格式和样例:
格式:主机IP 用户名 密码
样例:
192.168.10.73 root 123456
192.168.10.74 root 123456
192.168.10.75 root 123456
192.168.10.76 root 123456
192.168.10.77 root 123456
192.168.10.78 root 123456
注意:文件最后一定要有一个空行,要不然最后一个主机将不会执行任何操作
脚本用法:scriptname.sh <主机列表文件> <要执行的命令|-script> [脚本路径]
可以使用tail -f nohup.out实时跟踪脚本执行结果