以传统的方式,当你需要操作多台服务器上的多个Tomcat服务时:
最无脑的操作,当然是登录到每个服务器上面,然后再依次去启动每个Tomcat服务。
或者通过python脚本来控制的,通过ssh远程启动Tomcat服务,就像这样:
import os
# 远程服务器1
os.system("ssh root@[ 远程服务器ip1 ] [ tomcat服务名1 ]/bin/startup.sh")
os.system("ssh root@[ 远程服务器ip1 ] [ tomcat服务名2 ]/bin/startup.sh”)
# 远程服务器2
os.system("ssh root@[ 远程服务器ip2 ] [ tomcat服务名1 ]/bin/startup.sh")
os.system("ssh root@[ 远程服务器ip2 ] [ tomcat服务名2 ]/bin/startup.sh")
...
## 多一个Tomcat服务,就多一行
恩...上面这种虽然能达到目的效果,但是脚本里面很多冗余的代码,重复的片段比较多,我们可以稍微优化一下,就用Python里面的列表功能来操作一下:
import os
# 有多少个服务器,就定义多少个列表
tomcatA = ["tomcat服务1" , "tomcat服务2"]
tomcatB = ["tomcat服务1" , "tomcat服务2"]
# 遍历列表,启动tomcat服务器上所有的tomcat:
for tomcatName in tomcatA:
command = "ssh root@服务器ip1" + "/opt/" + tomcatName +"/bin/startup.sh"
os.system(command)
for tomcatName in tomcatB:
command = "ssh root@服务器ip2" + "/opt/" + tomcatName +"/bin/startup.sh"
os.system(command)
恩...上面这种已经有点优化效果了,服务器不增加的情况,每增多一个Tomcat,只需要在相应的列表里面加上Tomcat名。服务器增加一台,就多一个for循环。
现在看看终极优化,引入字典:
#!/usr/bin/python3
# author 老板你再这样我要删库了
import os
# 字典的key对应所有服务器IP,字典的value对应一个列表。
info = {
"服务器ip1" : ["tomcat1"],
"服务器ip2" : ["tomcat2" , "tomcat3"]
}
# 遍历所有IP
for serverIP in info.keys():
# 遍历所有Tomcat名
for tomcatName in info[serverIp]:
command = "ssh root@" + info[serverIp] + " " + "/opt/" + tomcatName + "/bin/startup.sh"
os.system(command)
因为这是教程,我也就随便写写,观想的是2台服务器,每台服务器一两个Tomcat的情况,从代码行数上来看好像都差不多,但实际场景中,十几二十台服务器都是少的,每个服务器上Tomcat数量又不一样。
采用字典的方式,多一台服务器,也就是多一个键值对,多一个Tomcat就在列表里加多一个元素,从扩展方面来讲,这就很溜了。