项目实战:CMDB自动化资产扫描和自动化运维
1、项目介绍
本项目基于Linux系统搭建系统集群,使用Ansible实现Linux集群下的批量部署和自动化管理,实现Web形式的自动化运维系统,集中批量控制服务器,最终实现能支撑1000台实例的环境提供管理和自动化任务,提高运维工程师的工作效率和质量。项目基于HTTP实现自动化任务接受和响应接口设计,基于MySQL用作的关系型数据存取,基于Redis的任务锁机制和消息队列, 基于MongoDB的事件日志记录, 最终实现邮件通知功能、敏感数据加密功能、日志事件记录功能。
主要目标是实现自动化资产扫描, 扫描指定网段的服务器资产信息,后续功能会进一步完善。
2、项目技术分析
运维自动化难点和痛点
- 开发人员: 没有系统管理、网络管理等相关运维工作经验,项目设计往往是大打折扣的。
- 运维人员: 不具备开发能力、没有项目的开发经验或能力
- 做好一个优秀的运维开发人员DevOPS = 运维能力 + 开发能力
项目技术难点
- 基本技能
- DevOPS构建之路
- Python基础语法
- Django框架
- 自动化资产扫描发现
- 资产扫描的作用
- nmap的作用
- telnetlib端口扫描
- pexpect登录探测
- paramiko登录探测
- Docker容器扫描
- KVM虚拟机扫描
- snmp网络设备扫描
- SDK调用扫描ESXI资产信息
- Ansible自动化任务
- Ansible的安装与配置
- Python与Ansible的操作
- Ansible adhoc
- Ansible playbook
- 核心类调用
- API 接口的封装
- 方法的改写
- Redis消息存储
- Mongo事件日志
整体工程设计
- 资产的自动化扫描发现
用Python程序扫描发现企业内部的所有资产(服务器资产),当资产出现变动时能自动及时的发现并完成资产变更(eg: 服务器IP变更、机器集体报废)。 - Ansible的自动化任务执行
用Ansible的ad-hoc和playbook实现批量主机的自动化任务。
3、项目环境搭建
项目环境要求
- Python解释器:3.x
- Django框架:2.x
- IDE编辑器工具Pycharm:不限制
- 自动化运维工具Ansible:2.x
- 关系型数据库MySQL/Mariadb:5.5.x
- Git工具与Git代码仓库:不限制
项目环境的搭建
项目目录的配置
- 创建Django项目devops
如果有云服务器时执行下面的操作,没有云服务器的操作在这个之后进行说明
-
连接并配置远程服务器
[tools]>[Deployment]
- 配置本地目录和远程服务器目录的映射(Mapping)
上述操作完成,修改本地文件,远程服务器文件也同时被修改。
远程服务器虚拟环境的配置
- 连接远程服务器命令行bash
- 创建虚拟环境并激活虚拟环境
cd /data/www/devops
virtualenv
-p /usr/bin/python3 env
source env/bin/active
pip install Django==2.2
- 出现的报错及处理方式
# sqlite版本问题
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
解决方式:不使用sqlite存储数据,使用mysql
# CMDB/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devopsProject',
'USER': 'devops',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
- 远程服务器解释器和目录映射的配置
- 在远程服务器上测试Django项目是否运行成功
python manage.py runserver
如果没有云服务器直接进行虚拟环境的创建
执行下面命令:
witch python3 # /usr/bin/python3
virtualenv -p /usr/bin/python3 env #创建虚拟环境
source env/bin/active #切换到虚拟环境
pip install Django==2.2
MySQL数据库配置
(远程)用户登录配置
- 管理数据库服务
[root@foundation0 ~]# systemctl start mariadb
[root@foundation0 ~]# systemctl enable mariadb
- 用户授权
[root@foundation0 ~]# mysql -uroot -pServer version: 5.5.52-MariaDB MariaDB Server
# 创建数据库
MariaDB [(none)]> create database if not exists devopsProject default charset
utf8;
Query OK, 1 row affected (0.01 sec)
# 新建用户
MariaDB [(none)]> create user devops@'%' identified by 'westos';
Query OK, 0 rows affected (0.03 sec)
# 用户授权
MariaDB [(none)]> grant all on devopsProject.* to devops@'%';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> Bye
- 测试用户授权是否成功
[root@foundation0 ~]# mysql -udevops -pwestos -hIP
Server version: 5.5.52-MariaDB MariaDB Server
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| devopsProject
|
+--------------------+
2 rows in set (0.01 sec)
Django数据库配置
# CMDB/settings.py
ALLOWED_HOSTS = ['*']
#
配置数据库: 使用mysql数据库,而不是默认的sqlite数据库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devopsProject',
'USER': 'devops',
'PASSWORD': 'devops',
'HOST': '47.92.255.98',
'PORT': '3306',
}
}
# 语言和时区的设置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
- 生成数据库表
python manage.py makemigrations # 生成迁移脚本
python manage.py migrate
# 写入数据库, 创建关于用户和用户组等数据表信息
python manage.py createsuperuser # 创建超级用户
# 启动项目, 访问网址http://IP:8000/admin
python manage.py runserver 0.0.0.0:8000
- 测试数据表是否创建?数据信息是否写入?
连接mariadb数据库
配置数据库信息
如果是本地数据库,Host填写127.0.0.1即可
访问数据库表和数据内容
数据库报错处理
运行项目时,出现报错如下,是因为缺少mysqlclient安装包.
解决方法:
pip install mysqlclient
安装失败,报错如下是缺少开发包的缘故。
解决方法
yum install mariab-devel -y
yum install python-devel -y
4、第一个DevOPS工程
项目功能
记录HTTP访问的IP及用户UA信息
- 运维模块: 了解运维的工作、Linux系统的基本操作、数据库基本管理操作、网络知识等。
- 开发模块: 本项目的重点, 掌握Python基础知识、常见数据类型、Django框架的技术模块、DevOPS项目构建模块等。
项目开发步骤
- 创建Django工程
- 创建Django APP应用
$ python manage.py startapp scanhosts
- 文件配置settings
# settings.py
# 1). 将新建的APP加入到项目中
INSTALLED_APPS = [
......省略部分
'django.contrib.staticfiles',
'scanhosts',
]
# 2). 配置数据库: 使用mysql数据库,而不是默认的sqlite数据库。
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devopsProject',
# 数据库名称 'USER': 'devops', # 用户名
'PASSWORD': 'westos', # 用户密码
'HOST': '127.0.0.1', # 数据库服务器所在主机名
'PORT': '3306', # 数据库端口
}
}
# 3). 语言和时区的设置(根据自己项目的需求, 选择修改)
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-hans' # 语言选择中文
TIME_ZONE = 'Asia/Shanghai' # 时区选择亚洲/上海
- 数据库模型建模models
安装数据库开发软件
$ yum install mariadb-devel -y
安装数据库连接模块(必须先安装mariadb-devel, 否则会报错)
$ pip install mysqlclient
编辑数据库模型文件:
# models.py
"""
- 一个类对应一个数据库表;
- 类的一个属性对应数据库表的一个表头;
- max_length: 字符串最大长度, 对应数据库的varchar类型
- default: 指定默认值
- verbose_name: 指定Django后台显示的列头信息
- auto_now: 每次修改记录时自动更新为当前时间
- Meta类的设置
- verbose_name: 指定Django后台显示的表名称单数
- verbose_name_plural: 指定Django后台显示的表名称复数
- db_table: 指定数据库表的名称, 默认是APP名称_类名称.
"""
class UserIPInfo(models.Model):
ip = models.CharField(max_length=150, default='', verbose_name='IP地址')
time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
class Meta:
verbose_name = '用户访问地址信息表'
verbose_name_plural = verbose_name db_table = 'user_IP_info'
class BrowseInfo(models.Model):
# null=True: 是针对数据库而言,True表示数据库的该字段可以为空。
user_agent = models.CharField(max_length=100, default='',
verbose_name='用户浏览器信息', null=True)
disk_id = models.CharField(max_length=256, default='', verbose_name='唯
一设备ID')
"""
ForeignKey是一种关联字段,将两张表进行关联的方式
on_delete: 是否级联删除, Django1.x默认级联删除, Django2.x必须手动指定
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
"""
user_ip = models.ForeignKey('UserIPInfo', on_delete=models.DO_NOTHING)
class Meta:
verbose_name = '用户浏览器信息表'
verbose_name_plural = verbose_name
db_table = 'browse_info'
根据ORM(对象关系映射)将面向对象形式的模型进行迁移, 生成中间代码
$ python manage.py
makemigrations
# 代码执行效果, 生成迁移文件,所在位置: scanhosts/migrations
Migrations for 'scanhosts':
scanhosts/migrations/0001_initial.py
- Create model UserIPInfo
将生成的迁移文件转成SQL语句并执行SQL语句, 创建对应的数据库及数据库表
$ python manage.py migrate
- Django后台管理界面
创建后台管理的超级用户
$ python manage.py
createsuperuser
Username (leave blank to use 'kiosk'): admin
Email address: admin@qq.com
Password:
Bypass password validation and create user anyway? [y/N]: y
Superuser crea