首页 > 代码库 > CMDB

CMDB

CMDB简介

技术分享
公司:   开发   测试:功能测试  性能测试(高并发)   运维:上线  copy--解压--运行  python manage.py run serve    DBA提供机房服务的公司:兆维,世纪互联运维人员工作:      装机------自动装机系统   配管系统(配置管理)(远程登录机器装软件,初始化操作)   代码部署   监控系统   堡垒机-----操作日志   上线服务器资产管理问题:    之前使用Excel表格维护资产,依赖人为性操作,资产变更时,容易出错,且效率低。与其他部门进行信息交换时,没有一个固定的数据形式。目的:自动采集和汇报,保存变更记录实现运维自动化高内聚,低耦合CMDB 资产管理数据库架构:      1 资产采集      2 API(接收数据,对外提供信息接口)      3 后台管理(数据显示)
View Code

资产采集的实现方案
1. agent模式
每一台服务器放一份agent程序,subprocess执行采集命令,requests提交数据
优点:简单,采集速度快
应用场景:机器多,性能要求降低
技术分享

 


2. ssh模式
在服务器和API之间放置一台中控机 用ssh远程连接服务器 ,执行命令,获取结果,并发送给API
应用场景:机器少,性能要求高
优点:无agent 速度慢 ssh方式
例如:fabric ansible 封装了paramiko模块 批量执行命令

 技术分享

3. salt模式

saltstack(python写的)
在服务器和API之间放置一台中控机,中控机和服务器上分别安装saltstack,中控机上的salt执行命令获取资产信息
master
salve/minion
应用场景:已经用了saltstack 机器多 比ssh速度快
原理:

技术分享
  1 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信。  2   3 minion上线后先与master端联系,把自己的`pub key`发过去,这时master端通过`salt-key -L`命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信。  4   5 master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,`locate salt | grep /usr/`可以看到salt自带的所有东西。  6   7 这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行`salt * cmd.run uptime`的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。  8   9 master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。 10 具体步骤如下 11  12 ``` 13 1、Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc 14 2、salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。 15 3、master接收到命令后,将要执行的命令发送给客户端minion。 16 4、minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理 17 5、minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master 18 6、master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中 19 7、salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。 20 ``` 21  22 #### saltstack 安装 23  24 [saltstack install](http://repo.saltstack.com/#rhel) 25  26 #### 修改minion配置文件 27 ``` 28 [root@linux-node2 ~]# vim /etc/salt/minion 29 master: 192.168.56.11 30 [root@linux-node2 ~]# vim /etc/salt/minion 31 master: 192.168.56.11 32 [root@linux-node1 pki]# pwd 33 /etc/salt/pki 34 [root@linux-node1 pki]# tree 35 . 36 ├── master 37 │   ├── master.pem 38 │   ├── master.pub 39 │   ├── minions 40 │   ├── minions_autosign 41 │   ├── minions_denied 42 │   ├── minions_pre 43 │   │   ├── linux-node1.example.com 44 │   │   └── linux-node2.example.com 45 │   └── minions_rejected 46 └── minion 47     ├── minion_master.pub 48     ├── minion.pem 49     └── minion.pub 50 [root@linux-node1 pki]# salt-key -A 51 [root@linux-node1 pki]# tree 52 . 53 ├── master 54 │   ├── master.pem 55 │   ├── master.pub 56 │   ├── minions 57 │   │   ├── linux-node1.example.com 58 │   │   └── linux-node2.example.com 59 │   ├── minions_autosign 60 │   ├── minions_denied 61 │   ├── minions_pre 62 │   └── minions_rejected 63 └── minion 64     ├── minion_master.pub 65     ├── minion.pem 66     └── minion.pub 67 ``` 68  69 #### 远程执行 70 ``` 71 [root@linux-node1 pki]# salt "*" test.ping 72 linux-node2.example.com: 73     True 74 linux-node1.example.com: 75     True 76 [root@linux-node1 pki]# salt "*" cmd.run w 77 linux-node1.example.com: 78      07:20:24 up 17:10,  1 user,  load average: 0.00, 0.01, 0.05 79     USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT 80     root     pts/0    192.168.56.1     07:04    0.00s  0.30s  0.26s /usr/bin/python /usr/bin/salt * cmd.run w 81 linux-node2.example.com: 82      08:26:25 up 22:40,  2 users,  load average: 0.15, 0.05, 0.06 83     USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT 84     root     tty1                      Sat09   13:12m  0.02s  0.02s -bash 85     root     pts/0    192.168.56.1     08:09   13:53   0.04s  0.04s -bash 86 ``` 87  88 #### 配置管理 89 ##### YAML 90  91 - 缩进: 92   - 两个空格 93   - 不能使用tab键 94   - 缩进代表层级关系 95  96 - 冒号: 97   - key: value 98  99 - 短横线代表list100 101 #### satate模块102 ```103 # vim /etc/salt/master104 file_roots:105   base:106     - /srv/salt107 # mkdir /srv/salt108 # mkdir /srv/salt109 # cd /srv/salt110 # mkdir web111 # cd web112 # pwd113 /srv/salt/web114 # vim apache.sls115 apache-install:116   pkg.installed:117     - names:118       - httpd119       - httpd-devel120 121 apache-service:122   service.running:123     - name: httpd124     - enable: True125 126 # salt * state.sls web.apache127  [root@linux-node2 salt]# cd /var/cache/salt/128 [root@linux-node2 salt]# tree               129 .130 `-- minion131     |-- extmods132     |-- files133     |   `-- base134     |       `-- web135     |           `-- apache.sls136     |-- pkg_refresh137     `-- proc138         `-- 20160605081351939477 139 # cat /var/cache/salt/minion/files/base/web/apache.sls 140 apache-install:141   pkg.installed:142     - names:143       - httpd144       - httpd-devel145 146 apache-service:147   service.running:148     - name: httpd149     - enable: True   150 # ps -ef|grep yum151 root      34129  34103  1 08:13 ?        00:00:00 /usr/bin/python /usr/bin/yum --quiet check-update152 root      34204  34149  0 08:14 pts/1    00:00:00 grep --color=auto yum153 154 # cd /srv/salt/155 # vim top.sls156 base:157   linux-node1.example.com:158     - web.apache159   linux-node2.example.com:160     - web.apache161 # salt * state.highstate test=True162 # salt * state.highstate163 164 # lsof -i:4505 -n165 COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME166 salt-mast 24739 root   13u  IPv4 4637762      0t0  TCP *:4505 (LISTEN)167 salt-mast 24739 root   15u  IPv4 4640421      0t0  TCP 192.168.56.11:4505->192.168.56.11:48344 (ESTABLISHED)168 salt-mast 24739 root   16u  IPv4 4640542      0t0  TCP 192.168.56.11:4505->192.168.56.12:53039 (ESTABLISHED)169 salt-mini 25378 root   25u  IPv4 4640888      0t0  TCP 192.168.56.11:48344->192.168.56.11:4505 (ESTABLISHED)170 ```171 172 #### 数据系统173 174 ##### Grains175 静态数据 当minion启动时收集的minion本地相关信息
