IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python项目实战之CMDB自动化资产扫描 -> 正文阅读

[Python知识库]python项目实战之CMDB自动化资产扫描

一 项目介绍

本项目通过KVM虚拟化搭建Linux系统集群,使用 Ansible实现Linux集群下的批量部署与自动化管理,实现Web形式的自动化运维系统,集中批量控制服务器, 最终实现能支撑1000台实例的环境提供管理和自
动化任务, 提高运维工程师的工作质量和效率。 项目基于HTTP实现自动化任务接受和响应接口设计,基于MySQL用作的关系型数据存取, 基于Redis的任务锁机制和消息队列, 基于MongoDB的事件日志记录, 最终实现邮件通知功能、敏感数据加密功能、日志事件记录功能。

这个文档主要目标是实现自动化资产扫描, 扫描指定网段的服务器资产信息。
互联网快速发展
网站用户规模、使用快速上升
要求庞大系统支撑能力
更加快速的运维效率应对突发流量
更加自动化的方式减少人工投入成本
更加可靠的技术手段,保障系统的稳定

云时代
腾讯云、阿里云、亚马逊云、青云等云厂商的市场份额不断增加
大部分技术架构设计不再以网络设计、IDC和系统硬件等方面作为重点
运维基础的、繁琐的工作逐步减少
小公司也不再需要一个运维工程师或者系统工程师

结论: 在这样的时代背景下, 大型互联网公司为了应对市场的快速变化,就需要运维自动化。

二 项目技术分析

1 运维自动化难点和痛点

开发人员: 没有系统管理、网络管理等相关运维工作经验,项目设计往往是大打折扣的。
运维人员: 不具备开发能力、没有项目的开发经验或能力
做好一个优秀的运维开发人员DevOPS = 运维能力 + 开发能力
本次项目实战就是用最短的时间、手把手地完成运维开发系统的开发实战。

2 项目技术难点

2.1 基本技能

DevOPS构建之路
Python基础语法
Django框架

2.2 自动化资产扫描发现

资产扫描的作用
nmap的作用
telnetlib端口扫描
pexpect登录探测
paramiko登录探测
Docker容器扫描
KVM虚拟机扫描
snmp网络设备扫描
SDK调用扫描ESXI资产信息

2.3 Ansible自动化任务

Ansible的安装与配置
Python与Ansible的操作
Ansible adhoc
Ansible playbook
核心类调用
API 接口的封装
方法的改写
Redis消息存储
Mongo事件日志

3 整体工程设计

3.1 资产的自动化扫描发现

用Python程序扫描发现企业内部的所有资产(服务器资产),当资产出现变动时能自动及时的发现并完成
资产变更(eg: 服务器IP变更、机器集体报废)。

3.2 Ansible的自动化任务执行

用Ansible的ad-hoc和playbook实现批量主机的自动化任务。

三 项目环境搭建

1 项目环境要求

Python解释器: 3.x
Django框架: 2.x
IDE编辑器工具Pycharm: 不限制
自动化运维工具Ansible: 2.x
关系型数据库MySQL/Mariadb: 5.5.x
高性能的key-value非关系型数据库 Redis 软件下载: 5.0.5
分布式文件存储数据库 MongoDB 软件下载: 4.2.4
Git工具与Github代码仓库: 不限制

2 项目目录的配置

创建Django项目devops
连接并配置远程服务器
[Tools] -> [Deployment]

3 MySQL数据库配置

3.1 远程用户登录配置

管理数据库服务

[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)

3.2 Django数据库配置

修改配置文件的信息

# devops/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

四 第一个DevOPS工程

1 项目功能

记录HTTP访问的IP及用户UA信息
运维模块: 了解运维的工作、Linux系统的基本操作、数据库基本管理操作、网络知识等。
开发模块: 本项目的重点, 掌握Python基础知识、常见数据类型、Django框架的技术模块、
DevOPS项目构建模块等。

2 项目开发步骤

创建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' # 时区选择亚洲/上海

3 项目开发(一) 信息采集接口的实现

3.1 url设计

配置URL, 当用户访问http://127.0.0.1:8000/sendinfos这个网址时, 将用户请求交给user_info
视图函数处理。

# first_devops/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^sendinfos/$', user_infos),
]

3.2 视图函数的实现

