• cmdb简介和入门


    CMDB项目必要性

    在这之前了解一下传统运维工程师的工作

    传统运维

    • 日常工作繁琐
    • 应用环境不统一
    • 部署效率低下
    • 无用报警信息过多

    自动化运维就是为了解决传统运维的一些痛点

    自动化运维

    运维自动化最重要的就是标准化一切

    自动化运维核心项目之CMDB

    为什么要先做CMDB?

    • 场景一

      代码发布系统

      1. 项目从需求提出 —–》 项目上线的流程?

        需求分析(产品经理) —> 开会分工(产品经理+开发+运维+测试) —> 代码的测试

        (白盒、黑盒测试) —> 上线 (4台负载均衡 + 运维)

      2. 传统上线的方式

        把代码打包发送给运维,运维解包放到服务器相对应的目录下

    问题是,如果机器数量增到100台服务器,剩下的96台服务器,是不是都的要重复一下上面的代码部署步骤?

    解决的办法: 如果能有一个web系统,能够自动的发布代码,那需要的最基本的东西就是:服务器的各种元信息(ip/主机名/cpu/硬盘大小/网卡信息)

    • 场景二

    服务器监控系统

    监控的内容:项目的正常运行, 硬盘的大小(>80%), CPU的信息, 日志的分析报警(http的状态码 (200,304,400,404,500等)) 等内容

    前提是做这个监控系统之前,我们是需要获取这些服务器的元信息的(ip/主机名/cpu/硬盘大小/网卡信息)

    • 场景三

    上市,需要审批资产,当时对服务器这块审批非常的麻烦,因为,之前他们将服务器的各种信息ip/主机名/cpu/硬盘大小/网卡信息)记录在了Excel里面 。汽车之家 —》1000台 (windowsServer—》linux)

    CMDB系统

    配置管理系统,作用是:自动采集服务器的各种元信息(ip/主机名/cpu/硬盘大小/网卡

    信息),包括自动记录服务器的变更信息 。

    项目架构图

    • 方案一 agent方案
    1. 服务器的信息怎么获取?(服务器的ip地址,主机名,硬盘大小怎么获取?)

      答: 通过linux的各种命令来进行获取 (ifconfig获取ip地址)

    2. 如何通过python代码获取linux服务器的信息?(如何使用python代码执行linux命令?)

      答:subprocess模块下的 getoutput 方法

    3. 如何将客户端执行产生的结果传送到对端的API上?

      答:通过http协议的Post方法传输 采用requests模块下面的post方法

    4. api获取数据,使用request.body获取,而不是用post获取,原因是啥?

      答: request.post和get这两方法中的数据,是从body中获取的

    如果你http的头信息:content-type: application/json 格式的话, request.post或

    者get都获取不到信息,只能使用body获取。

    如果 content-type:application/form-url-encode格式的话, request.post中就会有

    数据

    缺点: 每一台服务器都是需要部署相同的项目和脚本,部署起来比较的麻烦

    agent方式.png

    • 方案二 ssh类方案

    中控机上安装paramiko模块,通过ssh协议登录每一台服务器进行采集信息相对于第一套方案来说,

    优点: 不需要每一台都部署

    缺点: 速度慢 ,每台都要连接,耗时高

    服务器数量较少的情况下可以用这种方法。

    import paramiko
       
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='c1.salt.com', port=22, username='root', password='123')
       
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
       
    # 关闭连接
    ssh.close()
    

    paramiko方式.png

    • 方案三 saltstack方案

    中控机上安装salt-master,通过队列将命令传输给salt-minion执行,然后salt-minion将 执行完成之后的结果返回给salt-master

    此方案本质上和第二种方案大致是差不多的流程,中控机发送命令给服务器执行。服务器将结果放入另一个队列中,中控机获取将服务信息发送到API进而录入数据库。

    这里的两个队列不是同一个,一个用来放命令,一个用来放结果

    优点:不需要写太多的代码

    缺点:需要安装

    saltstack方式.png

    • 方案四 puppet 方案

    Ruby语言 (日本人)

    总结

    三套方案,总共都是分成三部分的

    1、采集部分

    2、API分析数据部分

    3、djangoweb展示部分

    三套方案,不一样的部分就是采集部分

    所以,接下来我们要实现三套方案所有的采集部分

    **目标: **

    写一套客户端采集代码,通过一个配置选项来灵活的切换方案

    客户端目录结构设计

    • bin : 整个项目的可执行文件

    • src: 整个项目的源文件

    • conf: 整个项目的配置目录

    • lib: 整个项目的库文件

    • tests: 测试文件放置的目录

    log日志是要记录在一个特定的目录下的,比如说:/var/logs

    功能实现:高级配置文件实现

    一般,比如django,都是有两个配置文件的,一个是普通配置文件,用来自定义一些配置的,还有一个就是高级配置文件,放的一般都是不怎么改动的配置信息。现在手动实现一下两个配置文件都读取

    from . import global_settings #集成高级配置文件
    from conf import config #集成用户自定制配置
    
    class Settings():
    
        def __init__(self):
    
            #### 集成高级配置
          #dir方法获取这个文件的名称空间里所有东西,循环遍历,大写的就是我们要的配置
            for k in dir(global_settings):
                if k.isupper():
                    v = getattr(global_settings, k)
                    setattr(self, k, v)
    
            #### 集成用户自定制配置
            for k in dir(config):
                if k.isupper():
                    v = getattr(config, k)
                    setattr(self, k, v)
    
    
    settings = Settings()
    

    需要注意的是,高级配置一定要放在上面,因为如果他放在用户自定制配置下面,那么可能无论用户自定制了什么配置,读取的都是高级配置,会被覆盖,所以要厚读取用户自定制配置,遇到相同的配置信息,就覆盖高级配置。

  • 相关阅读:
    多线程单例模式之立即加载(饿汉模式)
    多线程单例模式之延迟加载(懒汉模式)
    java多线程之ThreadLocal
    java多线程的字符流与字节流
    java多线程生产者消费者
    深入理解多线程三
    深入理解多线程二
    深入java多线程一
    mybatis学习三
    mybatis学习二
  • 原文地址:https://www.cnblogs.com/chanyuli/p/12296134.html
Copyright © 2020-2023  润新知