Shell-服务器一键初始化常用配置信息

By timebusker on September 29, 2018

Shell-服务器一键初始化常用配置信息 SSH服务设置、集群免密登录设置、网络IP配置、主机名配置…..

服务器一键初始化常用配置信息

#!/bin/bash -d
# 启用调试模式#!/bin/bash -d
# 读取脚本配置信息
# Shell编码使用UTF-8,避免乱码
sub_ipaddr=$1
cluster_name=hdp-cluster
NETMASK=255.255.255.0
GATEWAY=12.12.12.2
# 公共服务器
COMMON_SERVER=12.12.12.6
USER=root
PASSWORD=timebusker
ISSURE=yes

if [ ! -n "$sub_ipaddr" ] ; then 
   echo "请正确输入IP地址!"
   exit
fi
if [ ! -n "$cluster_name" ] ; then 
   echo "请正确输入集群服务名称!"
   exit
fi

#常用配置信息
#终端vim中文乱码
cat > /root/.vimrc <<EOF
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set enc=utf8
set fencs=utf8,gbk,gb2312,gb18030
EOF

#关闭邮件提醒——`You have new mail in /var/spool/mail/root`
echo "unset MAILCHECK">> /etc/profile

#配置SSH服务
sed -i "s/^#RSAAuthentication\ yes/RSAAuthentication\ yes/g" /etc/ssh/sshd_config
sed -i "s/^#PubkeyAuthentication\ yes/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#AuthorizedKeysFile* /AuthorizedKeysFile\ .ssh/authorized_keys/g" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin\ yes/PermitRootLogin\ yes/g" /etc/ssh/sshd_config
sed -i "s/^#PasswordAuthentication\ yes/PasswordAuthentication\ yes/g" /etc/ssh/sshd_config
#解决SSH连接缓慢甚至导致`Connection closed by 12.12.12.23`情况
sed -i "s/^GSSAPIAuthentication\ yes/GSSAPIAuthentication\  no/g" /etc/ssh/sshd_config

#读取正在使用的网卡信息
net_card=$(ifconfig -a | grep 'Link encap:Ethernet' | awk '{print $1}')
ipaddr=$(echo $GATEWAY | cut -d '.' -f 1-3).$sub_ipaddr
echo "net_card:$net_card      ipaddr:$ipaddr"
#配置网络
#使用EOF(任意标志)分解符标注输入流内容
rm -f /etc/sysconfig/network-scripts/ifcfg-eth* 
cat > "/etc/sysconfig/network-scripts/ifcfg-$net_card" <<EOF
DEVICE=$net_card
#HWADDR=00:0C:29:54:F3:3D
TYPE=Ethernet
#UUID=d90f4fb6-f73c-4459-99e5-30ba2e611728
ONBOOT=yes
NM_CONTROLLED=yes
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=$ipaddr
NETMASK=$NETMASK
GATEWAY=$GATEWAY
EOF

#设置主机名
hostsname="$cluster_name-$sub_ipaddr"
sed -i "s/HOSTNAME.*/HOSTNAME=$hostsname/" /etc/sysconfig/network

#SSH秘钥
rm -rf /root/.ssh/*
ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa

# 中途重启重置网络,保障网络通
service network restart

# 判断是否在当前公共服务主机上操作
if [ "$ipaddr" -eq  "$COMMON_SERVER" ] ; then
    cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
	echo "$ipaddr     $hostsname" >> /etc/hosts
	exit
fi

#集群同步hosts和SSH秘钥
/usr/bin/expect <<EOF
    # 默认情况下,timeout是10秒
    set timeout 10
    spawn ssh $USER@$COMMON_SERVER
	# expect { 之间保留空格
    expect {
       "(yes/no)?" {
	     # send命令中“\r”表示换行,作为命令分割
         send "$ISSURE\r";
		 # exp_continue会重新从当前expect块的开始重新执行
    	 exp_continue
       }
       "password:" {
         send "$PASSWORD\r";
    	 exp_continue
       }
    }
	expect "Last login:"
	# 删除IP对应已有的主机名
	send "sed -i '/$ipaddr/d' /etc/hosts\r"
	#新增主机名
	send "echo '$ipaddr     $hostsname' >> /etc/hosts\r"
    send "exit\r"
	# expect eof : 退出远程登录
    expect eof
	# interact :执行完成后保持交互状态,把控制权交给控制台(依然连接在远程终端上)
	# interact
EOF
echo "完成主机名信息收集..."
/usr/bin/expect <<-EOF
    set timeout 10
    spawn ssh-copy-id $USER@$COMMON_SERVER
    expect {
       "(yes/no)?" {
         send "$ISSURE\r";
    	 exp_continue
       }
       "password:" {
         send "$PASSWORD\r";
    	 exp_continue
       }
    }
    # interact
EOF
echo "完成主机公钥信息收集..."
#暂停,等待所有服务执行完毕,沉睡2分钟
sleep 120
echo "进入睡眠等待信息同步"
# 远程文件拷贝到本地
/usr/bin/expect <<EOF
    set timeout 10
    spawn scp $USER@$COMMON_SERVER:/root/.ssh/authorized_keys /root/.ssh/authorized_keys
    expect {
       "(yes/no)?" {
         send "$ISSURE\r";
    	 exp_continue
       }
       "password:" {
         send "$PASSWORD\r";
    	 exp_continue
       }
    }
    # interact
EOF
echo "完成主机公钥信息同步..."
/usr/bin/expect <<EOF
    set timeout 10
    spawn scp $USER@$COMMON_SERVER:/etc/hosts /etc/hosts
    expect {
       "(yes/no)?" {
         send "$ISSURE\r";
    	 exp_continue
       }
       "password:" {
         send "$PASSWORD\r";
    	 exp_continue
       }
    }
    # interact
EOF
echo "完成主机名信息同步..."
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
echo '_________Linux Server Opertioned!!!_________'
sleep 10

# 重启服务,更新所有配置
reboot