运维工单--消息队列发送邮件

在写运维工单的消息推送时,直接使用邮件发送会导致系统反应特别慢,所以研究了一下rabbitmq+celery来实现邮件发送的异步执行

部署rabbitmq

RabbitMQ是基于Erlang的,所以首先必须配置Erlang环境。

从Erlang的官网 http://www.erlang.org/download.html 下载最新的erlang安装包,我下载的版本是 otp_src_R15B01.tar.gz。

tar xvzf otp_src_R15B01.tar.gz
cd otp_src_R14B03
./configure
make
make install

安装完Erlang,开始安装RabbitMQ-Server。

主要参考官方文档:http://www.rabbitmq.com/build-server.html

需要安装一个比较新的Python版本。安装略。

‘‘‘

这一步我没有做,安装也没收到影响,在此仅是记载

需要安装simplejson。从此处下载最新的版本: http://pypi.python.org/pypi/simplejson#downloads 。我下载的版本是 simplejson-2.2.1.tar.gz

$ tar xvzf simplejson-2.2.1.tar.gz
$ cd simplejson-2.2.1
$ sudo python setup.py install

‘‘‘‘

然后安装RabbitMQ Server。从此处下载源代码版本的RabbitMQ: http://www.rabbitmq.com/server.html。我下载的版本是 rabbitmq_server-3.5.4.tar.gz

$ tar xvzf rabbitmq_server-3.5.4.tar.gz
$ cd rabbitmq_server-3.5.4
$ make
# TARGET_DIR=/usr/local SBIN_DIR=/usr/local/sbin MAN_DIR=/usr/local/man make install

在sbin/目录下出现了三个命令:

rabbitmqctl  rabbitmq-env  rabbitmq-server

安装成功。

运行

找到sbin/目录,运行程序:

/usr/local/sbin/rabbitmq-server –detached

停止程序:

/usr/local/sbin/rabbitmqctl stop

在settings.py中加入rabbitmq配置:

BROKER_HOST = "127.0.0.1"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

‘‘‘以下为参考资料‘‘‘

配置

主要参考官方文档:http://www.rabbitmq.com/configure.html

一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:

一个是环境变量的配置文件 rabbitmq-env.conf ;

一个是配置信息的配置文件 rabbitmq.config;

注意,这两个文件默认是没有的,如果需要必须自己创建。

rabbitmq-env.conf

这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。

文件的内容包括了RabbitMQ的一些环境变量,常用的有:

#RABBITMQ_NODE_PORT=    //端口号

#HOSTNAME=

RABBITMQ_NODENAME=mq

RABBITMQ_CONFIG_FILE=        //配置文件的路径

RABBITMQ_MNESIA_BASE=/rabbitmq/data        //需要使用的MNESIA数据库的路径

RABBITMQ_LOG_BASE=/rabbitmq/log        //log的路径

RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins    //插件的路径

具体的列表见:http://www.rabbitmq.com/configure.html#define-environment-variables

rabbitmq.config

这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。

它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。

文件的内容详见:http://www.rabbitmq.com/configure.html#config-items

部署celery

直接执行

    pip install django-celery

在settings.py中加入以下配置

 import djcelery
    djcelery.setup_loader()
    ...
    INSTALLED_APPS = (
       ...
       ‘djcelery‘,
       ...
    )

最后创建Celery所需的数据表, 如果使用South作为数据迁移工具, 则运行:

    python manage.py migrate

否则运行: (Django 1.6或Django 1.7都可以)

    python manage.py syncdb

到此django+rabbitmq+celery的环境就部署完了,下面是邮件发送的代码,这里是用的django自带的邮件发送功能

在settings.py中加入邮件发送配置:

EMAIL_HOST=‘outlook.office365.com‘
EMAIL_HOST_USER=‘**@**.com‘
EMAIL_HOST_PASSWORD=‘***‘
EMAIL_USE_TLS = True

创建一个新py文件,命名为tasks.py

from celery.task import Task
from celery import task
from workflow import models
from django.core.mail import EmailMessage
from django.template import loader
from worksystem.settings import EMAIL_HOST_USER
@task() 
def send_email(subject, content, to_name_list):
    html_content = loader.render_to_string(
                        ‘sendmail.html‘,               #需要渲染的html模板
                        {
                         ‘content‘:content
                            
                        }
                   )
    msg = EmailMessage(subject, html_content, EMAIL_HOST_USER, to_name_list)
    msg.content_subtype = "html" # Main content is now text/html
    msg.send()

sendmail.html模版:

<!DOCTYPE html>
<html lang="en">
<h>您好,您有新工单消息提醒,详情请点击 http://**.**.com/</h>
<table class="cellspacing="1px" style="width: 50%; border: 1px outset rgb(128, 128, 128); border-spacing: 1px;"">
                <thead>
                    <tr>
                        <th style="border:1px #808080 inset;padding:1px;">列名</th>
                        <th style="border:1px #808080 inset;padding:1px;">相应值</th>
                    </tr>
                </thead>
                <tbody>
                {% for item in content %}
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">主键ID</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.id }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">工单名称</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.title }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">申请人</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.creator }}</th>
                </tr>             
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">工单类型</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.type }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">创建时间</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.create_time|date:"Y-m-d H:i:s" }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">审批人</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.approveuser }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">描述</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.description }}</th>
                </tr>
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">处理人</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.deal_user }}</th>
                </tr>                  
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">运帷回复</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.opsreply }}</th>
                </tr> 
                <tr>
                <th style="border:1px #808080 inset;padding:1px;">状态</th>
                <th style="border:1px #808080 inset;padding:1px;">{{ item.state }}</th>
                </tr>
                {% endfor %}
      </tbody>
             </table>