# scanhosts/views.py
def user_info(request):
# request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP
地址和用户Agent(通常是浏览器的名称和版本号)
ip = request.META.get('REMOTE_ADDR')
user_agent = request.META.get('HTTP_USER_AGENT')
# 使用filter()方法对数据进行过滤, 返回的是列表, 列表元素是符合条件的对象。
user_obj = UserIPInfo.objects.filter(ip=ip)
# 如果没有找到,则新建UserIPInfo对象,并获取对象编号(为了和BrowseInfo表关联)
if not user_obj:
res = UserIPInfo.objects.create(ip=ip)
user_ip_id = res.id
else:
user_ip_id = user_obj[0].id
# 新建BrowseInfo对象
BrowseInfo.objects.create(user_agent=user_agent, user_ip_id=user_ip_id)
# 字典封装返回的数据信息
result = {
'STATUS': 'success',
'INFO': 'User Info',
'IP': ip,
'User-Agent': user_agent
}
# 以json的方式封装返回, 下面的两种方式任选一种.
# return
HttpResponse(json.dumps(result),
content_type='application/json')
return JsonResponse(result)

3.3 浏览器访问

可以多试试其他浏览器访问, 看看是否返回不同的结果。
浏览器访问结束后, 访问MySQL数据库, 看是否将数据信息采集成功并通过ORM的方式写入数据库中。

[root@foundation0 ~]# mysql -udevops -p
Welcome to the MariaDB monitor.
Commands end with ; or \g.
MariaDB [(none)]> use devopsProject;
MariaDB [devopsProject]> select * from user_IP_info;
MariaDB [devopsProject]> select * from browse_info;

4 项目开发(二) 信息获取接口的实现

4.1 url设计

配置URL, 当用户访问http://127.0.0.1:8000/getinfos这个网址时, 将用户请求交给user_history
视图函数处理。

# first_devops/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^sendinfos/$', user_info),
url(r'^getinfos/$', user_history),
]

4.2 视图函数的实现

# scanhosts/views.py
def user_history(request):
# 获取UserIPInfo表的所有对象信息;
ip_lists = UserIPInfo.objects.all()
infos = {}
# 获取每个IP访问网站浏览器的信息, 格式如下:
"""
infos = {
'127.0.0.1' : ['UA-1', 'ua-2'],
'172.25.254.1' : ['UA-1', 'ua-2'],
}
"""
for item in ip_lists:
infos[item.ip] = [b_obj.user_agent for b_obj in
BrowseInfo.objects.filter(user_ip_id=item.id)]
result = {
'STATUS': 'success',
'INFO': infos
}
return JsonResponse(result)

5 Django项目日志管理

在编写程序过程中,很难免的会出现一些问题,程序并非按照我们预想的那样运行,这个时候我们通常
会对程序进行调试,来看看到底是哪边出了问题。而程序日志是来帮助我们记录程序运行过程的帮手,
善用日志的程序员也就能很快找出自己程序的问题所在从而快速解决问题。
在服务器级别的组件中都有对应的日志文件,例如MySQL、Redis、nginx、uWSGI都会在运行过程中
将一些信息写到日志文件中。
Django使用python的内置模块logging来管理自己的日志, 包含四大组件: 日志记录器Loggers、日志
处理器Handlers、日志过滤器Filters和日志格式化工具Formatters。

5.1 配置日志的相关信息

# first_devops/settings.py
# 日志管理的配置
LOGGING = {
'version': 1,
# disable_existing_loggers是否禁用已经存在的logger实例。默认值是True.
'disable_existing_loggers': False,
# formatters: 定义输出的日志格式。
'formatters': {
'verbose': {
# 格式化属性查看资料:
https://docs.python.org/3/library/logging.html#logrecord-attributes
'format': '{levelname} {asctime} {module} : {lineno} {message}',
# 变量的风格
'style': '{',
# 日期显示格式
'datefmt': '%Y-%m-%d %H:%M:%S',
},
},
# handlers定义处理器。
'handlers': {
'file': {
# 日志处理级别
'level': 'INFO',
# 日志处理类, 详细的请查看网站:
https://docs.python.org/3/library/logging.handlers.html
'class': 'logging.FileHandler',
# 日志处理后输出格式
'formatter': 'verbose',
# 记录日志的文件名, 存储在当前项目目录下的devops.log文件
'filename': os.path.join(BASE_DIR, 'devops.log')
},
},# loggers定义logger实例。
'loggers': {
'django': {
# 对应的handles对象列表
'handlers': ['file'],
# logger实例输出的日志级别
'level': 'INFO',
# 日志是否向上级传递。True 向上级传,False 不向上级传。
'propagate': True,
},
}
}

5.2 写入日志

修改视图函数的逻辑内容, 在合适的位置添加日志输出, 便于程序的测试与排错。

重新访问网页, 查看devops.log文件测试日志是否成功写入

6 Django项目邮件告警管理

在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现。Django中提供了邮
件接口,使我们可以快捷的建设一个邮件发送系统。通常用于发送自定义消息或者通知告警等信息(当然
也可以通过短信接口或者微信接口, 便于维护人员快速响应)。
在这里插入图片描述

