公司的P2PServer的扩容有以下几点:
1)P2PServer.conf需要添加当前流量最小的p2pstun的外网IP地址,这一步手动输入;
2)GMS的Group.xml需要把新的P2PServer外网IP地址添加进去,这一步使用sshpass来实现;
3)数据库服务器需要把新的P2PServer外网IP地址写进insert语句里去,这一步同样使用sshpass来实现;
这个脚本我犯懒,就直接用shell写了,内容如下:
#!/bin/bash #Author:ChrisChan@2017-09-20 #这个脚本用于乐橙P2PServer的扩容 ip=$(ifconfig eth1 | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2}') echo "本机的外网IP是:"$ip echo "准备启动乐橙P2PServer的扩容..." sleep 1 echo "3..." sleep 1 echo "2..." sleep 1 echo "1..." #添加开机启动项 echo "cd /opt/server && ./stopAll.sh" >> /etc/rc.d/rc.local echo "cd /opt/server && nohup python P2PServerDog.py 1>/dev/null 2>&1 &" >> /etc/rc.d/rc.local echo "开机启动已经添加完毕!" #解压缩server文件夹 cd /share/yunwei/p2p/ && tar -zxvf server.tar.gz -C /opt/ #安装sshpass yum install -y sshpass echo "sshpass已经安装完毕!" echo "数据库服务器密码" > /root/mysql.passwd echo "gms服务器密码" > /root/gms.passwd #修改p2pserver.conf并且启动狗 read -p "请输入你要添加的p2pstun的外网IP地址:" stun sed -i "s/STUN_IP =/STUN_IP = $stun"/ /opt/server/P2PServer.conf nohup python ./P2PServerDog.py > /dev/null 2>&1 & echo "P2PServerDog已经启动..." #更改GMS的Group.xml sshpass -f /root/gms.passwd ssh -o "StrictHostKeyChecking no" root@gms服务器IP地址 "sh /root/addip.sh $ip" #生成数据库语句并执行 cat <<EOF > p2pserver.sql insert into third_service(host, port, create_time, weight) values('$ip', 8800, now(), 100); EOF sshpass -f /root/civil.passwd ssh -o "StrictHostKeyChecking no" root@数据库服务器IP地址 'MYSQL_PWD=you_password mysql -uroot -p your_db' < p2pserver.sql echo "数据库语句已经添加完毕...如果要删除,请用'delete from third_service where id = 新ID号;'来>删除。" echo "P2PServer扩容完成,感谢您的使用!"
在GMS的服务器上需要一个addip.sh,内容如下:
#!/bin/bash #Author:ChrisChan@2017-09-20 #这个脚本用于Group.xml的修改 sed -i '$i '"\ <Server>$1:8801</Server>"'' /root/Group.xml pid=$(ps -ef | grep GMS | grep -v 'grep' | grep -v 'GMSDog' | awk '{print $2}') #获取到GMS的进程号,并且重启 kill -9 $pid sleep 20
本地执行效果如下:
在GMS查看Group.xml,已经将新的IP地址添加到Group.xml里:
在数据库里查看语句,也达到了新增的目的:
新的知识点!
1)sshpass里具体执行的command是在远程服务器上执行,以本文为例,如果变量ip使用的是单引号的话,那么远程的服务器是无法获取到这个值的,所以应该用的是双引号;
2)这种直接将命令行写入ssh参数的做法很容易造成引号嵌套地狱,虽然看上去你的脚本很酷,但是维护起来很麻烦,所以还是推荐在本地写一个脚本,然后远程执行这个脚本;
3)这个脚本里面有密码明文,如果你觉得这样不安全,可以采用其他AES加密的方式;