</html>
时间: 2024-08-04 01:56:54

运维工单--消息队列发送邮件的相关文章

django 运维工单系统

此工单系统从立项到完成,大概用了1个星期,可能部分思路和实现有所不妥,欢迎指正. 朋友公司想做一个运维工单系统,他没思路,正好我最近打算写一个运维工单系统,初步打算和我目前做的cmdb系统结合起来,于是简单写了个. 简单说下实现思路: 1.标准工单,(参考上家公司的工单系统,对工单做了分类,且每个分类下有对应的审批人和执行人) 2.新建工单(用户从上边的标准工单可以进入对应的工单申请,分为保存和提交两种状态,用户提交后将无法在修改,暂缺一个时间控件,任务类型默认为点击进入的类型,但允许用户进行修

运维工单--服务器申请共单

服务器申请公单,遇到三个困难点 第一个是前端页面的新建公单,服务器申请,不一定只申请一台,有可能是两台,三台,每台服务器的配置要求也有可能是不一样的,所以需要动态的添加服务器公单,如图,我实现的是点击按钮Add row 会增加一行新的服务器表格,点击Remove就删除一行服务器表格 前端html:                 <thead>                         <tr>                       <th>设备类型<

单消息队列客户-服务器间的双向通信

client.c #include <sys/socket.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h

自动化运维工之Ansible(1)

1.1 ansible简介 1.1.1 .Ansible软件介绍: Ansible提供一种最简单的方式用于发布.管理和编排计算机系统的工具,可在数分钟内搞定.Ansible由Python语言开发, 默认通过 SSH 协议管理机器.只要ssh连接正常被控制节点不需要安装任何工具,就可以实现远程连接执行任何操作支持多节点发布.远程任务执行.Ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等功能. Ansible的工作具有等幂性,Ansible在控制端只需要告诉监控端的期望

重磅|0元学 Python运维开发,别再错过了

51reboot 运维开发又双叒叕的搞活动了,鉴于之前 51reboot 的活动反馈,每次活动结束后(或者已经结束了很长时间)还有人在问活动的事情.这一次小编先声明一下真的不想在此次活动结束后再听到类似下面的话了 我之前不知道有活动 (这个锅小编我背了) 这个活动还有吗? 我想了解一下这个活动 跟我说可以给我按活动价算吗? .......... 针对以上类似的询问小编在此统一回复大家: 好了,接下来进入今天的重中之重 本次活动:Python 运维开发——18天训练营 本课程为:网络班+面授班(北

系统拆分解耦利器之消息队列---RabbitMQ-工作队列

[一曲广陵不如晨钟暮鼓] 本文,我们来介绍RabbitMQ中的工作队列.在正式开始之前,我们假设RabbitMQ服务已经启动,运行端口为5672,如果各位看官有更改过默认配置,那么就需要修改为对应端口,保持一致即可. 准备工作: 操作系统:window 7 x64 其他软件:eclipse mars,jdk7,maven 3 --------------------------------------------------------------------------------------

自动化运维工具介绍

运维目标有三个阶段,第一是追求稳定性,第二是追求标准化,第三是追求自动化.对于第三阶段来说,什么是运维自动化呢?简单地讲,运维自动化就是将日常重复性工作按照事先设定好的规则,在一定时间范围内自动化运行,而不需要人工参与.接下来简单介绍运维自动化工具,要了解运维平时用到的自动化工具,就需要了解运维人员的日常工作有哪些. 一.运维的日常工作 运维的日常工作可以总结为以下四个部分,分别是: (1) 系统安装 (2) 应用程序配置(Configuration) (3) 命令执行与控制(Command a

【IT运维监控】几大运维监控工具优缺点介绍

随着互联网的高速发展,大量的应用需要横跨不同的网络终端,并广泛接入第三方服务,IT系统架构越来越复杂,如果一个网站或 一个产品能够有一个良好的用户体检,那就必须要求IT运维管理者时刻保障核心业务稳定可用,而企业运维的痛点和难点也就在这,目前大部分的IT运维人员还 不能实现主动监控,仅仅是充当一个救火员的身份,当业务或其他人员在使用中发现了问题,运维人员才能来排查问题 解决问题.并不能像一些运维监控工具一样 做到防患于未然. 1.不同业务部门的人关心的方向不一样,面向业务的运维,不但关心IT资源的

【IT运维监控】讨论哪种运维监控工具才是IT运维人员的最爱?

选择运维工具的几大要素:一是看我哪些指标需要监控,二是看我监控到什么 三是看这种运维监控工具能监控到什么程度 有可能,这几个问题IT运维人员自己都没有弄的很明白,那么我们先看一下整个运维行业目前的现状: 目前来说,传统企业的IT运维大部分还是用户在使用过程中发现故障,然后通知运维人员,再邮运维人员确定是什么问题,采用哪种方式可以解决.大部分的运维人员目前还是充当的只是一个救火员的身份,没有起到真正的IT运维监控的作用.运维人员的大部分时间和经历都花在了处理简单而重复的问题上,导致同事及领导的不满