• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

DevOPS - 扫描系统,入前端库的扫描数据库处理

一、解决问题(难点)

1、多IP相同机器

2、机器类型抽取

3、按照基本类型(实体设备、虚拟设备、网络设备)分类

 

二、步骤

1、规划表格建模型

将扫描出来的初表数据,按照一定的规则进行多个唯独分析,拆分为多张独立的表格,并设定好其关联的关系。

1)物理服务器信息表

# 物理服务器信息
class PhysicalServerInfo(models.Model):
    # server_name = models.CharField(max_length=15, verbose_name=u'服务器名')
    server_ip = models.IPAddressField(max_length=40, verbose_name=u'服务器IP')
    # 机器的类型 dell or other?
    machine_brand = models.CharField(max_length=60, default='--', verbose_name=u'服务器品牌')
    # 机器的类型
    # machine_type = models.IntegerField(default=0, verbose_name=u'服务器,0-物理服务器,1-虚拟服务器,2-')
    system_ver = models.CharField(max_length=30, default='', verbose_name=u'操作系统版本')
    sys_hostname = models.CharField(max_length=15, verbose_name=u'操作系统主机名')
    mac = models.CharField(max_length=512, default='', verbose_name=u'MAC地址')
    sn = models.CharField(max_length=256, verbose_name=u'SN-主机的唯一标识', default='')

    # 物理服务器关联的机柜
    ser_cabin = models.ForeignKey('CabinetInfo')
    # 用户登录系统信息
    conn_phy = models.ForeignKey('ConnectionInfo')

 

2)虚拟设备信息

存放虚拟服务器设备信息,如:KVM、Vmware、Docker

# 虚拟设备信息
class VirtualServerInfo(models.Model):
    # server_name = models.CharField(max_length=15, verbose_name=u'服务器名')
    server_ip = models.CharField(max_length=40, verbose_name=u'服务器IP')
    # 机器的类型 0=kvm,2=虚拟资产,3=网络设备 0=其他类型(未知)
    server_type = models.CharField(max_length=80, default='',verbose_name=u'服务器类型:kvm,Vmware,Docker,others')
    system_ver = models.CharField(max_length=30, default='', verbose_name=u'操作系统版本')
    sys_hostname = models.CharField(max_length=15, verbose_name=u'操作系统主机名')
    mac = models.CharField(max_length=512, default='', verbose_name=u'MAC地址')
    sn = models.CharField(max_length=256, verbose_name=u'SN-主机的唯一标识', default='')

    # 虚拟设备关联的物理服务器
    vir_phy = models.ForeignKey('PhysicalServerInfo')
    # 用户登录系统信息
    conn_vir = models.ForeignKey('ConnectionInfo')

3)网络设备表

# 网络设备表
class NetWorkInfo(models.Model):
    host_ip = models.CharField(max_length=40, verbose_name=u'网络设备ip')
    host_name = models.CharField(max_length=10, verbose_name=u'网络设备名')

    # 网络设备所在的机柜
    net_cab = models.ForeignKey('CabinetInfo')

 

4)用户连接信息表

存放ssh登录系统的用户密码、端口等信息

注意:这里单独设置一个键sn_key,用户通过这个字段,查找到一个机器实体的信息,下面将具体介绍。

class ConnectionInfo(models.Model):
    # 用户连接相关信息
    ssh_username = models.CharField(max_length=10,default='', verbose_name=u'ssh用户名',null=True)
    ssh_userpasswd = models.CharField(max_length=40,default='', verbose_name=u'ssh用户密码',null=True)
    ssh_hostip = models.IPAddressField(max_length=40,default='',verbose_name=u'ssh登录的ip',null=True)
    ssh_host_port = models.CharField(max_length=10, default='', verbose_name=u'ssh登录的端口',null=True)
    ssh_rsa = models.CharField(max_length=64, default='')
    rsa_pass = models.CharField(max_length=64, default='', verbose_name=u'私钥的密钥')
    # 0-登录失败,1-登录成功
    ssh_status = models.IntegerField(default=0, verbose_name=u'用户连接状态,0-登录失败,1-登录成功')
    # 1-rsa登录,2-dsa登录,3-okooo_rsa登录,4-docker成功,5-docker无法登录
    ssh_type = models.IntegerField(default=0, verbose_name=u'用户连接类型, 1-rsa登录,2-dsa登录,3-okooo_rsa登录,4-docker成功,5-docker无法登录')
    # 唯一系统对象标示
    sn_key = models.CharField(max_length=256,verbose_name=u"唯一设备ID",default="")

5)机柜数

设置机柜信息

# 机柜的信息
class CabinetInfo(models.Model):
    cab_name = models.CharField(max_length=10, verbose_name=u'机柜编号')
    # 1-10分别代表1~10层
    cab_lever = models.CharField(max_length=2, verbose_name=u'机器U数,1-10分别代表1~10层')

 

三、代码步骤

    #key_obj_list,方法传入的是所有扫描初表中提取的对象列表
    def init_uniq_key(self,key_obj_list):
        for key_obj in key_obj_list:
           #return_key_mac方法用于对mac地址提取如:549f350168f0_1500_1500_65535_ 提取出为549f350168f0
            mac_addr = self.return_key_mac(key_obj.mac_address)
           #return_true_string方法主要用于去除空格
            sn_key = self.return_true_string(key_obj.sn)
           #优先使用sn作为设备的唯一标示码
            if sn_key and sn_key != u'' and sn_key != 'NotSpecified':
                if sn_key not in self.key_dic_map.keys():
                    #生成一个以sn_key为键的字典对象
                    self.key_dic_map[sn_key] = [key_obj.ip,key_obj.ssh_port,key_obj.ssh_user,key_obj.ssh_passwd,key_obj.ssh_rsa,key_obj.rsa_pass,key_obj.system_ver,
                    key_obj.hostname,key_obj.ssh_status,key_obj.ssh_type,key_obj.mac_address,sn_key,key_obj.mathine_type]
                else:
                    self.key_dic_map[sn_key][0] = self.key_dic_map[sn_key][0] + "," + key_obj.ip
            elif mac_addr:
                    #如果设备没有SN号,将用mac地址作为设备的唯一标示码
                if mac_addr not in self.key_dic_map.keys():
                    self.key_dic_map[mac_addr] = [key_obj.ip,key_obj.ssh_port,key_obj.ssh_user,key_obj.ssh_passwd,key_obj.ssh_rsa,key_obj.rsa_pass,key_obj.system_ver,
                key_obj.hostname,key_obj.ssh_status,key_obj.ssh_type,key_obj.mac_address,key_obj.sn,key_obj.mathine_type]
                else:
                    self.key_dic_map[mac_addr][0] = self.key_dic_map[mac_addr][0] + "," + key_obj.ip
            else:
                print u"error:no sn and no mac:%s"%key_obj.id
                logger.error("error:no sn and no mac,id is :%s"%key_obj.id)

 

DevOPS - 扫描系统,入前端库的扫描数据库处理

Pingbacks已打开。

引用地址

暂无评论

发表评论