公司的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 < 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 '"\  $1:8801"'' /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加密的方式;