CMDB配置资源管理数据库(理解)

Posted bigdata_devops

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMDB配置资源管理数据库(理解)相关的知识,希望对你有一定的参考价值。

 CMDB是运维自动化的基础,它为日志系统,发布系统,监控系统等运维系统(ELK,zabbix,open-falcon)提供接口函数,

第一种方式:Agent方法实现,agent不能直接访问数据库,因为agent端有可能被入侵,入侵之后,黑客可以获取数据库权限,造成删库等损失,所以得用url方式

####server

from django.shortcuts import render,HttpResponse

# Create your views here.

def asset(request):
    if request.method == "POST":
        print(request.POST)
        # 写入到数据
        return HttpResponse(\'1002\')
    else:
        return HttpResponse(\'姿势不对\')


####agent
import subprocess
import requests

v1 = subprocess.getoutput("ifconfig")
value1 = (v1[51:55])

v2 = subprocess.getoutput("dir")
value2 = (v2[14:20])

url = "http://127.0.0.1:8000/asset.html"

response = requests.post(url,data={"k1":value1,"k2":value2})
print(response.text)
View Code
#Agent方式
api
- URL - 发送数据格式 - 返回值 agent - 采集数据,发送数据 好处: - 简单 - 采集速度快,响应速度快 坏处: - 每台agent装的插件多,性能损耗严重 - 更新需要更新每台agent服务器

 

当然subprocess不能用于CMDB采集数据,因为这个模块通常用于本机

>>> import subprocess
>>> subprocess.getoutput(\'ipconfig\')
\'\\nWindows IP 配置\\n\\n\\n无线局域网适配器 无线网络连接 2:\\n\\n 媒体状态 . . . .
. . . . . . . . : 媒体已断开\\n 连接特定的 DNS 后缀 . . . . . . . : \\n\\n以太网
适配器 Bluetooth 网络连接:\\n\\n 媒体状态 . . . . . . . . . . . . : 媒体已断开\\
n 连接特定的 DNS 后缀 . . . . . . . : \\n\\n以太网适配器 本地连接:\\n\\n 媒体状
态 . . . . . . . . . . . . : 媒体已断开\\n 连接特定的 DNS 后缀 . . . . . . . :
\\n\\n无线局域网适配器 无线网络连接:\\n\\n 连接特定的 DNS 后缀 . . . . . . . : \\n
本地链接 IPv6 地址. . . . . . . . : fe80::e4c6:c03b:e89:a02%11\\n IPv4 地址
. . . . . . . . . . . . : 192.168.1.100\\n 子网掩码 . . . . . . . . . . . . :
255.255.255.0\\n 默认网关. . . . . . . . . . . . . : 192.168.1.1\\n\\n以太网适配
器 VMware Network Adapter VMnet1:\\n\\n 连接特定的 DNS 后缀 . . . . . . . : \\n
本地链接 IPv6 地址. . . . . . . . : fe80::486e:2200:8997:bcdb%18\\n IPv4 地址
. . . . . . . . . . . . : 192.168.65.1\\n 子网掩码 . . . . . . . . . . . . : 2
55.255.255.0\\n 默认网关. . . . . . . . . . . . . : \\n\\n以太网适配器 VMware Net
work Adapter VMnet8:\\n\\n 连接特定的 DNS 后缀 . . . . . . . : \\n 本地链接 IPv
6 地址. . . . . . . . : fe80::d851:ee0a:c90a:db52%19\\n IPv4 地址 . . . . . . .
. . . . . : 192.168.117.1\\n 子网掩码 . . . . . . . . . . . . : 255.255.255.0
\\n 默认网关. . . . . . . . . . . . . : \\n\\n隧道适配器 isatap.localdomain:\\n\\n
媒体状态 . . . . . . . . . . . . : 媒体已断开\\n 连接特定的 DNS 后缀 . . . .
. . . : \\n\\n隧道适配器 isatap.{7F17396E-53DB-47A4-BD5C-9EADDC5E9FAC}:\\n\\n 媒
体状态 . . . . . . . . . . . . : 媒体已断开\\n 连接特定的 DNS 后缀 . . . . . .
. : \\n\\n隧道适配器 Teredo Tunneling Pseudo-Interface:\\n\\n 连接特定的 DNS 后缀
. . . . . . . : \\n IPv6 地址 . . . . . . . . . . . . : 2001:0:9d38:6ab8:2882:
ac2:49ed:92f9\\n 本地链接 IPv6 地址. . . . . . . . : fe80::2882:ac2:49ed:92f9%1
4\\n 默认网关. . . . . . . . . . . . . : ::\\n\\n隧道适配器 isatap.{5200D41D-66DB
-404B-B054-927048C61572}:\\n\\n 媒体状态 . . . . . . . . . . . . : 媒体已断开\\n
连接特定的 DNS 后缀 . . . . . . . : \\n\\n隧道适配器 isatap.{24E33A31-E0FB-45FF
-B380-39AD751E3A09}:\\n\\n 媒体状态 . . . . . . . . . . . . : 媒体已断开\\n 连
接特定的 DNS 后缀 . . . . . . . : \\n\\n隧道适配器 isatap.{28CBEECB-4F9E-4214-B9CA
-E42439ECC9D4}:\\n\\n 媒体状态 . . . . . . . . . . . . : 媒体已断开\\n 连接特
定的 DNS 后缀 . . . . . . . : \'
>>>

>>> import requests
>>> requests.get(\'http://www.cnblogs.com/wupeiqi/articles/6192986.html\') #也可以是POST请求
<Response [200]>
>>> ret = requests.get(\'http://www.cnblogs.com/wupeiqi/articles/6192986.html\')
>>> ret.text#把整个页面都渲染出来,相当于一个字符串

 

 

第二种方式:用SSH方式实现,用中控机采集资产, 下图的中间部分就是中控机

##server

from django.shortcuts import render,HttpResponse

# Create your views here.

def asset(request):
    if request.method == "POST":
        print(request.POST)
        # 写入到数据
        return HttpResponse(\'1002\')
    else:
        return HttpResponse(\'姿势不对\')


##Paramiko中控机


import paramiko
import requests

# 创建SSH对象
ssh = paramiko.SSHClient()

# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname=\'10.37.129.3\', port=22, username=\'root\', password="123456")

# 执行命令
stdin, stdout, stderr = ssh.exec_command(\'ifconfig\')

# 获取命令结果
result = stdout.read()[0:20]

# 关闭连接
ssh.close()

url = "http://127.0.0.1:8000/asset.html"

response = requests.post(url,data={"k1":result})
print(response.text)
View Code
#ssh方式
    - fabric(本质是Paramiko)
    - ansible(本质是Paramiko)
    - Paramiko
 
 
#Paramiko模块
 
原理: Paramiko中控机远程连接服务器,执行命令,获取结果,将结果发送Api
应用场景:服务器少,ssh可以忽略 
 
好处
   - 无需Agent
坏处
   - 连接客户机时每次需要ssh连接,速度慢
 
 
http://www.cnblogs.com/wupeiqi/articles/5095821.html

 

很多运维工具基于Python的paramiko模块做了封装,比如fabric,ansible,最新的ansible用了另外的方式实现

第三种方式:依赖第三方工具saltstack

    http://www.cnblogs.com/wupeiqi/articles/6415436.html
     
    API:Django接收数据并入库
     
    应用场景:针对服务器较多的公司【推荐】
 
    master:
        v = subprocess.getoutput(\'salt "*" cmd.run "ls"\')
     
    saltstack内部原理是通过RPC来实现得消息队列

 

以saltstack为例,在saltstack-master上可以远程执行命令,然后利用RPC采集资产

RPC的本质是维护一个队列

RPC方式比SSH要快

 第四种方式:基于puppet方式采集:

4.  puppet【ruby语言】
     
    内部原理:puppet客户端每30秒钟自动汇报数据给puppet服务端。
     
    应用场景:主要是针对已经在使用puppet的公司。

同时使用前三种方式:通过修改配置文件实现前三种方式的切换 (前三种必须要会,第四种了解)

一般设置每天采集一次数据

CMDB要解决的就是自动收集

程序实现

1.下面这段程序放在agent机器上: agent方式

#1.采集数据发送到API
import subprocess
import requests
#pip3 install requests
result = subprocess.getoutput(\'ipconfig\')#获取本机的信息
#result正则处理获取想要的数据

#整理资产信息
data_dict = {
    \'net\':{},
    \'disk\':{},
    \'mem\':{},
}

#2.发送数据
requests.post(\'http://www.127.0.0.1/assets.html\',data=data_dict)

客户端:

subprocess模块详解
subprocess – 创建附加进程 
subprocess模块提供了一种一致的方法来创建和处理附加进程,与标准库中的其它模块相比,提供了一个更高级的接口。用于替换如下模块: 
os.system() , os.spawnv() , os和popen2模块中的popen()函数,以及 commands().

程序如下:
import subprocess

v1 = subprocess.getoutput(\'ipconfig\')#利用subprocess模块
print(v1)
print(v1[10:20])
v2 = subprocess.getoutput(\'dir\')#执行一个Windows cmd命令
print(v2)
print(type(v2))

url = "http://127.0.0.1:8000/asset.html"#指定一个URL
import requests
response = requests.post(url,data={\'k1\':v1,\'k2\':v2})#把url和数据用post方式提交
print(response.text)#输出命令的内容
客户端

服务端:

from django.shortcuts import render,HttpResponse

def asset(request):
    if request.method == "POST":
        print(request.POST)#输出从客户端发送过来的数据
        #写入数据
        return HttpResponse(\'ok\')
    else:
        return HttpResponse(\'姿势不对,请换一下姿势\')
服务端

2. 这里可以封装成一个函数,放在中控机上: SSH方式

#####################通过paramiko连接远程服务器,执行命令################# 
#创建SSH对象 
ssh = paramiko.SSHClient() 
#允许连接不在know_hosts文件中的主机 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
#连接服务器 
ssh.connect(hostname=\'192.168.117.130\',port=22,username=\'root\',password=\'123456\') 
#执行命令 
stdin,stdout,stderr=ssh.exec_command(\'ifconfig\') 
#输入,输出,输出错误信息 
#yum 安装时输入Y或者N会出现stdin 
#获取命令结果 
result = stdout.read() 
#关闭连接 
ssh.close() 
print(result) #输出命令的结果 
#result有必要做格式化处理

# result = requests.get(\'http://www.127.0.0.1/assets.html\')#取数据 
# 举例result是列表类型 
# result = [\'c1.com\',\'c2.com\'] 
在列表做循环

3.saltstack方式

salt-master配置:
[root@python-web2 ~]# rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub [root@python-web2 ~]# yum install salt-master [root@python-web2 ~]# vi /etc/salt/master 编辑master配置文件
修改ip(本机ip)
配置文件监听本机ip

 interface: 192.168.117.130

[root@python-web2 ~]# /usr/bin/salt-master start 启动saltstack 这里是centos7,这种方式启动会失败

[root@python-web2 ~]#  systemctl start salt-master这里启动成功

 

[root@python-web2 ~]# salt-key -a 192.168.117.128  确认指定的证书
The following keys are going to be accepted:
Unaccepted Keys:
192.168.117.128
Proceed? [n/Y] Y
Key for minion 192.168.117.128 accepted.

[root@python-web2 ~]# salt-key -L 列出所有证书

 Accepted Keys:
 192.168.117.128
 Denied Keys:
 Unaccepted Keys:
 Rejected Keys:

salt-minion配置:
[root@localhost ~]# yum install salt-minion
[root@localhost ~]# vi /etc/salt/minion 修改配置文件
master: 192.168.117.130 服务端ip
[root@python-web2 ~]#  systemctl start salt-minion这里启动成功

master远程执行命令:

[root@python-web2 ~]# salt \'192.168.117.128\' cmd.run \'ifconfig\'
192.168.117.128:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.117.128 netmask 255.255.255.0 broadcast 192.168.117.255
inet6 fe80::20c:29ff:fed1:6595 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d1:65:95 txqueuelen 1000 (Ethernet)
RX packets 25872 bytes 28850791 (27.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12135 bytes 1231060 (1.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 5876 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 5876 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@python-web2 ~]# python

>>> import salt.client
>>> local = salt.client.LocalClient()

>>> result = local.cmd(\'192.168.117.128\',\'cmd.run\',[\'ifconfig\'])
>>> print(result)#result是一个字典
{\'192.168.117.128\': \'ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\\n inet 192.168.117.128 netmask 255.255.255.0 broadcast 192.168.117.255\\n inet6 fe80::20c:29ff:fed1:6595 prefixlen 64 scopeid 0x20<link>\\n ether 00:0c:29:d1:65:95 txqueuelen 1000 (Ethernet)\\n RX packets 26160 bytes 28870174 (27.5 MiB)\\n RX errors 0 dropped 0 overruns 0 frame 0\\n TX packets 12207 bytes 1237294 (1.1 MiB)\\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\\n\\nlo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536\\n inet 127.0.0.1 netmask 255.0.0.0\\n inet6 ::1 prefixlen 128 scopeid 0x10<host>\\n loop txqueuelen 1 (Local Loopback)\\n RX packets 72 bytes 5876 (5.7 KiB)\\n RX errors 0 dropped 0 overruns 0 frame 0\\n TX packets 72 bytes 5876 (5.7 KiB)\\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\'}
>>> result.keys()
[\'192.168.117.128\']
>>> result.values()
[\'ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\\n inet 192.168.117.128 netmask 255.255.255.0 broadcast 192.168.117.255\\n inet6 fe80::20c:29ff:fed1:6595 prefixlen 64 scopeid 0x20<link>\\n ether 00:0c:29:d1:65:95 txqueuelen 1000 (Ethernet)\\n RX packets 26160 bytes 28870174 (27.5 MiB)\\n RX errors 0 dropped 0 overruns 0 frame 0\\n TX packets 12207 bytes 1237294 (1.1 MiB)\\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\\n\\nlo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536\\n inet 127.0.0.1 netmask 255.0.0.0\\n inet6 ::1 prefixlen 128 scopeid 0x10<host>\\n loop txqueuelen 1 (Local Loopback)\\n RX packets 72 bytes 5876 (5.7 KiB)\\n RX errors 0 dropped 0 overruns 0 frame 0\\n TX packets 72 bytes 5876 (5.7 KiB)\\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\']

salt其实是一个py文件
打开/usr/bin/salt文件,会出现如下画面:

 

 

 

一、salt介绍
Salt是一个新的配置管理工具,部署容易,几分钟之内就能运行,可伸缩的足以管理成千上万的服务器,并且他们通讯很快,在秒级别
Salt的底层提供了一个动态的通讯机制,基于zeromq,能被用于编制、远程执行、配置管理等,
基于C/S形式,服务端是master,客户端是minion,类似于puppet,但是比puppet强大,基于python。可以抛弃小日本的ruby啦!
如果厌倦puppet的繁琐,可以试试这个,如果是puppet是apache,那么salt就是nginx,非常轻量级

二、salt安装(基于centos6.41、安装epel源(只有5和6,4的版本就不用想啦)
2、最新版本安装:yum --enablerepo=epel-testing install zeromq3 zeromq3-devel salt-master
yum --enablerepo=epel-testing install zeromq3 zeromq3-devel salt-minion
3、稳定版安装:yum install zeromq3 zeromq3-devel salt-master
      yum install zeromq3 zeromq3-devel salt-minion
注:5的版本装不了zeromq3,zeromq2有BUG,5安装方式用源代码安装,具体安装请看最下面的脚本
三、salt配置
配置文件位置:/etc/salt
master:基本上不需要修改
minion:指定master的地址,和id,如果不修改id,它默认通过 python函数socket.getfqdn()来获得主机名

四、启动salt
/etc/init.d/salt-master start  #master端
/etc/init.d/salt-minion start  #minion端

五、确认证书
master与minion交互都是加密的,所以在minion启动后,会向master发送key,然后master来确认。
salt-key 常用的命令选项
-a [option] 确认指定的证书
-A          确认所有的证书
-d [option] 删除指定的证书
-D删除所有的证书
-L          列出所有证书

[root@localhost soft]# salt-key -L
Accepted Keys:
Unaccepted Keys:
192.168.0.9
Rejected Keys:
[root@localhost soft]# salt-key -a 192.168.0.9
Key for minion 192.168.0.9 accepted.

注:如果master没确认证书,minion端会一直报以下错:
[salt.crypt][ERROR   ] The Salt Master has cached the public key for this node,
this salt minion will wait for 10 seconds before attempting to re-authenticate
saltstack主备安装方式

 

补充知识:

ssh-keygen的使用方法 :用于生成公钥和私钥,使A机器登录B机器不需要密码登录

一、概述
1、就是为了让两个Linux机器之间使用ssh不需要用户名和密码。采用了数字签名RSA或者DSA来完成这个操作
2、模型分析
假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机;

要达到的目的:
A机器ssh登录B机器无需输入密码;
加密方式选 rsa|dsa均可以,默认dsa
 
二、具体操作流程
 
单向登陆的操作过程(能满足上边的目的):
1、登录A机器 
2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;(直接运行 #ssh 192.168.20.60 )
 
双向登陆的操作过程:
1、ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.具体方法如下:
2、两个节点都执行操作:#ssh-keygen -t rsa 
  然后全部回车,采用默认值.

3、这样生成了一对密钥,存放在用户目录的~/.ssh下。
将公钥考到对方机器的用户目录下 ,并将其复制到~/.ssh/authorized_keys中(操作命令:#cat id_dsa.pub >> ~/.ssh/authorized_keys )。


4、设置文件和目录权限:
设置authorized_keys权限
$ chmod 600 authorized_keys 
设置.ssh目录权限
$ chmod 700 -R .ssh
ssh-keygen的使用方法

 

以上是关于CMDB配置资源管理数据库(理解)的主要内容,如果未能解决你的问题,请参考以下文章

cmdb是啥意思

CMDB与自动化运维,配置管理系统三大功能

python---CMDB配置管理数据库

ITGo对于企业CMDB建设的价值

CMDB 调研报告

CMDB项目开发