Python---Django项目实战:CMDB资产扫描和DevOPS自动化运维

项目实战: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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值