自定义参数
KEYFILE_PWD= #服务器密码
EMONGO_NAME= #MONGO部署包名称
MONGO_PATH= #MONGO安装路径
MONGO_PORT=#MONGO端口
MONGO_USER_NAME= #设置MONGO普通用户
PKG_NAM= #PKG包名
ROOT_PASSWD= #设置root用户密码
TEMP_PATH= #临时目录
USER_NAME = #启动用户账号
USER_PASSWD = #设置普通用户密码
部署参数检查
#!/bin/bash
# 检查参数是否设置
echo "====检查参数是否设置====="
if [ ! $TEMP_PATH ];then
echo "=====$TEMP_PATH 此参数未设置,请检查!====="
exit 1
fi
if [ ! $MONGO_PATH ];then
echo "=====$MONGO_PATH 此参数未设置,请检查!====="
exit 1
fi
if [ ! $KEYFILE_PWD ];then
echo "=====$KEYFILE_PWD 此参数未设置,请检查!====="
exit 1
fi
if [ ! $ROOT_PASSWD ];then
echo "=====$ROOT_PASSWD 此参数未设置,请检查!====="
exit 1
fi
if [ ! $MONGO_PORT ];then
echo "=====$MONGO_PORT 此参数未设置,请检查!====="
exit 1
fi
ISSTART=$(netstat -nutlp|grep ${MONGO_PORT}|grep -v "grep"|wc -l)
# 检查端口是否已被监听
echo "=====检查端口是否已被监听====="
if [ "${ISSTART}" != "0" ]; then
echo "=====MONGO 启动端口已监听,请重新选择端口====="
exit 1
else
echo "=====MONGO 启动端口未监听,符合预期!====="
fi
# 检查目标目录是否存在
echo "=====检查目标目录是否存在====="
if [ ! -d $TEMP_PATH ];then
echo "=====$TEMP_PATH目录不存在,创建目录====="
mkdir -p $TEMP_PATH
else
echo "=====临时目录已存在,无需创建====="
fi
if [ ! -d $MONGO_PATH/$MONGO_PORT ];then
echo "=====$MONGO_PORT 目录不存在,创建目录====="
mkdir -p $MONGO_PATH/$MONGO_PORT/{app,conf,run,data,log}
else
echo "=====$MONGO_PORT目录已存在,退出安装====="
exit 1
fi
echo "=====部署前检查通过====="
上传并解压安装包
#!/bin/bash
pwd
# 解压压缩包到临时目录
echo "=====解压压缩包到临时目录====="
unzip -o $PKG_NAME.zip -d $TEMP_PATH
echo "=====查看解压后的内容====="
ls $TEMP_PATH/$PKG_NAME
# 解压mongo安装包到安装目录
echo "=====解压安装包到安装目录====="
cd $TEMP_PATH/$PKG_NAME
tar -xf $MONGO_NAME.tgz -C $MONGO_PATH/$MONGO_PORT
echo "=====查看解压后的内容====="
ls $MONGO_PATH/$MONGO_PORT/$MONGO_NAME
# 根据启动脚本调整目录
echo "=====根据启动脚本调整目录====="
\mv $MONGO_PATH/$MONGO_PORT/$MONGO_NAME/* $MONGO_PATH/$MONGO_PORT
rm -rf $MONGO_PATH/$MONGO_PORT/$MONGO_NAME
echo "=====查看调整后目录内的内容====="
ls $MONGO_PATH/$MONGO_PORT
创建keyFile文件并分发
#!/bin/bash
# 创建keyFile文件
echo "=====开始创建keyFile文件====="
cd ${MONGO_PATH}/${MONGO_PORT}/conf/
openssl rand -base64 753 > keyFile
chmod -R 600 keyFile
# 给普通用户授权
echo "=====给普通用户授权====="
chown -R ${USER_NAME}:${USER_NAME} ${MONGO_PATH}
# expect命令检查
echo "=====expect命令检查====="
which expect
if [ $? != 0 ]; then
yum -y install expect
else
echo "=====expect已安装====="
fi
#将keyFile传到从节点和仲裁节点
echo "=====将keyFile传到从节点和仲裁节点====="
/usr/bin/expect <<EOF
set timeout 30
spawn scp -rp ${MONGO_PATH}/${MONGO_PORT}/conf/keyFile root@${SECONDARY}:${MONGO_PATH}/${MONGO_PORT}/conf/
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$KEYFILE_PWD\r"}
}
expect eof
EOF
/usr/bin/expect <<EOF
set timeout 30
spawn scp -rp ${MONGO_PATH}/${MONGO_PORT}/conf/keyFile root@${ARBITER}:${MONGO_PATH}/${MONGO_PORT}/conf/
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$KEYFILE_PWD\r"}
}
expect eof
EOF
确认keyFile文件分发
#!/bin/bash
echo "=====确认keyFile文件分发是否成功====="
keyFilePath=$MONGO_PATH/$MONGO_PORT/conf/keyFile
keyFileSize=`ls -l $keyFilePath |awk '{print $5}'`
if [ -e $keyFilePath ] && [ $keyFileSize -gt 0 ];then
echo "keyFile文件已存在!"
else
echo "keyFile文件不存在,请重新上传!"
exit 1
fi
安装+设置启停脚本+启动
#!/bin/bash
# 拷贝模板配置文件到对应目录
echo "=====开始拷贝模板配置文件到对应目录====="
cd $TEMP_PATH/$PKG_NAME
\cp $MONGO_PORT.conf $MONGO_PATH/$MONGO_PORT/conf/$MONGO_PORT.conf
\cp $MONGO_PATH/$MONGO_PORT/bin/* /usr/bin/
chown -R ${USER_NAME}:${USER_NAME} $MONGO_PATH
echo "=====开始设置启动脚本====="
# 设置启动脚本
cat > /usr/lib/systemd/system/mongodb.service <<-EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=${USER_NAME}
Type=forking
ExecStart=/data/public/mongo/${MONGO_PORT}/bin/mongod --config /data/public/mongo/${MONGO_PORT}/conf/${MONGO_PORT}.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/public/mongo/${MONGO_PORT}/bin/mongod --shutdown --config /data/public/mongo/${MONGO_PORT}/conf/${MONGO_PORT}.conf
Restart=always
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
echo "=====启动并设置开机自启====="
systemctl daemon-reload
systemctl start mongodb.service
echo "=====启停方式:systemctl start|stop|restart mongodb====="
#按照端口判断,默认启动时间2分钟,判断两次,按需修改循环次数
echo "=====开始判断服务是否已启动成功====="
for((i=1;i<=12;i++));
do
sleep 10
ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "发现服务端口,为确保服务真正启动成功,等待15秒后进行第二次判断!"
sleep 15
ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "等待15秒后端口仍启动,服务第二次判断通过,服务启动成功!"
exit 0
else
echo "等待15秒后端口未启动,服务第二次判断失败,服务启动失败!"
exit 1
fi
else
echo "服务启动中,请等待!"
fi
done
echo "等待2分钟后未发现服务端口,服务启动失败!"
exit 1
设置主从+仲裁
#!/bin/bash
echo "=====开始设置主从+仲裁====="
mongo --port ${MONGO_PORT} <<EOF
use admin
config = {
'_id': 'replSet0',
'members': [
{_id:0,host:"${PRIMARY}:${MONGO_PORT}",priority:2},
{_id:1,host:"${SECONDARY}:${MONGO_PORT}",priority:1},
{_id:2,host:"${ARBITER}:${MONGO_PORT}",arbiterOnly:true}
]
}
rs.initiate(config)
rs.reconfig(config, {force: true})
rs.status()
EOF
echo "=====设置主从+仲裁完成====="
创建管理员角色
#!/bin/bash
#创建admin用户
echo "=====开始创建admin用户====="
sleep 20 # 多次测试,判断是默认刚启动为从状态,切换为主时有一定的时间延迟,因此添加sleep 20
mongo --port ${MONGO_PORT} <<EOF
use admin
db.createUser(
{
user: "root",
pwd: "${ROOT_PASSWD}",
roles: [
{ role: "root",db: "admin" }]
}
)
EOF
echo "=====admin用户创建完成====="
添加认证并重启服务
#!/bin/bash
# 修改配置文件
echo "=====开始修改配置文件====="
echo -e "\nauth=true" >> ${MONGO_PATH}/${MONGO_PORT}/conf/${MONGO_PORT}.conf
echo -e "\nkeyFile=${MONGO_PATH}/${MONGO_PORT}/conf/keyFile" >> ${MONGO_PATH}/${MONGO_PORT}/conf/${MONGO_PORT}.conf
echo "开始重启mongodb"
service mongodb restart
#按照端口判断,默认启动时间2分钟,判断两次,按需修改循环次数
echo "=====开始判断服务是否已启动成功====="
for((i=1;i<=12;i++));
do
sleep 10
ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "发现服务端口,为确保服务真正启动成功,等待15秒后进行第二次判断!"
sleep 15
ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "等待15秒后端口仍启动,服务第二次判断通过,服务启动成功!"
exit 0
else
echo "等待15秒后端口未启动,服务第二次判断失败,服务启动失败!"
exit 1
fi
else
echo "服务启动中,请等待!"
fi
done
echo "等待2分钟后未发现服务端口,服务启动失败!"
exit 1
判断集群状态
#!/bin/bash
CLUSTER_STATUS=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT}|grep stateStr |awk '{print $(NF-2) $(NF-1) $NF}'`
PRI_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep PRIMARY |wc -l`
SEC_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep SECONDARY |wc -l`
ARB_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep ARBITER |wc -l`
sleep 20 # 多次测试,判断是默认刚启动为从状态,切换为主时有一定的时间延迟,因此添加sleep 20
if [ ${PRI_NUM} == '1' ] && [ ${SEC_NUM} == '1' ] && [ ${ARB_NUM} == '1' ];then
echo "=====集群状态正常!====="
echo "$CLUSTER_STATUS"
else
echo "=====集群状态异常,请检查!====="
fi
清理临时目录安装包
rm -rf ${TEMP_PATH}
mkdir -p ${TEMP_PATH}