一.9.多云管理同步服务器

   成本小,若自建机房:机柜你要准备,服务器要购买,网络设备得采集,还得花人去装,而使用云服务器的话,人力成本和时间都大大节省。

  一般公司会考虑在多家公司买云,如我的业务在海外我会考虑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

https://cloud.tencent.com/document/api/213/15728

原文地址:https://www.cnblogs.com/dbslinux/p/13168238.html