精华内容
下载资源
问答
  • Python之路:CMDB开发
    2021-04-13 11:29:14

    浅谈ITIL

    TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订,现由英国商务部OGC(Office of Government Commerce)负责管理,主要适用于IT服务管理(ITSM)。ITIL为企业的IT服务管理实践提供了一个客观、严谨、可量化的标准和规范。

    1、事件管理(Incident Management)

    事故管理负责记录、归类和安排专家处理事故并监督整个处理过程直至事故得到解决和终止。事故管理的目的是在尽可能最小地影响客户和用户业务的情况下使IT系统恢复到服务级别协议所定义的服务级别。

    目标是:在不影响业务的情况下,尽可能快速的恢复服务,从而保证最佳的效率和服务的可持续性。事件管理流程的建立包括事件分类,确定事件的优先级和建立事件的升级机制。

    2、问题管理(Problem Management)

    问题管理是指通过调查和分析IT基础架构的薄弱环节、查明事故产生的潜在原因,并制定解决事故的方案和防止事故再次发生的措施,将由于问题和事故对业务产生的负面影响减小到最低的服务管理流程。与事故管理强调事故恢复的速度不同,问题管理强调的是找出事故产生的根源,从而制定恰当的解决方案或防止其再次发生的预防措施。

    目标是:调查基础设施和所有可用信息,包括事件数据库,来确定引起事件发生的真正潜在原因,一起提供的服务中可能存在的故障。

    3、配置管理(Configuration Management)

    配置管理是识别和确认系统的配置项,记录和报告配置项状态和变更请求,检验配置项的正确性和完整性等活动构成的过程,其目的是提供IT基础架构的逻辑模型,支持其它服务管理流程特别是变更管理和发布管理的运作。

    目标是:定义和控制服务与基础设施的部件,并保持准确的配置信息。

    4、变更管理(Change Management)

    变更管理是指为在最短的中断时间内完成基础架构或服务的任一方面的变更而对其进行控制的服务管理流程。变更管理的目标是确保在变更实施过程中使用标准的方法和步骤,尽快地实施变更,以将由变更所导致的业务中断对业务的影响减小到最低。

    目标是:以受控的方式,确保所有变更得到评估、批准、实施和评审。

    5、发布管理(Release Management)

    发布管理是指对经过测试后导入实际应用的新增或修改后的配置项进行分发和宣传的管理流程。发布管理以前又称为软件控制与分发。

    目标是:在实际运行环境的发布中,交付、分发并跟踪一个或多个变更。

    CMDB

    1、Agent采集硬件资产
    2、API提供相关处理的接口
    3、管理平台为用户提供可视化操作

    CMDB --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。

    在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。

    70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行评估和控制。而变更管理流程自动化的实现关键就是CMDB。
    CMDB工具中至少包含这几种关键的功能:整合、调和、同步、映射和可视化。

    • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
    • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
    • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
    • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。
    目前CMDB资产管理的实现有如下方式:
    1、Paramiko类

    基于CMDB中控机和SSH对远程服务器执行命令实现
    通过API获取主机名,利用 paramiko 连接服务器获取数据,解析成字典,返还给API来入库
    优点:无依赖
    缺点:慢

    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='wupeiqi', password='123')
       
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
       
    # 关闭连接
    ssh.close()
    
    2、SaltStack

    基于SaltStack的master上的pillar以及远程执行命令实现

    import salt.client
    local = salt.client.LocalClient()
    local.cmd('*', 'cmd.run', ['whoami'])
    
    3、Puppet

    基于Puppet的factor和report功能实现

    puppet中默认自带了5个report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路径下。如果需要执行某个report,那么就在puppet的master的配置文件中做如下配置:
     
    ######################## on master ###################
    /etc/puppet/puppet.conf
    [main]
    reports = store #默认
    #report = true #默认
    #pluginsync = true #默认
     
     
    ####################### on client #####################
     
    /etc/puppet/puppet.conf
    [main]
    #report = true #默认
       
    [agent]
    runinterval = 10
    server = master.puppet.com
    certname = c1.puppet.com
     
    如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent  --test
    

    自定义factor示例

    在 /etc/puppet/modules 目录下创建如下文件结构: 
    
    modules
    └── cmdb
        ├── lib
        │   └── puppet
        │       └── reports
        │           └── cmdb.rb
        └── manifests
            └── init.pp
    
    ################ cmdb.rb ################
    # cmdb.rb
    require 'puppet'
    require 'fileutils'
    require 'puppet/util'
      
    SEPARATOR = [Regexp.escape(File::SEPARATOR.to_s), Regexp.escape(File::ALT_SEPARATOR.to_s)].join
      
    Puppet::Reports.register_report(:cmdb) do
      desc "Store server info
        These files collect quickly -- one every half hour -- so it is a good idea
        to perform some maintenance on them if you use this report (it's the only
        default report)."
      
      def process
        certname = self.name
        now = Time.now.gmtime
        File.open("/tmp/cmdb.json",'a') do |f|
          f.write(certname)
          f.write(' | ')
          f.write(now)
          f.write("\r\n")
        end
      
      end
    end
    
    
    ################ 配置 ################
    /etc/puppet/puppet.conf
    [main]
    reports = cmdb
    #report = true #默认
    #pluginsync = true #默认 
    

    内存信息

    在 /etc/puppet/modules 目录下创建如下文件结构: 
    
    modules
    └── cmdb
        ├── lib
        │   └── puppet
        │       └── reports
        │           └── cmdb.rb
        └── manifests
            └── init.pp
    
    ################ cmdb.rb ################
    # cmdb.rb
    require 'puppet'
    require 'fileutils'
    require 'puppet/util'
      
    SEPARATOR = [Regexp.escape(File::SEPARATOR.to_s), Regexp.escape(File::ALT_SEPARATOR.to_s)].join
      
    Puppet::Reports.register_report(:cmdb) do
      desc "Store server info
        These files collect quickly -- one every half hour -- so it is a good idea
        to perform some maintenance on them if you use this report (it's the only
        default report)."
      
      def process
        certname = self.name
        now = Time.now.gmtime
        File.open("/tmp/cmdb.json",'a') do |f|
          f.write(certname)
          f.write(' | ')
          f.write(now)
          f.write("\r\n")
        end
      
      end
    end
    
    
    ################ 配置 ################
    /etc/puppet/puppet.conf
    [main]
    reports = cmdb
    #report = true #默认
    #pluginsync = true #默认 
    
    更多相关内容
  • CMDB开发

    万次阅读 2018-09-11 21:01:19
    二、开发cmdb程序 开发程序设计为可插拔机制。(好处:扩展性强) 开发一套程序时,要使其有充分的扩展性。接下来可以写一些伪代码... 1、假设项目名为AutoClient, 目录结构如下: AutoClient/ |-- ...

    浅谈ITIL

    ITIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订,现由英国商务部OGC(Office of Government Commerce)负责管理,主要适用于IT服务管理(ITSM)。ITIL为企业的IT服务管理实践提供了一个客观、严谨、可量化的标准和规范。

    1、事件管理(Incident Management)

    事故管理负责记录、归类和安排专家处理事故并监督整个处理过程直至事故得到解决和终止。事故管理的目的是在尽可能最小地影响客户和用户业务的情况下使IT系统恢复到服务级别协议所定义的服务级别。

    目标是:在不影响业务的情况下,尽可能快速的恢复服务,从而保证最佳的效率和服务的可持续性。事件管理流程的建立包括事件分类,确定事件的优先级和建立事件的升级机制。

    2、问题管理(Problem Management)

    问题管理是指通过调查和分析IT基础架构的薄弱环节、查明事故产生的潜在原因,并制定解决事故的方案和防止事故再次发生的措施,将由于问题和事故对 业务产生的负面影响减小到最低的服务管理流程。与事故管理强调事故恢复的速度不同,问题管理强调的是找出事故产生的根源,从而制定恰当的解决方案或防止其 再次发生的预防措施。

    目标是:调查基础设施和所有可用信息,包括事件数据库,来确定引起事件发生的真正潜在原因,一起提供的服务中可能存在的故障。

    3、配置管理(Configuration Management)

    配置管理是识别和确认系统的配置项,记录和报告配置项状态和变更请求,检验配置项的正确性和完整性等活动构成的过程,其目的是提供IT基础架构的逻辑模型,支持其它服务管理流程特别是变更管理和发布管理的运作。

    目标是:定义和控制服务与基础设施的部件,并保持准确的配置信息。

    4、变更管理(Change Management)

    变更管理是指为在最短的中断时间内完成基础架构或服务的任一方面的变更而对其进行控制的服务管理流程。变更管理的目标是确保在变更实施过程中使用标准的方法和步骤,尽快地实施变更,以将由变更所导致的业务中断对业务的影响减小到最低。

    目标是:以受控的方式,确保所有变更得到评估、批准、实施和评审。

    5、发布管理(Release Management)

     发布管理是指对经过测试后导入实际应用的新增或修改后的配置项进行分发和宣传的管理流程。发布管理以前又称为软件控制与分发。

    目标是:在实际运行环境的发布中,交付、分发并跟踪一个或多个变更。

    CMDB

    CMDB --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息 的价值,同时依赖于相关流程保证数据的准确性。

    在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。

    70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过 一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行 评估和控制。而变更管理流程自动化的实现关键就是CMDB。

    CMDB工具中至少包含这几种关键的功能:整合、调和、同步、映射和可视化。

    • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
    • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
    • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
    • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。

        CMDB是运维自动化项目,它可以减少人工干预,降低人员成本。

      功能:自动装机、实时监控、自动化部署软件,建立在它们的基础上是资产信息变更记录(资产管控自动进行汇报)

     

    一、在对获取资产信息时,简述有四种方案。

    1、Agent  (基于shell命令实现)

     

     

                      原理图

     

    Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库

    优点:速度快 缺点:需要为每台服务器部署一个Agent程序

     

    2、Paramiko类 (SSH形式,基于Paramiko模块)

    中控机在获取未采集资产信息的服务器(服务器主机名,密码),依赖于Paramiko(py模块)通过SSH方式去获取

    优点:无Agent  缺点:速度慢

    如果在服务器较少的情况下,可应用此方法

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    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='wupeiqi', password='123')

       

    # 执行命令

    stdin, stdout, stderr = ssh.exec_command('df')

    # 获取命令结果

    result = stdout.read()

       

    # 关闭连接

    ssh.close()

     

    3、SaltStack

      此方案本质上和第二种方案大致是差不多的流程,中控机在获取到未采集资产信息的服务器(主机名),再而将命令放入一个队列中,服务器来获取。服务器将结果放入另一个队列中,中控机获取将服务信息发送到API进而录入数据库。

    基于SaltStack的master上的pillar以及远程执行命令实现

    1

    2

    3

    import salt.client

    local = salt.client.LocalClient()

    local.cmd('*''cmd.run', ['whoami'])

    优点:快,开发成本低  缺点:依赖于第三方工具

     

    4、Puppet(ruby语言开发)
    基于Puppet的factor和report功能实现

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    puppet中默认自带了5个report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路径下。如果需要执行某个report,那么就在puppet的master的配置文件中做如下配置:

     

    ######################## on master ###################

    /etc/puppet/puppet.conf

    [main]

    reports = store #默认

    #report = true #默认

    #pluginsync = true #默认

     

     

    ####################### on client #####################

     

    /etc/puppet/puppet.conf

    [main]

    #report = true #默认

       

    [agent]

    runinterval = 10

    server = master.puppet.com

    certname = c1.puppet.com

     

    如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent  --test

    1、自定义factor示例

    在 /etc/puppet/modules 目录下创建如下文件结构: 
    
    modules
    └── cmdb
        ├── lib
        │   └── puppet
        │       └── reports
        │           └── cmdb.rb
        └── manifests
            └── init.pp
    
    ################ cmdb.rb ################
    # cmdb.rb
    require 'puppet'
    require 'fileutils'
    require 'puppet/util'
      
    SEPARATOR = [Regexp.escape(File::SEPARATOR.to_s), Regexp.escape(File::ALT_SEPARATOR.to_s)].join
      
    Puppet::Reports.register_report(:cmdb) do
      desc "Store server info
        These files collect quickly -- one every half hour -- so it is a good idea
        to perform some maintenance on them if you use this report (it's the only
        default report)."
      
      def process
        certname = self.name
        now = Time.now.gmtime
        File.open("/tmp/cmdb.json",'a') do |f|
          f.write(certname)
          f.write(' | ')
          f.write(now)
          f.write("\r\n")
        end
      
      end
    end
    
    
    ################ 配置 ################
    /etc/puppet/puppet.conf
    [main]
    reports = cmdb
    #report = true #默认
    #pluginsync = true #默认 
    

    小结:

    • 采集资产信息有四种不同的形式(但puppet是具于ruby开发的)
    • API提供相关处理的接口
    • 管理平台为用户提供可视化操作

     

    二、开发cmdb程序

    开发程序设计为可插拔机制。(好处:扩展性强)

    开发一套程序时,要使其有充分的扩展性。接下来可以写一些伪代码...

    1、假设项目名为AutoClient, 目录结构如下:

    AutoClient/
    |-- bin/
    |   |-- auto_client.py
    |-- config/
    |   |-- settings.py
    |-- lib/
    |   |--
    |-- log/
    |   |-- error.log
    |   |-- run.log
    |-- src/
    |   |-- plugins/
    |       |-- __init__.py
    |       |-- base.py
    |       |-- cpu.py
    |       |-- ...
    |   |-- scripts.py 
    |-- README

    例如,采集资产信息有三种形式,而将要做的一件事就是要让程序兼容这三种形式

     

    2、获取内存信息

    $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
    require "rubygems"
    require 'pp'
    require 'json'
    require 'utils'
    
    def dmi_get_ram(cmd)
    
        ram_slot = []
    
        key_map = {
            'Size' => 'capacity',
            'Serial Number' => 'sn',
            'Type' => 'model',
            'Manufacturer' => 'manufactory',
            'Locator' => 'slot',
        }
    
        output = Utils.facter_exec(cmd)
        devices = output.split('Memory Device')
    
        devices.each do |d|
          next if d.strip.empty?
          segment = {}
          d.strip.split("\n\t").each do |line|
            key, value = line.strip.split(":")
            if key_map.has_key?(key.strip)
              if key.strip == 'Size'
                segment[key_map['Size']] = value.chomp("MB").strip.to_i / 1024.0 # unit GB
              else
                segment[key_map[key.strip]] =  value ? value.strip : ''
              end
            end
          end
    
          ram_slot.push(segment) unless segment.empty?
        end
    
        return ram_slot
    
    end
    
    Facter.add("ram") do
      confine :kernel => "Linux"
      setcode do
    
        ram_slot = []
        cmd = "dmidecode -q -t 17 2>/dev/null"
        ram_slot = dmi_get_ram(cmd)
    
        JSON.dump(ram_slot)
    
      end
    end
    
    
    Facter.add("ram") do
      confine :kernel => 'windows'
      setcode do
    
        ram_slot = []
    
        if Facter.value(:manufacturer)  =~ /.*HP.*/i
          cli = 'C:\cmdb_report\dmidecode.exe'
          cmd = "#{cli} -q -t 17"
          ram_slot = dmi_get_ram(cmd) if File.exist?(cli)
    
        else
    
          require 'facter/util/wmi'
          Facter::Util::WMI.execquery("select * from Win32_PhysicalMemory").each do | item |
    
            if item.DeviceLocator
              slot = item.DeviceLocator.strip
            else
              slot = ''
            end
    
            if item.PartNumber
              model = item.PartNumber.strip
            else
              model = ''
            end
    
            if item.SerialNumber
              sn = item.SerialNumber.strip
            else
              sn = ''
            end
    
            if item.Manufacturer
              manufactory = item.Manufacturer.strip
            else
              manufactory = ''
            end
    
            ram_slot.push({
             'capacity' => item.Capacity.to_i / (1024**3), # unit GB
             'slot' => slot,
             'model' => model,
             'sn' => sn,
             'manufactory' => manufactory,
           })
    
          end
        end
    
        JSON.dump(ram_slot)
    
      end
    end
    

     

    三、CMDB数据库设计

     

    四、CMDB总结

    1. 三种采集资产方式
    唯一标识

    2. API
    API验证(tornado源码,加密cookie+时间限制+访问记录)
    数据库表结构

    3. 后台管理
    告别CURD,公共组件(前端+后端配置)

     

     

    展开全文
  • 这个mysql库就被我们当成cmdb来使用。 开发与上线 开发工作是由本人这边完成的内容有: 1.重写ansible的api 2.封装读取mysql中区服信息的代码 3.编写playbook 4.结构的设计: 代码结构和实施方案 这里是写成python...
  • CMDB的作用是什么,为什么要做CMDB? 答:CMDB是运维自动化的最最基础的东西,他是准确描述一个公司的it基础架构的一个一个模型,然后可以进行动态的可视化。当我们采购服务器,这个服务器属于哪个业务线,硬盘多少...
    1. CMDB的作用是什么,为什么要做CMDB?

      答:CMDB是运维自动化的最最基础的东西,他是准确描述一个公司的it基础架构的一个一个模型,然后可以进行动态的可视化。当我们采购服务器,这个服务器属于哪个业务线,硬盘多少块,内存多大,CPU是啥等等这些信息,以及服务器坏了,或者加硬盘,加内存,那么多的信息如果用excel表格维护的话,服务器越来越多就很麻烦吗,而且资产统计可能出错,因为人总有犯错的时候(excel上错误的数据可能达到10%左右),这种不稳定因素太多了,而cmdb就可以把这些服务器的CPU,内存等等各种信息,变更记录,操作记录都记录下来,比如拔了一块硬盘,能够自动显示,或者某位运维人员进行了误操作,可以在操作记录中看到。

    2. CMDB资产采集的方式有哪些?

      答:主要有四种方式,
      ①使用agent,我们写一些脚本在服务器上,可以通过Python的subprocess.getoutput执行,设置定时任务,让它每隔一段时间执行一下来获取关键信息,比如每隔一天执行一次,然后我们可以用Django写一个API,把执行结果给API,API把服务器的变更信息等写入到数据库,之所以要API,是因为要防止服务器直接连我们的数据库,一旦某台服务器被黑了,可以连到我们的数据库就很不安全,不能让机房的服务器直接连到数据库
      在这里插入图片描述
      优点:速度较快,缺点是需要安装agent
      ②使用ssh(基于paramiko模块)
      中控机先通过API去数据库里面获取没有采集资产信息的服务器列表,然后通过paramiko模块采集硬件信息到中控机里边,再发给API通过API写到数据库。
      在这里插入图片描述
      优点:不用安装agent
      缺点:速度很慢(因为是基于ssh),服务器比较少才可以这样做。
      ③使用salatstack
      在这里插入图片描述
      这种方式和上一种类似,也是先获取没有采集资产信息的服务器,但是是通过saltstack远程执行命令,把要执行的命令放到一个队列里边,然后把执行结果再放到另外一个队列里边,再从队列中取出结果发送给API,然后再写入到数据库。
      优点:速度快,开发成本低
      缺点:依赖saltstack,如果公司在用saltstack就很方便,如果公司不给用这个就不行了。

    展开全文
  • CMDB开发之基础搭建

    千次阅读 2018-11-27 22:08:14
    cmdb的介绍与需求 CMDB(配置管理数据库)存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。 ...

    cmdb的介绍与需求

    CMDB(配置管理数据库)存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。
    上面是对cmdb系统的介绍,但是我们的cmdb项目要比定义当中的cmdb具有更加完备的功能
    我们cmdb系统具备以下的功能:
    1、 数据添加
    2、 数据查询/搜索
    3、 自动收集服务器信息
    4、 服务器远程操作
    5、 数据可视化展示
    6、 监控数据接口提供
    7、 权限控制
    8、 数据导出
    9、 生成CSV格式
    所以说我们创建的cmdb系统是一个收集服务器基础信息,实现服务器信息可视化,为自动化运维数据监控、数据统计、提供数据基础的系统。
    首先cmdb的对外的关联图:
    在这里插入图片描述
    然后我们再看一下cmdb系统结构图:
    在这里插入图片描述

    python cmdb数据库建模

    我们首先通过Visio画个图来了解一下服务器CPU,服务器内存,服务器用户三个主题之间的关系:
    在这里插入图片描述
    服务器
    服务器的基本信息

    ip
    mac
    cpu
    memory
    disk
    isalive
    

    服务器cpu详细信息

    processor	
    vendor_id	
    cpu_family	
    model		
    model_name	
    stepping	 
    microcode	
    cpu_MHz		
    cache_size	
    physical_id	
    siblings	
    core_id		
    cpu_cores
    ......
    

    服务器内存的详细信息

    MemTota
    MemFree
    MemAvailable
    Buffers
    Cached
    SwapCached
    Active
    Inactive
    Active(anon)
    Inactive(anon)
    Active(file)
    ......
    

    用户
    用户必要信息

    uername
    password
    

    用户的选填信息

    nickname
    phone
    email
    photo
    

    接口
    接口信息

    name
    description
    doc	(接口文档)
    

    python cmdb前端基础搭建

    首先我们的开发环境需要准备好:
    Python 3.5
    Django 1.8.2 : pip install django==1.8.2
    Pillow : pip install pillow
    Django-ckeditor:pip install django-ckeditor

    1. 创建项目
      跟之前创建个人博客一样的做法,进入到你选好的目录下,在此处打开cmd,开始创建项目。
        django-admin startproject ALLENCMDB
    

    在这里插入图片描述
    2. 创建app的目录

    cd .\ALLENCMDB
    python3 .\manage.py startapp server
    python3 .\manage.py startapp User
    python3 .\manage.py startapp Api
    

    在这里插入图片描述
    3. 创建静态文件目录
    在这里插入图片描述
    4. 保存静态文件
    还是老样子,我们将模板文件中的静态文件和网页模板导入到项目中的静态文件夹。
    这是我的项目所用到的模板
    链接:https://pan.baidu.com/s/1vj0Lszgu_9GJFXe9Wm0AOg
    提取码:avc0
    在这里插入图片描述
    在这里插入图片描述
    5. 数据库orm的建模
    在我们项目的models当中创建模型
    在django当中数据建模分为两种
    我们在\ALLENCMDB\Server\models.py中编写我们的数据表结构
    1、中小型项目可以直接用django自带的外键和多对多关系进行数据关联

    class CMDBUser(models.Model):
        	'''
        	cmdb系统用户信息
       	 一个用户可以对应多台服务器,一台服务器可以有多个用户
       	 所以他们之间是多对多关系
        	'''
        	username = models.CharField(max_length=32,verbose_name='用户账号')
        	password = models.CharField(max_length=32,verbose_name='用户密码')
        	nickname = models.CharField(max_length=32,verbose_name='用户姓名')
        	phone = models.CharField(max_length=32,verbose_name='用户手机号')
        	email = models.EmailField(verbose_name='用户邮箱')
        	photo = models.ImageField(verbose_name='用户头像',upload_to='images')
        	service = models.ManyToManyField(Server) #通过这个字段创建关联
    

    2、在中大型项目由于开发需求多变,多数项目采用自定义表关系
    这些表的定义,没有什么多说的,就是把你需要的信息作为关键字进行数据库建表,方便后期的信息录入,以下就是数据库建表的代码:

    class Server(models.Model):
        	'''
       	 服务器基本信息
        	'''
        	ip = models.CharField(max_length=32,verbose_name='服务器ip')
        	mac = models.CharField(max_length=32,verbose_name='服务器物理地址')
        	cpu = models.CharField(max_length=32,verbose_name='服务器CPU')
        	memory = models.CharField(max_length=32,verbose_name='服务器内存')
        	disk = models.CharField(max_length=32,verbose_name='服务器磁盘')
       	 isalive = models.CharField(max_length=32,verbose_name='服务器状态')
    
    
    class Cpu(models.Model):
        	'''
        	服务器CPU详细信息
        	'''
        	processor = models.CharField(max_length=32,blank=True,null=True)
       	 vendor_id = models.CharField(max_length=32,blank=True,null=True)
        	cpu_family = models.CharField(max_length=32,blank=True,null=True)
       	 model = models.CharField(max_length=32,blank=True,null=True)
        	model_name = models.CharField(max_length=32,blank=True,null=True)
       	 stepping = models.CharField(max_length=32,blank=True,null=True)
        	microcode = models.CharField(max_length=32,blank=True,null=True)
        	cpu_MHz = models.CharField(max_length=32,blank=True,null=True)
      
    
    
    class Memory(models.Model):
           	 '''
           	 服务器内存详细信息
           	 '''
           	 MemTota = models.CharField(max_length=32,blank=True,null=True)
           	 MemFree = models.CharField(max_length=32,blank=True,null=True)
            	MemAvailable = models.CharField(max_length=32,blank=True,null=True)
            	Buffers = models.CharField(max_length=32,blank=True,null=True)
           	 Cached = models.CharField(max_length=32,blank=True,null=True)
            	SwapCached = models.CharField(max_length=32,blank=True,null=True)
           	 Active = models.CharField(max_length=32,blank=True,null=True)
            	Inactive = models.CharField(max_length=32,blank=True,null=True)
            	Active_anon = models.CharField(max_length=32,blank=True,null=True)
            	Inactive_anon = models.CharField(max_length=32,blank=True,null=True)
           	 Active_file = models.CharField(max_length=32,blank=True,null=True)
           	 Inactive_file = models.CharField(max_length=32,blank=True,null=True)
            	Unevictable = models.CharField(max_length=32,blank=True,null=True)
            	Mlocked = models.CharField(max_length=32,blank=True,null=True)
            	SwapTotal = models.CharField(max_length=32,blank=True,null=True)
    
    class Server_Cpu(models.Model):
     '''
    	服务器与CPU关联
    	'''
    	server_id = models.IntegerField()
    	cpu_id = models.IntegerField()
    
    class Server_memory(models.Model):
    	'''
    	服务器与内存关联
    	'''
    	server_id = models.IntegerField()
    	memory_id = models.IntegerField()
    

    我们两种结合
    这里我们注意要导入富文本编辑器
    from ckeditor_uploader.fields import RichTextUploadingField

    class Api(models.Model):
         """
        	CMDB接口数据模型
       	 """
       	name = models.CharField(max_length = 32,verbose_name = "接口名称")
        description = RichTextUploadingField(verbose_name = "接口描述") #采用富文本编辑器编写的接口描述字段
        doc = models.CharField(max_length = 64,verbose_name = "接口文档")
    

    3、 完成settings基本配置
    Settings:

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    

    这是Python1.6版本之后添加出来的配置,就是动态的指向项目根目录的一个配置
    在这里插入图片描述
    加载App
    在这里插入图片描述
    其中前三项是我们自定义的应用
    后两项是ckeditor的应用
    指定HTML文件存放目录
    在这里插入图片描述
    数据库配置,我们选择Python自带sqlite数据库,如果你需要其他数据库,按照要求配置连接。
    在这里插入图片描述
    语言与事件的配置
    在这里插入图片描述
    静态文件配置
    在这里插入图片描述
    大家经常出现的问题就是静态文件加载不对,表现没有前端样式
    1、 请检测STATICFILES_DIRS是否正确,有没有加“S”
    2、 请检测元组是不是加了逗号
    媒体配置
    在这里插入图片描述
    App静态文件加载位置(注意这里需要在static目录下手动建立ckeditor,不然等会收集静态文件时会报错)
    在这里插入图片描述
    Ckeditor配置
    在这里插入图片描述
    配置ckeditor的路由
    在这里插入图片描述
    收集ckeditor的静态文件

    python manage.py collectstatic
    

    选择yes
    在这里插入图片描述
    在这里我们为了测试配置的效果,我们将我们的数据表安装到admin后台当中
    在这里插入图片描述
    然后同步数据库,同时启动项目
    1、 校验配置

    python manage.py validate
    

    在这里插入图片描述
    2、 生成数据库语句

    python manage.py makemigrations
    在这里插入图片描述
    3、 进行数据库同步

     python manage.py syncdb
    

    在这里插入图片描述
    项目第一次同步在django1.4之后会询问是否创建后台超级用户
    在这里插入图片描述
    访问我们Django后台如图:
    在这里插入图片描述
    完成模板页
    1、指出base页,这里是base.html
    我将所有的模板文件放进一个文件夹以方便使用,然后新建一个base.html文件作为模板
    在这里插入图片描述
    视图文件
    在这里插入图片描述
    路由指出
    在这里插入图片描述
    现在我们打开页面是有问题的,没有加载样式
    在这里插入图片描述
    所以接下来我们需要修改其中的静态文件路径
    在这里插入图片描述
    然后我们再次访问,刷新页面后就正常啦。
    在这里插入图片描述
    进行模板设置
    模板设置常用块儿
    1、 标题块儿
    要有默认值,如果标题没有写,也有要默认值
    在这里插入图片描述
    2、 样式块儿
    目的是为了给各自页(继承页)添加自己的样式
    在这里插入图片描述
    3、 内容块儿
    用来存放内容,可以分成多个块儿
    比如当前
    在这里插入图片描述
    在这里插入图片描述
    4、 js脚本块儿
    js在HTML当中有先后顺序,后加载的可以导入先加载的,比如vue.js依赖jq,所以我们写导入先导入jq,再导入vue.js
    还有部分js写在我们HTML页面的标签当中,那么这个没有顺序,这个执行顺序依赖js代码编写
    在这里插入图片描述
    2、 进行模板加载
    代码在此:
    index.html

    {% extends "base.html" %} <!-- 这个标签的参数需要加引号 -->
    
    {% block title %}
        ALLEN CMDB系统-首页
    {% endblock %}
    
    {% block label %}
        ALLEN CMDB系统-首页
    {% endblock %}
    
    {% block content %}
        这是我的首页
    {% endblock %}
    
    {% block script %} <!-- 这个做出一个弹出的测试框 -->
        <script>
            $(
                 function () {
                     alert("hello world")
                 }
            )
        </script>
    {% endblock %}
    

    \ALLENCMDB\ALLENCMDB\views.py

    #coding:utf-8
    from django.shortcuts import render_to_response
    
    
    def index(request):
        return render_to_response("index.html")
    

    路由指出
    在这里插入图片描述
    效果如下:
    在这里插入图片描述
    当然你可以进一步去更改自己的首页风格,我很期待你的作品哦!

    展开全文
  • 蓝鲸配置平台是一款面向应用的 CMDB,在 ITIL 体系里,CMDB 是构建其它流程的基石,而在蓝鲸 智云体系里,配置平台就扮演着基石的角色,为应用提供了各种运维场景的配置数据服务。它是企 业 IT 管理体系的核心,通过...
  • Python CMDB开发

    2016-12-26 19:27:00
    Python CMDB开发 运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取到的数据保存到...
  • 基于python3+vue+Element-ui开发CMDB 资产管理系统
  • Python-CMDB开发

    2016-11-09 14:51:00
    Python CMDB开发 运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取到的数据保存到...
  • CMDB开发&&学习笔记一采集硬件信息采集硬件信息的两种实现方式利用puppet中的report功能采集硬件信息利用agent采集硬件信息数据传输数据存储后套管理 采集硬件信息 采集硬件信息的两种实现方式 利用...
  • python CMDB开发

    2020-12-04 19:57:54
    一、cmdb概述cmdb的组成主要有后台管理,中控机,服务器。后台管理又分为后台管理页面与中控机交换数据的API。用户通过后台管理页面录入主机信息,中控机通过API获取到ip列表,中控机根据ip去获取对应机器的配置信息...
  • CMDB(Configuration Management Database)配置管理数据库,CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,项目中包含资产采集、API以及后台管理三部分,实现数据自动...
  • 文章目录一:资产采集功能开发①agent方式②SSH类的方式③基于saltstackCMDB插件开发 一:资产采集功能开发 ①agent方式 通过在客户端写一些脚本,然后加入到定时任务,每隔一段时间执行一下命令采集硬件信息,发给...
  • 蓝鲸基于Django开发,是腾讯游戏运营部自主研发的一套具有多项探索式创新的,为业务量身打造的,定制化的一站式...我希望在蓝鲸中实现一个功能类似CMDB的APP,通过API抓取所有云厂商账号下的实例,实现资产可视化...
  • CMDB开发背景

    2019-09-30 02:53:19
    转载于:https://www.cnblogs.com/jintian/p/11267259.html
  • 重要提示: master分散在开发过程中可能处于交替或不可用状态。请通过而非master去获取稳定的二进制文件。 蓝鲸配置平台(蓝鲸CMDB)是一个面向资产和应用的企业级配置管理平台。 蓝鲸配置平台提供了全新的自定义...
  • Django kindEditor,CMDB开发,JSONP,XSS攻击 kindEditor 双层视图查找 CMDB 开发 JSONP XSS攻击 1,kindEditor pip3 install beautifulsoup4 beautifulsoup4 对标签进行过滤 单例模式 实例: @check_login def ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,645
精华内容 2,258
关键字:

CMDB开发