一 项目介绍
本项目通过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 ~]
[root@foundation0 ~]
用户授权
[root@foundation0 ~]
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 ~]
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数据库配置
修改配置文件的信息
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
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`
INSTALLED_APPS = [
......省略部分
'django.contrib.staticfiles',
'scanhosts',
]
'default': {
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devopsProject',
'USER': 'devops',
'PASSWORD': 'westos',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
3 项目开发(一) 信息采集接口的实现
3.1 url设计
配置URL, 当用户访问http://127.0.0.1:8000/sendinfos这个网址时, 将用户请求交给user_info 视图函数处理。
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^sendinfos/$', user_infos),
]
3.2 视图函数的实现
def user_info(request):
地址和用户Agent(通常是浏览器的名称和版本号)
ip = request.META.get('REMOTE_ADDR')
user_agent = request.META.get('HTTP_USER_AGENT')
user_obj = UserIPInfo.objects.filter(ip=ip)
if not user_obj:
res = UserIPInfo.objects.create(ip=ip)
user_ip_id = res.id
else:
user_ip_id = user_obj[0].id
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
}
HttpResponse(json.dumps(result),
content_type='application/json')
return JsonResponse(result)
3.3 浏览器访问
可以多试试其他浏览器访问, 看看是否返回不同的结果。 浏览器访问结束后, 访问MySQL数据库, 看是否将数据信息采集成功并通过ORM的方式写入数据库中。
[root@foundation0 ~]
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 视图函数处理。
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^sendinfos/$', user_info),
url(r'^getinfos/$', user_history),
]
4.2 视图函数的实现
def user_history(request):
ip_lists = UserIPInfo.objects.all()
infos = {}
"""
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 配置日志的相关信息
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
https://docs.python.org/3/library/logging.html
'format': '{levelname} {asctime} {module} : {lineno} {message}',
'style': '{',
'datefmt': '%Y-%m-%d %H:%M:%S',
},
},
'handlers': {
'file': {
'level': 'INFO',
https://docs.python.org/3/library/logging.handlers.html
'class': 'logging.FileHandler',
'formatter': 'verbose',
'filename': os.path.join(BASE_DIR, 'devops.log')
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
}
}
5.2 写入日志
修改视图函数的逻辑内容, 在合适的位置添加日志输出, 便于程序的测试与排错。
重新访问网页, 查看devops.log文件测试日志是否成功写入
6 Django项目邮件告警管理
在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现。Django中提供了邮 件接口,使我们可以快捷的建设一个邮件发送系统。通常用于发送自定义消息或者通知告警等信息(当然 也可以通过短信接口或者微信接口, 便于维护人员快速响应)。
6.1 服务器端开启smtp协议支持(此处以QQ邮件服务器为例服务器)
6.2 客户端配置settings文件
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的类
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__)))
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系统的基础; 资产管理是自动化运维平台构建的基础。
七 相关代码已经上传,点击连接查看
添加链接描述
|