docker 定时发送邮件 采集虚拟机信息

这篇博客介绍了如何利用Docker、Python和QQ邮箱实现定时从虚拟机收集信息并发送邮件。首先,将Python脚本上传到虚拟机,创建`requirements.txt`列出依赖。接着,编写`Dockerfile`打包成镜像,并检查镜像是否创建成功。然后,通过`docker run`启动Docker容器,并用crontab设置定时任务,如每天20点执行邮件发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用的是QQ邮箱  

#coding=utf-8

import os

import time

import re

import socket

from email.mime.text import MIMEText

from email.header import Header

import smtplib

import psutil  # python -m pip install --upgrade pip -i https://pypi.douban.com/simple

#保存所有和本地计算机建立连接的IP信息到文件中

def netstat_write(filename):

    # 通过os模块打开终端,并且运行一个终端命令,netstat -an命令能看到所有和本地计算机建立连接的IP

    querys = os.popen('netstat -an').read()

    # 打开一个实体文件,通过w写入的方式将终端命令执行的结果写入filename文件中

    with open(filename, 'w') as fs:

        fs.write(querys)



#筛选链接的ip和端口号

def netstat_read(filename):

    remotes = []

    # 打开一个实体文件,通过读取的方式读取终端命令执行的结果

    with open(filename, 'r') as fs:

        querys = fs.read()

        #255.255.255:433

        #201.255.255:433

        #1.255.255:433

        result = re.findall('(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2
<think>嗯,用户想了解如何用Python构建CMDB系统。首先,我需要回顾一下CMDB的基本概念,确保自己理解正确。CMDB是配置管理数据库,主要用于存储和管理IT基础设施的配置信息,对吧?用户可能是一个运维人员或者开发者,想要自己搭建一个这样的系统来管理公司的资源,避免之前提到的Excel表格更新不及时的问题,比如引用5里提到的那个经理在机房找不到服务器的情况。 接下来,我得整理构建CMDB的关键步骤。根据用户提供的引用内容,引用1提到了维易CMDB的设计思路,引用2、3、4、5涉及Python代码示例,比如使用Puppet进行数据收集、SNMP检查脚本、定时任务更新资产信息等。所以可能需要包括数据模型设计、数据采集方式、API开发、存储方案、权限控制等步骤。 首先,数据模型设计。引用1提到模型需要灵活,可能需要根据不同的资产类型设计动态字段。比如服务器、网络设备、虚拟机等,每种类型有不同的属性。这里可能需要用到Django的模型继承或者JSON字段来灵活存储。 然后是数据采集。用户提供的引用中有使用SaltStack(引用4)、Puppet(引用2)、SNMP(引用3)等方式采集数据。Python可以通过调用这些工具的API或者执行命令来获取资产信息。比如在Django中编写自定义的management命令,定期执行采集任务,并将数据存储到数据库。 存储方案的话,用户可能希望使用数据库,比如MySQL或PostgreSQL,或者NoSQL如MongoDB来存储动态结构的数据。引用1中的维易CMDB可能用了某种灵活的设计,比如动态模型或者JSON字段,这样可以根据需要扩展字段。 API开发部分,需要提供RESTful接口,方便其他系统集成。使用Django REST framework可以快速搭建API,同时实现权限控制和数据校验。引用4中的task_update_asset函数可能是一个定时任务,用来更新资产信息,这里可能需要用到Celery或者APScheduler来处理异步任务。 权限控制方面,CMDB存储的是关键数据,必须严格控制访问。引用1提到他们的系统已经成为团队每天必用的工具,所以权限管理很重要。Django自带的权限系统或者使用第三方包如django-guardian来实现更细粒度的控制。 前端展示部分,可能需要一个清晰的界面,让用户方便地查看和操作数据。引用5中提到之前的Excel管理不便,所以一个好的UI是必要的。Django Admin虽然简单,但可能不够,需要自定义前端,比如使用Vue.js或React,或者基于Django的模板系统开发。 另外,用户提供的引用中有一些代码示例,比如引用3中的SNMP检查脚本,引用4中的定时任务,引用2中的Puppet报告生成。这些可以作为数据采集的参考,整合到CMDB系统中。比如通过SaltStack或Puppet收集资产信息,然后通过API提交到CMDB的数据库。 还需要考虑数据同步和更新的机制,确保CMDB中的数据是最新的。比如定期运行采集脚本,或者通过事件触发更新。引用4中的task_update_asset函数可能是一个定时任务,使用SaltStack的grains来获取系统信息,然后保存到数据库。 可能的问题还有如何保证数据的一致性,如何处理不同来源的数据冲突,以及如何实现自动化发现和更新。这些都需要在系统设计时考虑进去。比如使用唯一标识符(如主机名、IP地址)来合并不同来源的数据,或者设置数据源的优先级。 最后,测试和部署也是重要的环节。用户可能希望知道如何部署这样一个系统,是否需要用到Docker、如何配置Web服务器等。不过用户的问题主要是如何构建,所以可能不需要详细部署步骤,但需要提到相关工具的选择。 总结一下,构建CMDB系统的步骤大致包括:设计数据模型、选择数据采集方式、开发API、实现存储和权限控制、构建前端界面、自动化数据同步和更新。同时,参考用户提供的引用中的代码示例,整合不同的数据采集工具和方法,确保系统的灵活性和可扩展性。</think>### 如何使用Python构建CMDB系统 #### 一、核心设计思路 1. **数据模型设计** - **动态字段管理**:通过灵活的数据模型(如Django的`JSONField`或自定义动态表结构)支持不同资产类型的扩展属性。例如,服务器需要`CPU型号`,而网络设备需要`端口数量`[^1]。 - **关系映射**:定义资产之间的关联关系(如服务器与虚拟机的主从关系),可通过外键或图数据库(如Neo4j)实现[^1]。 2. **数据采集方式** - **自动化采集**:通过Python调用工具如SaltStack、Ansible或自定义脚本(如引用4中的`task_update_asset`函数)定期采集主机信息。 - **SNMP协议**:使用`pysnmp`库(如引用3的代码示例)获取网络设备基础信息。 - **API集成**:对接云平台(如AWS/Aliyun SDK)拉取云资源数据。 #### 二、技术实现步骤 1. **搭建基础框架** ```python # 示例:Django模型定义(简化版) from django.db import models class Asset(models.Model): name = models.CharField(max_length=100) asset_type = models.CharField(max_length=50) # 如server/network/vm ip = models.GenericIPAddressField() created_time = models.DateTimeField(auto_now_add=True) custom_fields = models.JSONField() # 存储动态属性 ``` 2. **数据采集与存储** ```python # 示例:SaltStack调用(参考引用4) import salt.client def collect_asset_data(): local = salt.client.LocalClient() grains = local.cmd('*', 'grains.items') for host, data in grains.items(): Asset.objects.update_or_create( name=host, defaults={'custom_fields': data} ) ``` 3. **API开发** ```python # 示例:Django REST Framework接口(简化版) from rest_framework import serializers, viewsets class AssetSerializer(serializers.ModelSerializer): class Meta: model = Asset fields = '__all__' class AssetViewSet(viewsets.ModelViewSet): queryset = Asset.objects.all() serializer_class = AssetSerializer ``` 4. **权限控制** - 使用Django内置权限系统或`django-guardian`实现细粒度权限管理。 - 示例配置: ```python # settings.py REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] } ``` #### 三、关键优化方向 1. **自动化发现** - 结合ARP扫描(如`scapy`库)或ICMP探测实现新设备自动注册。 2. **数据一致性** - 通过唯一标识(如MAC地址/序列号)合并多来源数据。 3. **可视化与告警** - 使用Grafana展示资产拓扑,集成Prometheus监控异常状态(如引用3的SNMP检查脚本)。 #### 四、部署与扩展 1. **容器化部署** ```dockerfile # Dockerfile示例 FROM python:3.9 RUN pip install django gunicorn COPY . /app WORKDIR /app CMD ["gunicorn", "cmdb.wsgi:application", "--bind", "0.0.0.0:8000"] ``` 2. **扩展性设计** - 使用消息队列(如RabbitMQ)异步处理大规模数据采集任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值