文章目录

  • 1. 项目简介
  • 1.1 背景
  • 1.2 项目技术分析
  • 1.3 主要内容
  • 2.项目环境搭建1
  • 2.1 Django环境搭建
  • 2.2 ignore
  • 2.3 git仓库
  • 3.项目环境搭建2
  • 3.1 开发与生产环境搭建
  • 3.2 资产扫描
  • 3.2.1 简介
  • 3.2.2 主机存活探测协议
  • 3.3 远程连接控制
  • 3.3.1 项目目录配置
  • 3.3.2 创建远程虚拟环境
  • 3.4 MySQL 远程数据库配置
  • 3.4.1 安装数据库
  • 3.4.2 创建数据库并授权
  • 3.4.3 远程调试
  • 3.5 生产环境配置
  • 3.5.1 修改生产环境配置文件:
  • 3.5.2 安装数据库


1. 项目简介

1.1 背景

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

互联网快速发展

  • 网站用户规模、使用快速上升
  • 要求庞大系统支撑能力
  • 更加快速的运维效率应对突发流量
  • 更加自动化的方式减少人工投入成本
  • 更加可靠的技术手段,保障系统的稳定

云时代

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

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

1.2 项目技术分析

python资产管理 python资产扫描_python资产管理

1.3 主要内容

1.自动化资产扫描发现

  • 资产扫描的作用
  • nmap的作用
  • telnetlib端口扫描
  • pexpect登录探测
  • paramiko登录探测

ansible自动化任务在此不涉及

2.整体工程设计

  • 资产的自动化扫描发现
    用Python程序扫描发现企业内部的所有资产(服务器资产),当资产出现变动时能自动及时的发现并完成资产变更(eg: 服务器IP变更、机器集体报废)。
  • Ansible的自动化任务执行
    用Ansible的ad-hoc和playbook实现批量主机的自动化任务。

2.项目环境搭建1

和之前Django项目准备阶段一样,在此简单列出步骤:

  1. django项目创建cmdb
  2. 子应用的创建scanhost
  3. 设置本地化(语言,时区, 安装的应用)
  4. 应用数据库并创建超级用户
  5. 浏览器访问测试一下
  6. 基本的管理(requirements.txt和README.md文件)
  7. git的管理

2.1 Django环境搭建

python资产管理 python资产扫描_python资产管理_02


python资产管理 python资产扫描_数据库_03

python manage.py startapp scanhost

python资产管理 python资产扫描_python资产管理_04


应用数据库并创立超户:

python manage.py makemigrations

python manage.py migrate

python manage.py createsuperuser浏览器登录查看效果:

python资产管理 python资产扫描_mysql_05

2.2 ignore

python资产管理 python资产扫描_python资产管理_06


需要的模块

pip freeze > requirements.txt

python资产管理 python资产扫描_数据库_07


添加README.md

2.3 git仓库

设置本地仓库:
git initgit add *git commit -m "Django project init"

设置远程仓库:

python资产管理 python资产扫描_mysql_08


关联本低仓库与远程仓库:

git remote add origin https://gitee.com/yongle-lee/cmdb.git 首次上传:

git push --set-upstream origin master -f

python资产管理 python资产扫描_python资产管理_09


上传结果:

python资产管理 python资产扫描_数据库_10

3.项目环境搭建2

3.1 开发与生产环境搭建

设置默认环境变量,区分开发环境与生产环境:cmdb/cmdb/settings/_init_.py

import os

#默认开发环境是系统环境
env = os.environ.get('PROJECT_ENV','dev')
if env == 'dev':
    from .dev import *
elif env =='prod':
    from .prod import *
else:
    from .dev import *

cmdb/cmdb/settings/base.py
此处base文件直接将主目录下的settings.py文件剪切过来

开发环境数据库为sqlite:cmdb/cmdb/settings/dev.py

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

生产环境数据库为mysql:cmdb/cmdb/settings/prod.py

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cmdb',
        'USER': 'devops',
        'PASSWORD': 'devopspassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

此处对于开发环境(dev)来说,由于变更了数据库位置,进入后台将会报错,重新执行数据库迁移命令,设置超户即可;
但是对于生产环境来说,需要在环境最后添加禁止debug及允许的网段,添加以下:

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cmdb',
        'USER': 'devops',
        'PASSWORD': 'devopspassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

DEBUG = False   #debug调试在生产环境中一定要关闭

#ALLOWED_HOSTS = ['192.168.0.0/16']  #允许访问服务器的客户端网段信息
ALLOWED_HOSTS = ['*']

阶段完成后,上传至仓库

