指定新实例的后缀名和端口号,自动化配置并创建新的实例。
#!/bin/bash
# Setup Another Mongodb Instance
# -- all you need to do is defining two vars below
#
# suffix : distinguish from standart mongodb instance
# e.g standard mongodb instance conf-file : /etc/mongod.conf
# this new created instance conf-file : /etc/mongod-new.conf : which will add suffix 'new'
# mongodb-port : distinguish from the standard port 27017
#
suffix=new
mongodb_port=27000
####### START
log=/tmp/setup_multiple_mongodb_instance_$(date +%F).log
echo "------- HEAD: start setup multiple mongodb instance at $(date +'%F %T')" > $log
##### Confirm Environment (think twice if u want to change this)
echo "" >> $log
echo "----- Confirm Environment" >> $log
run_dir=/var/run/mongodb-$suffix
log_dir=/var/log/mongodb-$suffix
data_dir=/var/lib/mongo-$suffix
conf_file=/etc/mongod-$suffix.conf
mongodb_service=/etc/systemd/system/mongod-$suffix.service
mongodb_user=mongod
mongodb_group=mongod
echo "- runtime dir of new instance is : $run_dir" >> $log
echo "- log dir of new instance is : $log_dir" >> $log
echo "- data dir of new instance is : $data_dir" >> $log
echo "- conf file of new instance is : $conf_file" >> $log
echo "- service name of new instance is : $mongodb_service" >> $log
echo "- default user of new instance is : $mongodb_user" >> $log
echo "- default group of new instance is : $mongodb_group" >> $log
##### Create Directory and Setup SELinux
echo "" >> $log
echo "----- Create Directory and Setup SELinux" >> $log
declare -A selinux_t
selinux_t[$run_dir]=mongod_var_run_t
selinux_t[$log_dir]=mongod_log_t
selinux_t[$data_dir]=mongod_var_lib_t
for dir in $run_dir $log_dir $data_dir
do
if [ ! -d $dir ]
then
mkdir -p $dir
fi
chown -R $mongodb_user.$mongodb_group $dir >> $log
semanage fcontext -a -t ${selinux_t[$dir]} "$dir.*" &>> $log
chcon -Rv -u system_u -t ${selinux_t[$dir]} "$dir" >> $log
restorecon -R -v "$dir" >> $log
done
##### SELinux the Custom Port
echo "" >> $log
echo "----- SELinux the Custom Port" >> $log
semanage port -l | grep mongod_port_t | grep $mongodb_port >> $log
if [ $? == 1 ]
then
semanage port -a -t mongod_port_t -p tcp $mongodb_port >> $log
semanage port -l | grep mongod_port_t >> $log
fi
##### Custom Config File
echo "" >> $log
echo "----- Custom Config file" >> $log
echo "- custom mongodb config file locate: $conf_file" >> $log
cat > $conf_file << EOF
systemLog:
destination: file
logAppend: true
path: $log_dir/mongod.log
storage:
dbPath: $data_dir
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: $run_dir/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: $mongodb_port
bindIp: 127.0.0.1
EOF
##### Custom Systemd Service
echo "" >> $log
echo "----- Custom Systemd Service" >> $log
cat > $mongodb_service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=$mongodb_user
Group=$mongodb_group
Environment="OPTIONS=-f $conf_file"
ExecStart=/usr/bin/mongod \$OPTIONS
ExecStartPre=/usr/bin/mkdir -p $run_dir
ExecStartPre=/usr/bin/chown $mongodb_user:$mongodb_group $run_dir
ExecStartPre=/usr/bin/chmod 0755 $run_dir
PermissionsStartOnly=true
PIDFile=$run_dir/mongod.pid
Type=forking
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
LimitMEMLOCK=infinity
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
EOF
echo "- custom mongodb service file locate: $mongodb_service" >> $log
systemctl daemon-reload >> $log
####### FINISH
echo "" >> $log
echo "------- TAIL: finish setup multiple mongodb instance at $(date +'%F %T')" >> $log
# User Prompt
echo "Setup work seems done!"
echo "Now you can either check the setup log file \"$log\" to see if had something wrong."
echo "Or just start the service directly with command : \"systemctl start mongod-$suffix.service\" "
echo "Then log into mongodb with command : \"mongo --port $mongodb_port\" "