停止某个机房所有机器上包的脚本 pack_idc_stop.py
一、初衷:
鉴于公司的进程包package都是冗余多点部署的,一般一个idc机房有多台机器部署同一个package。当机房网络出问题的时候,我们不得不查到本机房部署了哪些package,并在包发布系统中一个个查询并停掉。这样就很费时费力。
利用包发布系统提供的一些接口stop.do等,做了个停掉某个机房所有package的脚本。只需之前把所有包名,机房名写入配置文件pack_idc.json,执行脚本时通过带不同的配置文件做为参数,即可实现批量停掉包的目的。
二、原理:
因为包发布系统的接口返回都是json,所以本脚本主要就是用post/get方法调用接口,处理json,利用dict、list做一些匹配、过滤、组合的操作。
主要用到:
python的urllib模块的urlopen(): http://www.cnblogs.com/langdashu/p/4963053.html
python解析json : http://www.cnblogs.com/langdashu/p/4963098.html
python判断内网IP : http://www.cnblogs.com/langdashu/p/4962657.html
python的字典、列表的应用
python脚本传参数、处理文件、json注释方法
三、实例:
pack_idc.json pack_idc_start.py pack_idc_stop.py
执行方法 python pack_idc_stop.py pack_idc.json
1、配置文件pack_idc.json
{
"pack_name":["yc_agent","duang_agent"],
"idc_name":"北京鲁谷BGP-01",
"comment":"这是注释"
}
pack_name可以是任意多个,idc_name必须唯一。若pack_name有一个不存在本idc上会自动过滤掉。
通过事先配置好不同的json文件,当需要停某个机房的package的时候,只需执行脚本带上相应的配置文件即可。
2、脚本pack_idc_stop.py
#!/usr/bin/python
#-*-coding:utf8-*- import urllib2
import json
import os
import sys vid = []
real_host = {}
real_match = {}
#判断内网IP
def ip_into_int(ip):
return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.'))) def is_internal_ip(ip):
ip = ip_into_int(ip)
net_a = ip_into_int('10.255.255.255') >> 24
net_b = ip_into_int('172.31.255.255') >> 20
net_c = ip_into_int('192.168.255.255') >> 16
return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 == net_c def match_idc(real_host, hname): for key in real_host.keys():
match_ip = []
t3 = len(real_host[key]) for n in range(t3):
name_url = 'http://www.google.com/getIp.do?ip=%s' % real_host[key][n]
name = urllib2.urlopen(name_url)
name_json = json.loads(name.read())
if name_json['object']['name'] == hname:
match_ip.append(real_host[key][n]) if len(match_ip) != 0:
real_match[key]=match_ip name.close()
return real_match def get_ips(vid): t = len(vid)
for i in range(t):
host_ip = []
ips_url = 'http://www.google.com/IP.do?versionId=%d ' % vid[i]
ips =urllib2.urlopen(ips_url)
ips_json = json.loads(ips.read()) t2 = len(ips_json['object'])
for k in range(t2):
flag = 0
ip_list = ips_json['object'][k].split(',') t3 =len(ip_list)
for m in range(t3):
if flag ==0 and is_internal_ip(ip_list[m]) == False:
host_ip.append(ip_list[m])
flag = 1 real_host[vid[i]] = host_ip ips.close()
return real_host def get_vid(pname): vid_url = 'http://www.google.com/Version.do?name=%s' % pname
html = urllib2.urlopen(vid_url)
hjson = json.loads(html.read()) t = len(hjson['object'])
if t == 0:
print "...................."
print "%s is not exist,please check the pack_name !!!" % pname
print "all pack start faild !!"
sys.exit()
for i in range(t):
count = hjson['object'][i]['count']
if count > 0:
vid.append(hjson['object'][i]['versionId'])
html.close() return vid def start_pack(real_match): for x in real_match.keys():
start_url = 'http://www.google.com/start.do?ips=%s&versionId=%s&operator=dw_%s' % (",".join(real_match[x]), x,os.getlogin())
start_html = urllib2.urlopen(start_url)
start_json = json.loads(start_html.read()) task_url = 'http://www.google.com/TaskId.do?task_id=%s' % start_json['object']['taskId']
task_html = urllib2.urlopen(task_url)
task_json = json.loads(task_html.read()) if start_json['code'] == 0:
print "package %s start succees!" % task_json['object'][0]['package_name']
else:
print "package %s start error!" % task_json['object'][0]['package_name'] start_html.close()
task_html.close() if __name__=='__main__':
if len(sys.argv) != 2:
print "Usage: python pack_idc_stop.py xxxx.json"
sys.exit() with open(sys.argv[1]) as f:
data = f.read()
pack_idc = json.loads(data) t = len(pack_idc['pack_name'])
hname = pack_idc['idc_name']
for n in range(t):
pname = pack_idc['pack_name'][n]
print "starting %s on %s ...... " % (pname, hname)
vid = get_vid(pname)
print '..............'
real_host = get_ips(vid)
real_match = match_idc(real_host, hname)
start_pack(real_match)
停止某个机房所有机器上包的脚本 pack_idc_stop.py的更多相关文章
- java调用机器上的shell脚本
java调用机器上的shell脚本,可以这样方便的通过shell脚本调用本机的C.C++等程序 Process process = null; Runtime runTime = Runtime.ge ...
- ssh远程执行目标机器上的命令
一句话: ssh -t -p 端口号 用户名@远程机器IP '远程机器上的命令完整路径' 例如: ssh -t -p 22 yangjunming@dev '/opt/app/deploy.sh' 注 ...
- jenkins中通过Publish Over SSH将项目部署到远程机器上
Publish Over SSH插件使用在使用Publish Over SSH之前,需要制作SSH私钥.机器间做免密登录配置.假设机器A,ip为192.168.AA.AAA,机器B: 192.168. ...
- 在Linux机器上安装MySQL
在Linux机器上安装MySQL,仔细认真些就没有问题. CentOS 7下MySQL 5.7安装.配置与应用_数据库技术_Linux公社-Linux系统门户网站 搞不定的话,直接删掉这个MySQL, ...
- 关于LogStash运行在AIX 64位机器上的问题与临时解决方案
需求;logstash运行在SUSE,LINUX,PPC LINUX,AIX机器上,并监控文件发送日志到KAFKA中去, 问题:在AIX机器上,file插件总是报异常,无法完成数据的读取 NotImp ...
- 用pf透明地将流量从一台机器转到另一台机器上的缘起及实现方式对比
下面是也是我在12580工作时发生的事情,重新记录并发出来.这种特殊需求很考 验PF的功底.在新旧系统并存,做重构的时候有时很需要这种救急的作法.一.缘起miscweb1(172.16.88.228) ...
- 在同一台机器上让Microsoft SQL Server 2000/ SQL2005/ SQL2008共存
可能很多朋友都遇到想同时在自己的机器上运行Microsoft SQL Server 2000以及Microsoft SQL Server 2005和Microsoft SQL Server 2008. ...
- 如何在同一台机器上安装多个MySQL的实例
转自:'http://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的 ...
- 在多机器上远程执行JMeter
安装完jmeter之后直接执行%InstallDir%\apache-jmeter-3.2\bin\JMeter.bat可以启动UI界面,可以编辑或者执行TestPlan等,默认情况下,用例是在本机执 ...
随机推荐
- HDU-5783 Divide the Sequence(贪心)
题目大意:给一个整数序列,将其划分成若干个子连续序列,使其每个子序列的前缀和不为负.求最大的划分个数. 题目分析:从后往做累加计算,如果不为负,则计数加一,累加和清0.否则,一直往前扫描.如果最终的和 ...
- POJ-2991 Crane(区间更新+向量旋转)
题目大意:n个向量首尾相连,每次操作使某个区间中的所有向量都旋转同样的角度.每次操作后都回答最后一个向量的坐标. 题目分析:区间维护向量信息.向量旋转:x1=x0*cos(t)-y0*sin(t),y ...
- socket模块
1 1.1 server: #!/use/local/env python# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1', 99 ...
- Valgrind简单用法
Valgrind的主要作者Julian Seward刚获得了今年的Google-O'Reilly开源大奖之一──Best Tool Maker.让我们一起来看一下他的作品.Valgrind是运行在Li ...
- Unix Linux 编程书籍
UNIX环境高级编程(第3版) Advanced Programming in the UNIX Environment Linux/UNIX系统编程手册 Linux/UNIX系统编程手册 (豆瓣) ...
- ADC 分辨率和精度的区别
分辨率和精度这两个,经常拿在一起说,才接触的时候经常混为一谈.对于ADC来说,这两样也是非常重要的参数,往往也决定了芯片价格,显然,我们都清楚同一个系列,16位AD一般比12位AD价格贵,但是同样是1 ...
- linux mount (挂载命令)详解
挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...
- dir:一行代码,提取出所有视频文件名称及路径
某次,部门接到一个任务,要求对公司现有的视频文件资料做一个统计整理分类的工作. 领导召集开会,问:两周时间够用吗? 统计整理分类工作的第一步骤是把视频文件名称来源类别信息录入到 excel 表格中,才 ...
- Linux-同步异步非阻塞阻塞的解析
一.理解同步.异步.阻塞.非阻塞 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(同步阻塞) 老张觉得自己有点傻. 2 老张把水壶放到火上 ...
- python数据库连接池
python数据库连接池 import psycopg2 import psycopg2.pool dbpool=psycopg2.pool.PersistentConnectionPool(1,1, ...