通过阿里云服务器ID添加服务器资料到django的脚本

本文的环境是:centos 7 + django 2.0 + python 3.6

先给django里的project创建了models.py,里面内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.db import models

# Create your models here.
class ecs(models.Model):
name = models.CharField(verbose_name='云服务器名称',max_length=30)
ecsid = models.CharField(verbose_name='云服务器ID',max_length=30,default='')
inIP = models.GenericIPAddressField(verbose_name='云服务器内网地址')
outIP = models.GenericIPAddressField(verbose_name='云服务器外网地址')
osname = models.CharField(verbose_name='操作系统',max_length=50,default='')
networktype = models.CharField(verbose_name='网络类型',max_length=20)
CPU = models.IntegerField(verbose_name='云服务器CPU',default='2')
memory = models.IntegerField(verbose_name='云服务器内存',default='2048')
netwidth = models.IntegerField(verbose_name='云服务器外网带宽',default='0M')
signtime = models.DateField(auto_now_add=True)
remark = models.CharField(verbose_name='备注',max_length=255,blank=True)

可以看出这个就是一个很简单的云服务器的配置统计,但是要录入的阿里云服务器很多,一个一个手动输入实在太累,于是就要写一个脚本来达到django同步的效果!

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python
#coding=utf-8
#这个脚本通过查询阿里云服务器ID来达到同步django的目的
import json,pymysql
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest

clt = client.AcsClient('这里是ak','这里是sk','这里是地域名')

# 设置参数
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_accept_format('json')

request.add_query_param('RegionId', 'cn-hangzhou')
request.add_query_param('InstanceIds', ['这里是服务器ID']) #如果是多个服务器ID,可以继续往下写

# 发起请求
response = clt.do_action(request)

#print(response) #这里可以看一下返回的response,但是它是byte格式的
data=str(response, encoding = "utf-8")
ecs = json.loads(data) #转换成str格式
name = str(ecs['Instances']['Instance'][0]['InstanceName'])
ecsid = str(ecs['Instances']['Instance'][0]['InstanceId'])
inIP = str(ecs['Instances']['Instance'][0]['VpcAttributes']['PrivateIpAddress']['IpAddress'])[1:-1] #如果不加[1:-1]的话,得到的是一个IP外面还有中括号
outIP = str(ecs['Instances']['Instance'][0]['PublicIpAddress']['IpAddress'])[1:-1]
networktype = str(ecs['Instances']['Instance'][0]['InstanceNetworkType'])
CPU = int(ecs['Instances']['Instance'][0]['Cpu'])
memory = int(ecs['Instances']['Instance'][0]['Memory'])
osname = str(ecs['Instances']['Instance'][0]['OSName'])


#创建数据库连接,注意这里我加入了charset和cursorclass参数
conn = pymysql.connect(
host = "127.0.0.1",
user = "数据库账号",
password = "数据库密码",
database = "数据库名称",
charset = 'utf8',
cursorclass = pymysql.cursors.DictCursor)
#获取游标
cursor = conn.cursor()

#三个引号里如何加入变量
sql = """INSERT INTO ecs_ecs (name,ecsid,inIP,outIP,networktype,CPU,memory,netwidth,signtime,osname) VALUES (%(name)s,%(ecsid)s,%(inIP)s,%(outIP)s,%(networktype)s,%(CPU)d,%(memory)d,%(netwidth)d,NOW(),%(osname)s);""" % dict(name='\''+name+'\'',ecsid= '\''+ecsid+'\'',inIP=inIP,outIP=outIP,networktype='\''+networktype+'\'',CPU=CPU,memory=memory,netwidth=1,osname='\''+osname+'\'')

#print (sql) #在这里可以先看看sql输出的是否正确
cursor.execute(sql)

# 关闭数据库连接
conn.close()

正常来说应该是先建立一个def来获取阿里云服务器配置,再来一个def来将各配置录入到数据库里,同时让阿里云服务器的id作为变量,而且还要加上如果sql执行失败就回滚的语句。而我由于是临时使用,所以这个脚本按照流水式写下来的,不过不影响阅读。

ps.进化之后的脚本在我的github里,地址是: https://github.com/RorschachChan/chenWORK/blob/master/通过阿里云ID号将服务器信息同步到django.py

比如现在要添加一个服务器,这个服务器的id是:i-bp12ego6x9srzsytxeqo,如图:
akb48

那么对应填写好脚本里的ak/sk之后,就把i-bp12ego6x9srzsytxeqo填写到“服务器ID”的位置 ,执行这个脚本,结果如下:
akb48

不过这个脚本有两个缺点:
第一:如果阿里云服务器是中文名称,那么使用api查询出现的是十六进制的符号;
第二:如果服务器里没有外网IP或者是后开的临时带宽,那么在outIP的地方得到的值是空,sql语句会因为少一项而报错;
第三:这个api没有查询服务器带宽值的功能,还需要另外写一个脚本搭配。

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%