您的位置:首页 > 运维架构

停止某个机房所有机器上包的脚本 pack_idc_stop.py

2015-11-13 16:08 411 查看
一、初衷:

  鉴于公司的进程包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 : /article/5636205.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]

name = urllib2.urlopen(name_url)
name_json = json.loads(name.read())
if name_json['object']['name'] == hname:
match_ip.append(real_host[key]
)

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']

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: