成本小,若自建机房:机柜你要准备,服务器要购买,网络设备得采集,还得花人去装,而使用云服务器的话,人力成本和时间都大大节省。
一般公司会考虑在多家公司买云,如我的业务在海外我会考虑aws,是办内政府单位首选阿里云。。。不同的需求对云的选择也不一样,甚至还自建私有云,那这样就涉及一个管理问题,怎样管理这么多云机器?
运维平台之多云管理:
(1)采集数据
(2)创建机器/扩容/关机/重启。。。等一些列云服务器的操作,若一台台云手动操作就费时费力。
示例:同步云服务器信息到运维平台
(1)从腾讯云qcloud对外提供的API接口,拿到腾讯云服务器数据--重点会调用云的api接口:
(python36env) [vagrant@CentOS7 devops]$ pip install tencentcloud-sdk-python
(python36env) [vagrant@CentOS7 devops]$ ipython
from tencentcloud.common import credential from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.cvm.v20170312 import cvm_client, models #实例化一个认证对象,需要传入腾讯云帐户secretid,secretkey---生成证书: cred = credential.Credential("AKIDMn9PKEVWmmX9Zktsa1B5rQoKwNXqniFV", "B7kYdT3PXTHs2VjiX6Q0MRcXEengEbhw") #实例化要请求的产品(这里以云服务器cvm为例)的client对象--创建一连接必须指定区域(你购买云时选定的区域): client = cvm_client.CvmClient(cred,"ap-beijing") #发起一获取服务器详细的请求:
先创建一请求: req = models.DescribeZonesRequest() #再发起此请求--通过client对象调用想要访问的接口: resp = client.DescribeZones(req) #输出字典格式的字符串: resp.to_json_string() 结果返回如下json数据:说明可用区域接口请求成功: '{"TotalCount": 5, "ZoneSet": [{"Zone": "ap-beijing-1", "ZoneName": "北京一区", "ZoneId": "800001", "ZoneState": "AVAILABLE"}, {"Zone": "ap-beijing-2", "ZoneName": "北京二区", "ZoneId": "800002", "ZoneState": "AVAILABLE"}, {"Zone": "ap-beijing-3", "ZoneName": "北京三区", "ZoneId": "800003", "ZoneState": "AVAILABLE"}, {"Zone": "ap-beijing-4", "ZoneName": "北京四区", "ZoneId": "800004", "ZoneState": "AVAILABLE"}, {"Zone": "ap-beijing-5", "ZoneName": "北京五区", "ZoneId": "800005", "ZoneState": "AVAILABLE"}], "RequestId": "97ea85b4-f0ca-4507-8d7a-b09abb5a7bd1"}'
(2)拿到腾讯云服务器信息保存到我的数据库里:
a方式一:通过脚本调用平台的api接口,插入进来。
b.方式二:调用接口的代码放django视图中,所以直接请求django drf提供的对外api调用去去服务器拿数据即可
c.方式三:写一django脚本
d.方式四:通过任务调度去运行采集程序(此程序是一函数),它有两种方式:
前台:
后台:
保存到数据库的两保存法:
model.save()
serilazer.save()
(3)序列化与反序列化---重点是模型关系(一对多)如去处理
一.多云管理模型设计
1.取腾讯云服务器数据
(python36env) [vagrant@CentOS7 devops]$ ipython from tencentcloud.common import credential from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.cvm.v20170312 import cvm_client, models 生成证书: cred = credential.Credential("AKIDMn9PKEVWmmX9Zktsa1B5rQoKwNXqniFV", "B7kYdT3PXTHs2VjiX6Q0MRcXEengEbhw") 创建一连接: client = cvm_client.CvmClient(cred,"ap-beijing") 发起一获取服务器详细的请求: 先创建一请求: req = models.DescribeInstancesRequest() 再发起此请求: resp = client.DescribeInstances(req) 拿到字典格式数据: resp.to_json_string() 把数据转成json:就是把上述结果到www.json.cn中转json数据即可结果如下: { "TotalCount":1, "InstanceSet":[ { "Placement":{ "Zone":"ap-beijing-3", "ProjectId":0, "HostIds":null, "HostIps":null, "HostId":null }, "InstanceId":"ins-iixhp38h", "InstanceType":"SA2.SMALL2", "CPU":1, "Memory":2, "RestrictState":"NORMAL", "InstanceName":"lizhihua-cvm", "InstanceChargeType":"PREPAID", "SystemDisk":{ "DiskType":"CLOUD_PREMIUM", "DiskId":"disk-r68z9dj7", "DiskSize":50 }, "DataDisks":null, "PrivateIpAddresses":[ "172.21.0.5" ], "PublicIpAddresses":[ "120.53.122.78" ], "InternetAccessible":{ "InternetChargeType":"BANDWIDTH_PREPAID", "InternetMaxBandwidthOut":1, "PublicIpAssigned":null, "BandwidthPackageId":null }, "VirtualPrivateCloud":{ "VpcId":"vpc-qqaklyek", "SubnetId":"subnet-ri0e82er", "AsVpcGateway":false, "PrivateIpAddresses":null, "Ipv6AddressCount":null }, "ImageId":"img-oikl1tzv", "RenewFlag":"NOTIFY_AND_MANUAL_RENEW", "CreatedTime":"2020-06-20T08:16:02Z", "ExpiredTime":"2021-06-20T08:16:03Z", "OsName":"CentOS 7.5 64位", "SecurityGroupIds":[ "sg-af1xhm0p" ], "LoginSettings":{ "Password":null, "KeyIds":null, "KeepImageLogin":null }, "InstanceState":"RUNNING", "Tags":[ ], "StopChargingMode":"NOT_APPLICABLE", "Uuid":"36c8564e-a235-4c7f-8c27-21573fc26a2b", "LatestOperation":"ModifyInstancesAttribute.InstanceName", "LatestOperationState":"SUCCESS", "LatestOperationRequestId":"89e3c9b4-c0c0-4a3d-97cc-dd4c4b2b8fda", "DisasterRecoverGroupId":"", "IPv6Addresses":null, "CamRoleName":"" } ], "RequestId":"5cfa7dc9-9829-4450-aa70-85112f5656f3" } 转换的结果如上,但为了腾讯云和阿里云等其它多种云统一,所以我不会用上述所有数据,只用它们都有的数据
2.模型:
(1)建apps
(python36env) [vagrant@CentOS7 devops]$ django-admin startapp cloud
settings.py:
INSTALLED_APPS = [
'cloud.apps.CloudConfig'
]
(2)apps/cloud/models.py:
from django.db import models #云厂商模型: class Cloud(models.Model): name = models.CharField("云厂商名称", max_length=50, help_text="云厂商名称") code = models.CharField("云厂商简称", max_length=50, help_text="云厂商简称") def __str__(self): return self.code #服务器表--存的是同步下来的所有服务器: class Cloud_Server(models.Model): #此服务器在哪个云厂商 cloud = models.ForeignKey(Cloud,on_delete=models.CASCADE) #云服务器唯一标识符:加db_index是为了后续可能按此条件搜索 instanceId = models.CharField("实例ID", max_length=100, db_index=True, help_text="实例ID") instanceType = models.CharField("实例类型", max_length=100, help_text="实例ID") cpu = models.CharField("cpu", max_length=32, help_text="cpu") memory = models.CharField("memory", max_length=32, help_text="memory") instanceName = models.CharField("实例名称", max_length=100, db_index=True, help_text="实例名称") createdTime = models.DateTimeField("创建时间", db_index=True) expiredTime = models.DateTimeField("到期时间", db_index=True) hostname = models.CharField("主机名", max_length=100, db_index=True) #ip模型独立建:因为一服务器有多网卡每网卡又有多ip class Ip(models.Model): ip = models.GenericIPAddressField(db_index=True) #内网ip:注意一定要定义related_name否则会出错,因为通过ip查服务器好查,但通过服务器查ip就无法,因为有两种ip inner = models.ForeignKey(Cloud_Server, related_name="innerIpAddress", null=True,on_delete=models.CASCADE) #公网ip: public = models.ForeignKey(Cloud_Server, related_name="publicIpAddress", null=True,on_delete=models.CASCADE)
(python36env) [vagrant@CentOS7 devops]$ python manage.py makemigrations cloud
(python36env) [vagrant@CentOS7 devops]$ python manage.py migrate
腾讯云api参考https://cloud.tencent.com/document/api/213/15728
(3)写同步腾讯去服务器数据的脚本apps/cloud/qcloud包/cvm.py--写云服务器相关的:
(4)写腾讯云服务器云硬盘相关的apps/cloud/qcloud包/cbs.py:
(5)apps/cloud/qcloud包/__init__.py--写公共的/基础的,如连接腾讯云相关的证书:
(6)settings.py:配置腾讯云的全局id和key
(7)apps/cloudviews.py:
(8)devops/urls.py:
(9)cloud/urls.py:
11
22