python资产管理 python资产扫描_mysql_11

3.2 资产扫描

3.2.1 简介

python资产管理 python资产扫描_python_12


优先实现资产管理:

python资产管理 python资产扫描_mysql_13

  • 资产管理是DevOPS系统的基础;
  • 资产管理是自动化运维平台构建的基础。

python资产管理 python资产扫描_python资产管理_14


资产管理的技术实现

  • 资产信息的手工录入: 手工操作工作量大,尤其是首次录入。
  • 客户端主机主动上报: 需要给不同的设备编写对应的客户端程序, 开发工作量大。
  • 服务器端主动发现探测

    服务器端主动发现探测(主要从前两个角度):

3.2.2 主机存活探测协议

  • ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个
    子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路 由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。(也就是能否ping通)
  • 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流
    的传输层通信协议。

Nmap探测工具

  • Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安全审计的网络安全工具。
  • 主要是简化ping操作。可以批量检测扫描网段,端口,操作系统等
# 使用-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

Nmap的Python操作接口: python-nmap

python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且
可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。

安装nmap的第三方模块:pip install python-nmap 添加utlis.py文件用来扫描(在win中执行不成功)

import nmap

def scan_active_host(subnet):
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts=subnet, arguments='-n -sP')
    print("扫描结果: ", result)
    # 返回的扫描具体的nmap命令行
    # print("nmap命令行: ", nm.command_line())
    # 返回nmap扫描的主机清单,格式为列表类型 print("主机清单: ", nm.all_hosts())
    # 查看指定主机信息 print('172.25.254.197的主机信息: ', nm['172.25.254.197'])

if __name__ == '__main__':
    scan_active_host('192.168.1.107.0/24')

python资产管理 python资产扫描_python_15

3.3 远程连接控制

3.3.1 项目目录配置

克隆代码

scp -r cmdb/ root@192.168.43.100:/root/

添加目标主机配置

python资产管理 python资产扫描_数据库_16


python资产管理 python资产扫描_数据库_17


python资产管理 python资产扫描_mysql_18


python资产管理 python资产扫描_mysql_19


设置总是更新(确保本地与远程测试同步)

python资产管理 python资产扫描_mysql_20


python资产管理 python资产扫描_python_21

3.3.2 创建远程虚拟环境

远程连接,创建虚拟环境并激活

python资产管理 python资产扫描_mysql_22

1.安装python3
yum install -y python3
2.安装虚拟环境
cd cmdb/
pip3 install virtualenv -i https://mirrors.aliyun.com/pypi/simple
3.激活虚拟环境
virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
4.安装所需的包
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

远程服务器解释器和目录映射的配置(设置完成后发现自动更新)

python资产管理 python资产扫描_python_23


python资产管理 python资产扫描_mysql_24


python资产管理 python资产扫描_python_25

3.4 MySQL 远程数据库配置

3.4.1 安装数据库

1.安装

yum install mariadb-server -y
yum install mariadb-devel -y
yum install gcc -y
yum install python3-devel -y
pip install mysqlclient -i https://mirrors.aliyun.com/pypi/simple
# 设置开机自启
systemctl enable --now mariadb.service
2.初始化
mysql_secure_installation

3.4.2 创建数据库并授权

1.进入数据库
mysql -uroot -p
2.创建数据库cmdb;(设置编码格式为'utf8')
MariaDB [(none)]> create database cmdb default charset='utf8';
3.创建远程访问数据库用户并授权
MariaDB [(none)]> create user cmdb@'%' identified by "cmdb";
MariaDB [(none)]> grant all on cmdb.* to cmdb@'%';
4.测试远程访问数据库
mysql -ucmdb -pcmdb -h192.168.43.100
MariaDB [(none)]> SHOW databases; # 可以查看到cmdb数据库

python资产管理 python资产扫描_数据库_26

3.4.3 远程调试

python资产管理 python资产扫描_mysql_27

3.5 生产环境配置

3.5.1 修改生产环境配置文件:

cmdb/settings/prod.py

from .base import  *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cmdb',
        'USER': 'cmdb',
        'PASSWORD': 'cmdb',
        'HOST': '192.168.43.100',
        'PORT': '3306',
    }
}
DEBUG = True  # debug调试在生产环境一定要关闭
# ALLOWED_HOSTS = ['192.168.0.0/16']  # 允许访问服务器的客户端网段信息
ALLOWED_HOSTS = ['*']  # 允许访问服务器的客户端网段信息

3.5.2 安装数据库

pip install mysqlclient -i https://mirrors.aliyun.com/pypi/simple