什么是CMDB?
CMDB本质上是一个数据库,而对于运维人员来讲,更注重于业务的发布和运行,因此,CMDB中至少需要管理的有:主机、IP、端口、应用和域名。如果使用了Kubernetes集群,还要关注Kubernetes集群资源。
采集的数据
基础信息-硬件类(服务器、内存条、磁盘、网卡…)
SN => 序列号
厂商 => Lenovo
型号 => M410
CPU => (型号、厂商、频率…) => cpu->server
磁盘 => (SN、型号、厂商、容器…) => disk->server
内存 => (SN、型号、厂商、容器…) => mem->server
网卡 => (SN、型号、厂商、容器…) => network->server
维保 => 2020/08/01
上架时间 =>
自有/外部 =>
虚/实/宿主
业务信息:
业务信息如何采集: 制定标准。/var/log/.info => Admin=cali, 业务=消消乐…
管理员
所属业务
IP
IDC-机房
OS
是否在线(线上/线下/库备/报废)
机柜
网络环境
系统的密码
管理网的密码
使用Pycharm连接服务器,实现代码同步
1.点击(tools->deployment->configuration)
2.
3.关联本地文件夹与服务器文件夹
4.查看是否连接成功
’
6.右边出现以下界面,说明配置成功
7.同步代码
上传代码:在本地选中要上传的文件,右键->deployment->upload to XX
8.右侧栏可以查看到已经上传成功(可能需要刷新一下)
- 下载文件
在右侧栏(服务器)选中需要下载的文件,右键->downloadfromhere
三台虚拟机 免秘钥登录(公钥认证)
前提:三台虚拟机都需要安装python
1.选一台虚拟机(A:192.168.100.129)
[root@localhost ~] ssh-keygen
产生.shh文件
在这里插入代码片[root@localhost ~]cd .ssh/
[root@localhost .ssh] ls
id_rsa id_rsa.pub known_hosts
[root@localhost .ssh] cat id_rsa.pub
2.进入B虚拟机
在家目录创建.shh
把a 机器的id_rsa.pub里的内容 复制到b机器的authorized_keys里面
[root@localhost ~] mkdir .ssh
mkdir: cannot create directory ‘.ssh’: File exists
[root@localhost ~] cd .ssh/
[root@localhost .ssh] vim authorized_keys
把a 机器的id_rsa.pub里的内容 复制到b机器的authorized_keys里面
修改b机器.ssh的权限 chmod 700 .ssh -R
3.完成之后 在a机器上 ssh登录b机器 首次登录会跳出提示框,输入yes即可。 就可以登录到b机器,无需输入密码
[root@localhost .ssh]# ssh 192.168.100.148
Last login: Sat Oct 10 18:50:07 2020 from 192.168.100.1
4.进去A
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nodejs root
[root@localhost opt]# cd root/
[root@localhost root]# ls
cmdbclient2020
[root@localhost root]# cd cmdbclient2020/
[root@localhost cmdbclient2020]# ls
bin docs files log ReadMe.md
config env_init.sh lib plugins requirements.txt
[root@localhost cmdbclient2020]# pip3 install -r requirements.txt
[root@localhost cmdbclient2020]# pip3 install distro==1.4.0
5.运行
[root@localhost cmdbclient2020]# cd bin/
[root@localhost bin]# ls
run.py
[root@localhost bin]# python3 run.py
{
"status": true,
"message": "",
"data": {
"os_platform": "Linux",
"os_version": "CentOS Linux 8 Core",
"manufactory": "VMware, Inc.",
"model": "VMware Virtual Platform",
"sn": "VMware-56 4d 9f c9 32 c2 4a a0-93 99 d3 9d d4 21 9e 16",
"cpu_count": 2,
"cpu_physical_count": 1,
"cpu_model": " AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx",
"disk": {
"status": 1,
"data": {
"0": {
"slot": "0",
"pd_type": "SAS",
"capacity": "279.396",
"model": "SEAGATE ST300MM0006 LS08S0K2B5NV"
},
"1": {
"slot": "1",
"pd_type": "SAS",
"capacity": "279.396",
"model": "SEAGATE ST300MM0006 LS08S0K2B5AH"
},
"2": {
"slot": "2",
"pd_type": "SATA",
"capacity": "476.939",
"model": "S1SZNSAFA01085L Samsung SSD 850 PRO 512GB EXM01B6Q"
},
"3": {
"slot": "3",
"pd_type": "SATA",
"capacity": "476.939",
"model": "S1AXNSAF912433K Samsung SSD 840 PRO Series DXM06B0Q"
},
"4": {
"slot": "4",
"pd_type": "SATA",
"capacity": "476.939",
"model": "S1AXNSAF303909M Samsung SSD 840 PRO Series DXM05B0Q"
},
"5": {
"slot": "5",
"pd_type": "SATA",
"capacity": "476.939",
"model": "S1AXNSAFB00549A Samsung SSD 840 PRO Series DXM06B0Q"
}
}
},
"memory": {
"status": 1,
"data": {
"RAM slot #0": {
"capacity": 0,
"slot": "RAM slot #0",
"model": "DRAM",
"speed": "Unknown",
"manufactory": "Not Specified",
"sn": "Not Specified"
}
}
},
"nic": {
"status": 1,
"data": {
"ens33": {
"up": true,
"hwaddr": "00:0c:29:21:9e:16",
"ipaddrs": "192.168.100.129",
"netmask": "255.255.255.0"
}
}
}
}
}
信息收集脚本
[root@localhost cmdbclient2020-linux]# python3 servers_info.py
Traceback (most recent call last):
File "servers_info.py", line 8, in <module>
import paramiko
ModuleNotFoundError: No module named 'paramiko'
[root@localhost cmdbclient2020-linux]# pip3 install paramiko
虚拟机之间文件复制
[root@linux2 cmdb]# scp /opt/cmdb/servers_info.py root@192.168.100.129:/opt/root
root@192.168.100.129's password:
servers_info.py 100% 2224 925.4KB/s 00:00
[root@localhost root]# python3 servers_info.py
Begin......
{'sn2': {'status': True, 'message': '', 'data': {'os_platform': 'Linux', 'os_version': 'got os version failed', 'manufactory': 'VMware, Inc.', 'model': 'VMware Virtual Platform', 'sn': 'VMware-56 4d 94 aa 12 07 3c 50-d6 e9 53 ca 7b 94 cd ff', 'cpu_count': 2, 'cpu_physical_count': 2, 'cpu_model': ' AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx', 'disk': {'status': 1, 'data': {'0': {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'}, '1': {'slot': '1', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5AH'}, '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1SZNSAFA01085L Samsung SSD 850 PRO 512GB EXM01B6Q'}, '3': {'slot': '3', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF912433K Samsung SSD 840 PRO Series DXM06B0Q'}, '4': {'slot': '4', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF303909M Samsung SSD 840 PRO Series DXM05B0Q'}, '5': {'slot': '5', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAFB00549A Samsung SSD 840 PRO Series DXM06B0Q'}}}, 'memory': {'status': 1, 'data': {'RAM slot #0': {'capacity': 2048, 'slot': 'RAM slot #0', 'model': 'DRAM', 'speed': 'Unknown', 'manufactory': 'Not Specified', 'sn': 'Not Specified'}}}, 'nic': {'status': 1, 'data': {'ens33': {'up': True, 'hwaddr': '00:0c:29:94:cd:ff', 'ipaddrs': '192.168.100.148', 'netmask': '255.255.255.0'}}}}}}
End......
CMDB数据库设计
设计完数据库,进行添加数据。
1.进入manage.py shell
在git bash(项目目录里)
python manage.py shell
>>> from model.cmdb import Asset,Manufactory
>>> a1=Asset(asset_sn="sn1")
>>> from model.base import db
>>> db.session.add(a1)
>>> db.session.commit()
>>> db.session.add_all([m1,m2])
>>> db.session.commit()
>>> a3.manufactory=m2
>>> db.session.commit()
结果:
一对多关系
cmdb.py
from .base import db
from libs.enums import AssetType
from sqlalchemy import Column,Integer,String
class Asset(db.Model):
__tablename__ = "asset"
asset_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
asset_asset_type = db.Column(db.Enum(AssetType))
asset_hostname = db.Column(db.String(64))
asset_sn = db.Column(db.String(128), nullable=False,unique=True)
manufactory_id = db.Column(db.ForeignKey('manufactory.manufactory_id'))
class Manufactory(db.Model):
__tablename__ = "manufactory"
manufactory_id = db.Column(db.Integer, primary_key=True,autoincrement=True)
assets = db.relationship("Asset",backref = "manufactory")
manufactory_name = db.Column(db.String(64))
manufactory_tel = db.Column(db.String(11))
note = db.Column(db.Text)
create_at = db.Column(db.DateTime)
update_at = db.Column(db.DateTime)
#记录是否启用
status =db.Column(db.Integer)
多对多关系
cmdb.py QQ音乐和酷狗音乐 两个管理者之间多对多的关系。
from .base import db
from libs.enums import AssetType
from .user import UserProfile
# from sqlalchemy import Column,Integer,String
class Asset(db.Model):
__tablename__ = "asset"
asset_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
asset_asset_type = db.Column(db.Enum(AssetType))
asset_hostname = db.Column(db.String(64))
asset_sn = db.Column(db.String(128), nullable=False,unique=True)
manufactory_id = db.Column(db.ForeignKey('manufactory.manufactory_id'))
asset_model=db.Column(db.String(64))
asset_warranty=db.Column(db.DateTime())
#业务人员
business_unit_users=db.Table("business_unit_users",
db.Column("user_prodile_id",db.ForeignKey("user_profile.user_profile_id")),
db.Column("business_unit_id",db.ForeignKey("business_unit.business_unit_id"))
)
class BusinessUnit(db.Model):
__tablename__="business_unit"
business_unit_id=db.Column(db.Integer,primary_key=True,autoincrement=True)
business_name=db.Column(db.String(64))
business_name_cn=db.Column(db.String(64))
manager =db.relationship("UserProfile",
secondary=business_unit_users,
backref="business_units")
note=db.Column(db.Text)
create_at = db.Column(db.DateTime)
update_at = db.Column(db.DateTime)
class Manufactory(db.Model):
__tablename__ = "manufactory"
manufactory_id = db.Column(db.Integer, primary_key=True,autoincrement=True)
assets = db.relationship("Asset",backref = "manufactory")
manufactory_name = db.Column(db.String(64))
manufactory_tel = db.Column(db.String(11))
note = db.Column(db.Text)
create_at = db.Column(db.DateTime)
update_at = db.Column(db.DateTime)
#记录是否启用
status =db.Column(db.Integer)
>>> from model.cmdb import BusinessUnit
>>> from model.user import UserProfile
>>>u1=UserProfile(user_profile_name="user_wen")
>>>u2=UserProfile(user_profile_name="user_wen")
>>> b1=BusinessUnit(business_name="b1")
>>> b2=BusinessUnit(business_name="b2")
>>> from model.base import db
>>> db.session.add_all([u1,u2,b1,b2])
>>> db.session.commit()
>>> dir(u1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init_
_', '__init_subclass__', '__le__', '__lt__', '__mapper__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr
__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager', '_sa_in
stance_state', 'business_units', 'metadata', 'query', 'query_class', 'user_profile_id', 'user_profile_name']
>>> u1.business_units
[]
>>> u1.business_units.append(b1)
>>> u1.business_units.append(b2)
>>> u3.business_units.append(b2)
>>> u2.business_units.append(b1)
>>> db.session.commit()
>>> u1.business_units
[<BusinessUnit 1>, <BusinessUnit 2>]
>>> u3.business_units
[<BusinessUnit 2>]
>>> dir(b1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init_
_', '__init_subclass__', '__le__', '__lt__', '__mapper__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr
__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager', '_sa_in
stance_state', 'business_name', 'business_name_cn', 'business_unit_id', 'create_at', 'manager', 'metadata', 'note', 'query', 'query_class', 'update
_at']
>>> b1.manager
[<UserProfile 1>, <UserProfile 4>]
多个外键链接到同一个表
cmdb.py
python manage.py shell
>>> from model.cmdb import Asset,BusinessUnit
>>> from model.user import UserProfile
>>> a1=Asset.query.get(1)
>>> a2=Asset.query.get(2)
>>> b1=BusinessUnit.query.get(1)
>>> b2=BusinessUnit.query.get(2)
>>> b3=BusinessUnit(business_name="资产组")
>>> from model.user import db
>>> db.session.add(b3)
>>> db.session.commit()
>>> u4=UserProfile(user_profile_name="wenwenwen")
>>> db.session.add(u4)
>>> db.session.commit()
>>> b3.manage.append(u1)
>>> b3.manager.append(u4)
>>> b2.admin=b3
>>> a2.admin=b3
>>> db.session.commit()
查找a2业务管理人员
>>> a2.business_unit.manager
[<UserProfile 1>, <UserProfile 3>]
查找a2硬件管理人员
>>> a2.admin.manager
[<UserProfile 5>]
嵌套蓝图