CMDB系统(实现自动化),Pycharm与Linux代码同步,虚拟机免秘钥登录,SCP虚拟机之间文件复制

什么是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.右侧栏可以查看到已经上传成功(可能需要刷新一下)
在这里插入图片描述

  1. 下载文件

在右侧栏(服务器)选中需要下载的文件,右键->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>]


嵌套蓝图

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值