View Code

 

技术分享

 

4. puppet(ruby)每30分钟连接一次master,执行一次ruby脚本
场景:公司现在在使用puppet

 

 代码流程:

技术分享
资产采集部分     采集资产subprocess,     兼容性(agent,ssh,salt),     正则或字符串方法(插件)1 配置文件:默认配置和自定义配置2 开发可插拔插件(每个公司采集的资产信息不同)   配置--路径--对应插件(中间件的设计模式)  插件-反射----init文件(从配置文件中获取插件信息)--pluginmanage (获取和执行插件)  给插件设置统一的方法process (返回对应信息)3 解决兼容问题  方法一:设置基类(做扩展时麻烦)  方法二:给process传参 commond     在commod函数中先做判断4    插件的构造方法执行之前自定制一些操作     @classmethod     def initial(cls)        .....        return cls()     错误堆栈信息:try  except     测试模式:debug      5 向API发送数据  从API获取未采集资产
View Code

 

问题:

唯一标识:

技术分享
周期:2-3个月,3个人你负责做什么?  3处借鉴了Django源码的设计模式:        1 默认配置和自定义配置     2 中间件---插件做成可插拔的模式,增加采集资源的插件时,只要写一个类(命令+结果格式化)              在配置文件中写上路径,就可以采集资源的信息             用到了反射  遇到的难题:唯一标识1  唯一标识      所有物理硬件上的标识不能作为唯一标识           主板SN号:虚拟机的SN号可能相同           IP地址会变           Mac地址不准确 标准化:   --主机名不重复,作为唯一标识   --流程标准化            --资产录入,机房,机柜,机柜位置            --装机时,需要将服务信息录入CMDB            --资产采集    最终流程:标准化:主机名不重复。流程标准化:装机同时,主机名在cmdb中设置 步骤:   agent:       a. 装系统,初始化软件cmdb,运行cmdb               --通过命令获取主机名               --写入本地指定文件       b. 将资产信息发送到API       c.获取资产信息              -本地文件主机名!= 命令获取的主机名(按照文件中的主机名)              -本地文件住居明==命令获取的文件主机名   ssh/salt:       中控机:获取未采集主机名列表
View Code

 

线程池:

技术分享
 1 2 线程池 2   提高并发 3   python2: 进程池 4   python3:线程池 进程池 5   代码示例: 6      from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 7      8      def task(i) 9          print(i)10 11      p=ThreadPoolExecutor(10)12      for row in range(100)13           p.submit(task,row)
View Code

 

数据库设计 

。。。。。

 

 参考:http://www.cnblogs.com/nulige/p/6703160.html

 

CMDB