最近项目迎来第一次封测,弄了十几台云服务器用来部署服务器。所有服务器运行环境需要配置的软件等基本都是一样的,所以直接就想到用shell脚本来搞了,折腾了一下,总算是搞定了,虽然脚本是写得比较low。
整个部署分为两个部分,一个是为服务器创建新的账号(默认只有root账号)并进行硬盘挂载,而另一个则是进行相关软件的安装等。因为这第二个部分是在第二天才完成的,所以才分开的。
1. 第一部分
两个脚本scp_servers.sh和init_server.sh内容分别如下:
#!/bin/bash
#scp_servers.sh
array_ip=(
"192.168.3.123"
"192.168.3.124"
)
root_passwd=""
for ip in ${array_ip[@]}
do
ssh-keygen -R $ip
sshpass -p $root_passwd scp init_server.sh root@$ip:/root/
sshpass -p $root_passwd ssh root@$ip "chmod +x init_server.sh && ./init_server.sh"
done
#!/bin/bash
#init_server.sh
password=""
user=""
i=`ls /home | grep $user | wc -l`
if [ $i -le 0 ]; then
adduser $user
echo "add user $user"
fi
echo -e "$password\n$password" | passwd $user
i=`cat /etc/sudoers | grep $user | wc -l`
if [ $i -le 0 ]; then
echo "$user ALL=(ALL) ALL" >> /etc/sudoers
echo "add $user to sudoer"
fi
chown $user:$user /home/$user/log
i=`ls /home/$user | grep log | wc -l`
if [ $i -le 0 ]; then
mkfs.ext4 /dev/vdb
mkdir /home/$user/log
echo "/dev/vdb /home/$user/log ext4 defaults 0 0" >> /etc/fstab
mount -a
echo "mount vdb to log"
fi
scp_servers.sh脚本做的比较简单,就是将init_server.sh脚本scp到所有服务器并执行。
init_server.sh首先看下指定账号user是否被创建,没有则创建账号。然后设置密码,这里设置密码的用echo -e "$passwd\n$passwd"实现了密码的二次输入。接着看/etc/sudoers文件中是否对user添加了超级权限,没有的话则添加。最后一步,则是判断额外的硬盘分区是否被挂载了,因为是固定被挂载到目录/home/user/log上,所以这里是通过检查目录/home/user/log是否存在来判断。如果没有被挂载,则先对分区进行格式化,创建/home/user/log目录,/etc/fstab中添加相关挂载信息,最后mount -a实现挂载,至此,所有操作完成。
scp_servers.sh中,使用sshpass命令来直接指定scp时需要输入的密码,因为像前面说到的echo -e的方式对scp命令似乎并没有用,所以用sshpass命令来实现。而init_server.sh中,那么多次预先判断是因为不断调试中也不断在执行脚本,所以已经执行过的就不需要再重复操作了。
最后一点,由于ssh或者scp时如果是第一次执行操作的远程主机,需要手动输入yes确认并将该主机相关信息添加到“/home/cobyeah/.ssh/known_hosts”文件中。所以导致执行scp_servers.sh时,对没有连接过的主机会出现“Host key verification failed.”及对端主机校验失败的错误,相关scp及ssh操作失败。这个时候可以通过临时修改/etc/ssh/ssh_config文件中StrickHostKeyChecking配置项为"StrictHostKeyChecking no",然后再执行scp_servers.sh就可以了。执行完之后记得该配置项改回来就行。
2. 第二部分
第二部分涉及到三个脚本scp_init_env.sh、init_env.sh、init_bash.sh。
#!/bin/bash
#scp_init_env.sh
array_ip=(
"192.168.2.123"
"192.168.2.124"
)
root_passwd=""
user=""
passwd=""
for ip in ${array_ip[@]}
do
ssh-keygen -R $ip
sshpass -p $passwd ssh $user@$ip "mkdir /home/$user/tools"
sshpass -p $root_passwd scp init_env.sh root@$ip:/home/$user/tools/
sshpass -p $root_passwd scp boost_1_54_0.tar.gz root@$ip:/home/$user/tools/
sshpass -p $root_passwd ssh root@$ip "cd /home/$user/tools && chmod +x init_env.sh && ./init_env.sh"
sshpass -p $passwd scp init_bash.sh $user@$ip:/home/$user/tools/
sshpass -p $passwd ssh $user@$ip "cd /home/$user/tools && chmod +x init_bash.sh && ./init_bash.sh"
done
#!/bin/bash
#init_env.sh
user=""
cd /home/$user/tools
if [ ! -d "boost_1_54_0" ]; then
tar zxvf boost_1_54_0.tar.gz
fi
yum install -y libstdc++-devel
yum install -y gcc-c++
yum install -y gcc
yum install -y python-devel
yum install -y bzip2-devel
yum install -y libunwind
yum install -y zlib-devel
yum install -y gperftools
yum install -y libicu
yum install -y libicu-devel
cd boost_1_54_0
./bootstrap.sh
./b2 install > install.log
#!/bin/bash
#init_bash.sh
i=`cat ~/.bashrc | grep "/usr/lib:/usr/local/lib" | wc -l`
if [ $i -le 0 ]; then
echo 'export LD_LIBRARY_PATH="/usr/lib64:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
fi
scp_init_env.sh脚本主要是将init_bash.sh、init_env.sh及指定版本boost文件放到所有服务器指定目录上,并解压缩boost文件。然后执行init_env.sh及init_bash.sh文件。
init_env.sh主要是执行boost依赖软件的安装及boost软件的安装,yum install默认需要用户输入y、N等来进行安装确认的,这里加了-y选项就不需要确认操作而是默认直接安装了。
init_bash.sh是设置LD_LIBRARY_PATH环境变量,将boost编译出来的链接库所在路径添加到环境变量中,否则运行进程时会出现找不到指定链接库的错误。
将init_bash.sh和init_env.sh的操作分开到两个文件是因为一个是root账户执行(否则需要sudo还需要输入密码),另一个则是普通账户(现在想起其实也可以用root账户然后直接用.bashrc文件的绝对路径)。
记录完毕,当然肯定有更好的方法实现上面的需求,这只是自己临时弄的,也记录下吧。