为什么要有CMDB?

CMDB –Configuration Management Database 配置管理数据库.

1.为了实现资产的自动采集,资产的自动更新,

为了搭建公司自动化平台的基础则需要资产的管理.

2.优点减少了人工干预,降低人员成本.

 

CMDB三种工作方式

1.Agent
%title插图%num

Agent工作流程:

1.首先在每台服务器都装上agent. agent定时执行指令

2.agent将处理过的数据通过requests发给API

3.再由API更新到数据库中.

Ageng优点:

速度快;

缺点:

每一台服务器都需要Agent

 

 

2.ssh类

%title插图%num

 

ssh类的工作方式:

1.资产采集器(中控机)先向API获取未采集的服务器列表

2.中控机通过paramiko模块里的ssh远程连接到服务器.(主机名,密码,命令)获取服务器的数据

3.获取完所有未采集的服务器后,将数据发送给API.

 

优点:无agent

缺点:速度慢

适合用在服务器少的情况下.

 

3.salt-stack

 

%title插图%num

 

 

 

salt-stack流程:

1.安装了saltstack-master的中控机先去API获取未采集的主机名列表.

2.通过RPC的模式来获取数据.

(RPC模式:

将主机名,密码,命令放在a消息队列里

装有salstack-slave的服务器会去a消息队列里拿命令,检查是否是自己需要执行的.

服务器执行完命令后将数据放在b消息队列里,中控机去b消息队列里获取数据

zeromq软件)

3.将获取的数据发送给API,API存数数据库.

优点:速度快,开发成本低

缺点:依赖saltstack

 

4.puppet

1.要用ruby写.

2.有点自动汇报数据

缺点:必须用ruby

 

 

为什么要有API

1.提供接口.系统调用数据的时候,提供接口.不让外界直接接触数据库

2.对提交的数据进行统一化的管理.

3.比较安全.如果没有API如果服务器给黑了,可能会把数据库删表.

 

连接API的安全认证

1.API和服务器端各有一个相同的key

2.当服务器端想连接API的时候,将key进行md5加密,发给API

APi的key也进行MD5加密,两个密文对比.,相同则代表通过.

?存在问题. 如果这个key给别人截取了,那么其他的人就可以向API发无用的数据.

3.那么就让key动态起来,我利用了本地的时间和key组合成一个字符串,用md5加密同时也要将本地的时间发给API

因为API接收到的时间会延迟. 然后APIkey和服务端的时间,md5加密 然后两个密文对比.

?存在问题,发现有更多的key可以进入到API

4.将*次发送的密文放在一个列表里.第二次判断是否在该列表里,在则登录失败.

?那么需要存放的密文很多

5.失效.让服务器发的这个key10秒钟后时间,每次密文判断之前,先判断是否超时了.

清空失效的密文

 

%title插图%num %title插图%num
def api_auth_method(request):
    auth_key = request.META.get('HTTP_AUTH_KEY')
    if not auth_key:
        return False
    sp = auth_key.split('|')
    if len(sp) != 2:
        return False
    encrypt, timestamp = sp
    timestamp = float(timestamp)
    limit_timestamp = time.time() - ASSET_AUTH_TIME
    print(limit_timestamp, timestamp)
    if limit_timestamp > timestamp:
        return False
    ha = hashlib.md5(ASSET_AUTH_KEY.encode('utf-8'))
    ha.update(bytes("%s|%f" % (ASSET_AUTH_KEY, timestamp), encoding='utf-8'))
    result = ha.hexdigest()
    print(result, encrypt)
    if encrypt != result:
        return False

    exist = False
    del_keys = []
    for k, v in enumerate(ENCRYPT_LIST):
        print(k, v)
        m = v['time']
        n = v['encrypt']
        if m < limit_timestamp:
            del_keys.append(k)
            continue
        if n == encrypt:
            exist = True
    for k in del_keys:
        del ENCRYPT_LIST[k]

    if exist:
        return False
    ENCRYPT_LIST.append({'encrypt': encrypt, 'time': timestamp})
    return True