项目实战: CMDB自动化资产扫描
目录
Django项目搭建
django项目创建cmdb
- 子应用的创建scanhost
python manage.py startapp scanhost
- 设置本地化(语言,时区, 安装的应用)
# cmdb/settings.py
INSTALLED_APPS = [
# ......省略已有的应用
'scanhost', # 激活创建的app
]
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
- 应用数据库并创建超级用户
python manage.py migrate
python manage.py createsuperuser
- 启动项目浏览器访问测试一下
python manage.py runserver
- 测试
https://127.0.0.1:8000
https://127.0.0.1:8000/admin
项目代码的管理(requirements.txt, .gittignore文件和README.md文件)
pip freeze > requirements.txt
- git的管理
$ git init
$ git add *
$ git commit -m "django project init"
$ git remote add origin 远程仓库的网址
$ git push
- 本地pycharm配置远程部署信息
- 远程服务器安装虚拟环境
yum install python3 -y
pip3 install virtualenv
virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
pip install -r requirements.txt
- 配置pycharm的解释器为远程服务器解释器
配置项目数据库为mysql
- 安装mysql
yum install mariadb-server -y
systemctl start mariadb
systemctl enable mariadb
mysql
> create database cmdb default charset='utf8';
> create user cmdb@'%' identified by "cmdb";
> grant all on cmdb.* to cmdb@'%';
mysql_secure_installation
mysql -ucmdb -pcmdb -h192.168.63.130
yum install mariadb-devel.x86_64 -y
yum install python3-devel -y
pip3 install mysqlclient
- 预先配置
修改settings配置信息
关闭远程服务器防火墙和selinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
- 配置settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cmdb', # 数据库名称
'USER': 'cmdb', # 用户名
'PASSWORD': 'cmdb', # 用户密码
'HOST': '8.141.57.46', # 数据库服务器所在主机名
'PORT': '3306', # 数据库端口
}
}
关于数据库的配置结束。
- 数据库报错处理
运行项目时,出现报错如下,是因为缺少mysqlclient安装包.
- 解决方法:
pip install mysqlclient
- 安装失败,报错如下是缺少开发包的缘故。
解决方法:
yum install mariab-devel -y
yum install python-devel -y
- 项目开发步骤
创建Django工程
创建Django APP应用
python manage.py startapp scanhosts
- 数据库模型建模models
详细代码请访问:该gitee的仓库 :https://gitee.com/mr-xun/cmdb
- 安装数据库开发软件
yum install mariadb-devel -y
- 安装数据库连接模块(必须先安装mariadb-devel, 否则会报错)
pip install mysqlclient
- 编辑数据库模型文件
根据ORM(对象关系映射)将面向对象形式的模型进行迁移, 生成中间代码
python manage.py makemigrations
将生成的迁移文件转成SQL语句并执行SQL语句, 创建对应的数据库及数据库表
python manage.py migrate
Django后台管理界面 创建后台管理的超级用户
python manage.py createsuperuser
访问项目后台管理界面, 输入超级用户名称和密码即可进入后台界面.
Django工程多配置文件
base.py文件: 基本的配置文件,将原先seetings.py文件的内容拷贝进来.(参考第一个scanhost项目)
- 配置相关
配置数据库
配置时区和语言
# 主要代码
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
- dev.py文件: 开发环境的配置文件
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
- prod.py文件:生产环境的配置文件:
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cmdb',
# 'USER': 'devops',
# 'PASSWORD': 'devopspassword',
# 'HOST': '127.0.0.1',
'USER': 'cmdb',
'PASSWORD': 'cmdb',
'HOST': '8.141.57.46',
'PORT': '3306',
}
}
DEBUG = False # debug调试在生产环境一定要关闭
# ALLOWED_HOSTS = ['192.168.0.0/16'] # 允许访问服务器的客户端网段信息
ALLOWED_HOSTS = ['*'] # 允许访问服务器的客户端网段信息
- 修改__init__.py文件, 默认寻找的设置文件是当前项目中的settings文件, 如果是开发环境, 修改如下:
import os
# env = os.environ.get('PROJECT_ENV', 'dev')
env = os.environ.get('PROJECT_ENV', 'prod')
if env == 'dev':
from .dev import *
elif env == 'prod':
from .prod import *
else:
from .dev import *
如果项目将来需要上线, 修改启动项目访问的配置文件为生产环境的配置文件即可
资产管理
- 资产管理探测流程
- 存活探测: 获取局域网内存活的IP列表
- 主机探测: 获取系统版本(SN、版本、MAC地址)
- 主机关系探测: 识别宿主主机和虚拟机的关系
- 网络设备的探测: 探测网络设备信息(SN、设备名等),使用snmp协议
- 其他设备的探测:
主机存活探测模块和工具——Nmap探测工具
Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安 全审计的网络安全工具。
主机发现 - 识别网络上的主机。例如,列出响应TCP和/或ICMP请求或打开特定端口的主机。
# 使用-sP开关(Arp ping)执行PING命令,与windows / linux ping命令类似。
$ ping -c1 -w1 172.25.254.197
# 探测主机IP是否存活, &>/dev/null并将所有的输入重定向到垃圾箱
# && 如果前面的指令执行成功, 做什么操作(echo ok)
# || 如果前面的指令执行失败, 做什么操作(echo fail)
$ ping -c1 -w1 172.25.254.250 &>/dev/null && echo ok || echo fail
# 使用nmap命令, 如果报错-bash: nmap: command not found, 则yum 安装nmap安装包
$ nmap -n -sP 172.25.254.197
$ nmap -n -sP 172.25.254.0/24
- 端口扫描 - 枚举目标主机上的开放端口。
# Nmap默认端口的扫描范围1-10000
$ nmap -n -p 172.25.254.197
# 具体指定要扫描的端口为50-80
$ nmap -n -p50-80 172.25.254.197
# 具体指定要扫描的端口为22和80
$ nmap -n -p22,80 172.25.254.197
- 版本检测 - 询问远程设备上的网络服务以确定应用程序名称和版本号。
- OS检测 - 确定网络设备的操作系统和硬件特性。
# -O是检测操作系统交换机
$ nmap -O 172.25.254.197
- Nmap的Python操作接口: python-nmap
python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且 可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。
# 安装nmap的第三方模块
$ pip install python-nmap
Python的SSH登录模块paramiko
- 如何安装paramiko?
# 使用豆瓣的镜像源, 安装paramiko模块并指定安装版本为2.6.0.
$ pip install -i https://pypi.douban.com/simple paramiko==2.6.0
- 项目代码: 基于paramiko实现ssh客户端密钥远程登录
测试之前生成公钥和私钥进行测试:
# 生成公钥和私钥, 默认存储在 ~/.ssh/目录下. id_rsa私钥, id_rsa.pub公钥
ssh-keygen
# 希望我的主机可以无密码连接其他主机(需要将公钥分发给其他主机)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip
# 测试无密码连接是否成功
ssh user@ip
ssh -i 私钥位置 user@ip
pyhon‘代码实现公钥和私钥的无密码连接
系统信息获取
通过系统获取哪些信息
- Django数据库模型设计
apps/scanhost/models.py
详细代码请访问:该gitee的仓库 :https://gitee.com/mr-xun/cmdb
- models.py文件做了修改一定要生成迁移脚本并写入数据库中
python manage.py makemigrations
python manage.py migrate
# 创建超级用户用于后台登录
python manage.py createsuperuser
- 配置文件配置
STATIC_URL = '/static/'
scanhosts = [
# '127.0.0.1',
# '172.25.254.0/24',
# '192.168.43.0/24'
'8.141.57.46']
commands = {
'hostname': 'hostname',
'os_type': 'uname',
'os_distribution': 'dmidecode -s system-manufacturer',
'os_release': 'cat /etc/centos-release',
'MAC': 'cat /sys/class/net/`[^vtlsb]`*/address',
}
- 视图函数
apps/scanhost/views.py
详细代码请访问:该gitee的仓库 :https://gitee.com/mr-xun/cmdb
- 路由配置
cmdb/urls.py
详细代码请访问:该gitee的仓库 :https://gitee.com/mr-xun/cmdb
- 后台Admin管理
apps/scanhost/admin.py
详细代码请访问:该gitee的仓库 :https://gitee.com/mr-xun/cmdb
测试
运行项目python manage.py runserver 0.0.0.0:800
访问网址http://ip:port/admin
- 注意点:
# cmdb/settings/prod.py
# DEBUG 是False 是,css等样式表会丢失,DEBUG 是True 时,css就会生效
DEBUG = True
- 运行远程服务器项目
注:
CMDB补充学习资料: https://www.liujiangblog.com/course/django/121