6.1 服务器端开启smtp协议支持(此处以QQ邮件服务器为例服务器)在这里插入图片描述

6.2 客户端配置settings文件

# first_devops/settings.py
# 邮件配置
EMAIL_HOST = 'smtp.qq.com'
EMAIL_HOST_USER = 'QQ邮箱'
EMAIL_HOST_PASSWORD = '登录授权码(注意: 不是登录密码)'
EMAIL_PORT = 465
EMAIL_SUBJECT_PREFIX = 'Python开发社区'
EMAIL_USE_SSL = True

6.3 在Django的交互式环境测试邮件是否发送成功

$ python manage.py
shell
>>> from django.core.mail import send_mail
>>> help(send_mail)
>>> send_mail(subject="Django邮件发送测试代码", message='邮件发送测试成功',
from_email='发送人的邮箱地址', recipient_list=['接收人的邮箱地址1', '接收人的邮箱地
址2'])
1

6.4 查看邮箱是否收到测试邮件

6.5 编写封装类SendMail的类

# first_devops/scanhosts/utils/tools.py
import logging
from django.core.mail import send_mail
from datetime import datetime
from first_devops import settings
class SendMail(object):
"""发送邮件的封装类"""
def __init__(self, subject, message, recipient_list, ):
# 给每个邮件的标题加上当前时间, 时间格式为年月日_小时分钟秒_传入的邮件标题
subject_time = datetime.now().strftime('%Y%m%d_%H%M%S_')
self.recipient_list = recipient_list
self.subject = subject_time + subject
self.message = message
def send(self):
try:
send_mail(
subject=self.subject,
message=self.message,
from_email=settings.EMAIL_HOST_USER,
recipient_list=self.recipient_list,
fail_silently=False
)
return True
except Exception as e:
logging.error(str(e))
return False

6.6在Django自带的交互式环境shell‘中进行测试

$ python manage.py
shell
>>> from scanhosts.utils.tools import SendMail
>>> mail = SendMail('Django 测试标题', '邮件正文内容', ['976131979@qq.com'])
>>> mail.send()
True

五 第二个DevOPS工程

1 Django工程多配置文件

在这里插入图片描述

1.1 base.py文件: 基本的配置文件,将原先seetings.py文件的内容拷贝进来.(参考第一个devops项目)

配置数据库
配置时区和语言

1.2 development.py文件: 开发环境的配置文件

from .base import *
DEBUG = True

1.3 production.py文件: 生产环境的配置文件

from .base import
*
# 开发环境一定要关闭调试模式
DEBUG = False
# 允许所有主机访问
ALLOWED_HOSTS = ['*']

1.4 修改manage.py文件, 默认寻找的设置文件是当前项目中的settings文件, 如果是开发环境, 修改如下:

def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
'devops.settings.development')
# ......此处省略代码
if __name__ == '__main__':
main()

1.5 如果项目将来需要上线, 修改启动项目访问的配置文件为生产环境的配置文件即可, 如下:

def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
'devops.settings.production')
# ......此处省略代码
if __name__ == '__main__':
main()

1.6 启动项目

$ python manage.py
runserver
Django version 2.2.5, using settings 'devops.settings.development'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

2 Django工程应用与模块加载

为了方便在一个大的Django项目中,管理实现不同的业务功能, 我们会在项目中创建多个APP实现功
能。为了更加方便管理APP, 项目结构更加清晰。可以专门创建apps目录存储项目应用, 专门创建
extra_apps存储项目第三方APP, 项目结构如下所示:
在这里插入图片描述
但项目运行时, 不会自动寻找apps和extra_apps子目录中创建的APP, 需要手动在配置文件中配置,
修改devops/settings/base.py文件, 添加内容如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 将apps目录和extra_apps添加到python的搜索模块的路径集中
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
# .........

添加成功后, 进入Django工程的交互式环境, 查看sys.path变量的值, 判断是否添加成功?

$ python manage.py
shell
In [1]: import sys
In [2]: sys.path
Out[2]:
['/home/kiosk/PycharmProjects/devops/devops/extra_apps',
'/home/kiosk/PycharmProjects/devops/devops/apps',
'/home/kiosk/PycharmProjects/devops',
# .......此处为了美观, 省略部分路径........
]

六 资产管理

1 为什优先实现资产管理?

资产管理是运维的基本工作;
在这里插入图片描述
资产管理是DevOPS系统的基础;
资产管理是自动化运维平台构建的基础。

七 相关代码已经上传,点击连接查看

添加链接描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:35:07  更:2021-08-06 09:35:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 7:03:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码