zoukankan      html  css  js  c++  java
  • 一.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

  • 相关阅读:
    Hadoop之hive 其他
    mac 安装mysql
    Mac OS X【快捷键组合】汇总
    一月一城市,一年一大洲
    自信的男生最有魅力
    Python之路
    Hadoop之伪分布环境搭建
    smb
    Maven 安装以及一些开发技巧
    Hadoop之 hdfs 系统
  • 原文地址:https://www.cnblogs.com/dbslinux/p/13168238.html
Copyright © 2011-2022 走看看