Python入门自学进阶-Web框架——41、初步了解Celery 分布式队列、识堡垒机、自动发布、配置管理系统

news2024/11/25 11:25:23

Celery是一个基于Python开发的分布式异步消息任务队列,可以轻松的实现任务的异步处理

实例场景:

  1. 对100台机器执行一条批量命令,可能会花很长时间 ,但不想让你的程序等着结果返回,而是给你返回 一个任务ID,经过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,可以继续做其它的事情。 
  2. 想做一个定时任务,比如每天检测一下所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福

Celery基本工作流程图:

Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis。

Celery默认broker是RabbitMQ,仅需一行配置:

broker_url = ‘amqp://guest:guest@localhost:5672//’

也可以使用Redis做broker

安装Celery:pip install celery

由于官方不支持windows安装和使用,需要借助Python第三方模块eventlet,此模块主要作用通过协程实现并发

pip install eventlet

目录结构
celery对目录要求严格,如果不在目录下加入__init__.py,worker执行任务可能会出现NotRegistered的情况。

创建一个mycelery包:

包下创建tasks.py:

from celery import Celery

app = Celery('tasks',  # 可以使用 __name__
             broker='redis://:abc123@192.168.1.117:6379/1',
             backend='redis://:abc123@192.168.1.117:6379/2')

@app.task
def add(x,y):
    print("running ...",x,y)
    return x + y

backend是用于返回结果的,broker是接收用户发送的任务的。

redis作为broker的配置:redis://:password@hostname:port/db_number

Redis默认使用的数据库是0号数据库(database 0)。整个Redis实例最多可包含16个数据库,从[0]到[15]。每个Redis实例都有16个数据库,不管它们是否被使用。

启动Celery wirker来开始监听并执行任务

celery -A tasks worker --loglevel=info

这样就启动了一个worker,可以启动多个这个的worker。

调用:python3:

>>>from tasks import add
>>>r = add.delay(5,7)
>>>r.get()

worker相当于一个个服务器,负责执行task任务,如这里的add,即以@app.task装饰的函数,就是实现多个服务器来执行任务,满足性能要求。实现分布式。

堡垒机:

 在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审计定责。

实际工作中存在的各种问题(业务需求):

1、权限管理;权限分配混乱

2、用户行为审计;共用一套root账户。

堡垒机系统:齐治堡垒机。

架构及功能需求:

1、登录功能;2、账号管理;3、身份认证;4、资源授权;5、访问控制;6、操作审计

用户登录堡垒机,由堡垒机负责与各业务系统连接,并将连接返回给用户,堡垒机可以做各种权限限制管理和行为审计工作。

与各业务系统连接,一般不是使用图形界面,都是基于SSH的连接,Python实现的SSH2远程安全连接有一个模块,叫做Paramiko,支持认证及秘钥方式。可以实现远程命令执行、文件传输、之间SSH代理等功能,封装的层次更高,更贴近SSH协议的功能。

如下代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author heaven

import paramiko

#创建ssh对象
ssh = paramiko.SSHClient()
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#链接服务器
ssh.connect(hostname='192.168.138.131',port=2704,username='user',password='pwsword')

while True:
    try:
        yourinput = input("请输入你要执行的命令: ").strip();
        stdin,stdout,stderr = ssh.exec_command(yourinput);
        if len(yourinput) == 0:
            continue;
        result = stdout.read().decode();
        print(result);
    except KeyboardInterrupt as e:        #注意此处异常的写法,python2与python3中不一样,python3中必须用as
        print('你已经退出登录!  {}'.format(e));
        break
        
#关闭链接
ssh.close()

通过这个模块,就能自动登录,并捕获用户的操作,进行记录以实现行为审计。

堡垒机的作用就是提供连接,这个链接可以是用户无需知道用户以及密码,并记录用户操作的系统。

系统的好坏,关键在于这个链接提供的操作界面的用户体验,如果能实现原系统,如linux的bash的体验,就是一个成功的系统。jumpserver,一个基于paramiko的类似系统。

基于Django的堡垒机设计:

创建一个Django项目,设计表结构:

Host表:保存主机;HostGroup表 :主机组;UserProfile表 : 堡垒机账号;HostUser表:主机登录账户。

用户登录堡垒机,就使用Django的用户管理,即Web用户验证,登录成功后,找到此用户关联的可登陆主机、登录用户和密码,然后以此用户、密码远程登录主机,将登录连接返回给用户,使其可以使用主机。

堡垒机用户交互程序:使用原生的ssh。

Python中使用subprocess模块

login_cmd = sshpass -p password ssh username@hostname(ip) -o "StrictHostKeyChecking no"

调用原生的ssh,很可能需要进行交互,而我们的需求是中间不能有交互,所以使用sshpass软件来进行ssh登录,这样,用户、密码都可以在参数中带入,无需交互,ssh的 -o "StrictHostKeyChecking no" 参数,跳过rsa等认证交互。

上面的命令,可以进行填充了,即password、username、hostname都可以从数据库中取到填充上。

然后:ssh_instance = subprocess.run(login_cmd,shell=True)

登录堡垒机时,直接进入选择管理机器程序,不能运行其他程序,更不能结束这个进程进入堡垒机的shell,确保堡垒机的安全:

修改堡垒机登录用户的.bashrc,确保一登录就运行程序,退出程序就退出堡垒机登录。

.bashrc:

xxxxxx......
python3 /usr/local/baoleiji.py
logout

审计:

首先是获取操作内容,linux中的strace-ttt -f -p pid -o FILENAME,可以跟踪输入操作,即键盘的操作,对文件进行分析整理,可以得到用户的操作。

在堡垒机上,跟踪每个登录的用户启动的连接进程。问题是如何获取进程号。

修改了ssh源代码,增加了参数选项,可以使启动的ssh进程带上一个特别参数和一串字符,以此来标识每个ssh进程。

审计需要的日志文件字段:堡垒机用户,登录的主机,主机用户,登录时间,操作

以上操作均是在堡垒机上,登录堡垒机,就启动了python3 /usr/local/baoleiji.py,然后登录管理的主机,也是在堡垒机上启动ssh,堡垒机上对这个进程跟踪,获取操作,保存于日志中。

缺陷:对于上传文件,看不到上传文件的内容,是安全隐患。可以禁止文件的上传。

批量任务:批量命令执行、批量文件上传、批量文件下载;(这里的批量,是同时对多个远端主机执行相同的任务)

批量命令:

使用了paramiko.SSHClient()进行批量命令的执行

s = paramiko.SSHClient()
s.connect(ip_addr,port,username,password,timeout=5) # 使用密码登录执行
######
# key = paramiko.RSAKey.from_private_key_file(RSA_PRIVATE_KEY_FILE)
# s.connect(ip_addr,port,username,pkey=key,timeout=5)
#  使用key方式登录执行
stdin,stdout,stderr = s.exec_command(cmd)
result = stdout.read(),stderr.read()

自动发布项目管理实现:(持续集成,自动完成项目的测试编译打包部署等过程。jekins,bamboo等)

TaskPlan 任务计划
        Stage1 : 
                Job:1
                        1 、登录指定测试机器
                        2、从git下载最新代码
                Job2:
                        3、build编译
                        4、打包发布
                        5、运行,自动测试脚本
        Stage 2:
                Job1 :
                        。。。 
                Job2:
                        。。。

设计models:

Plan()、Stage()、Job()、SSHTask()——SSH类任务的单独表、SCPTask()——scp类任务表、

类似功能系统:saltstack,ansible、puppet 

CMDB:配置管理数据库系统 Configuration Management DataBase

对单位的 资产进行管理,管理的内容主要涉及

SN、hostname,ip,机房,机柜,配置,提供的服务等(软件资产)。

资产数据准确性、减少人工干预、资产自动汇报、硬件变更自动更新数据库。

自动化运维基石。

类似系统:nagios、zabbix、ganglia、open-falcon、cacti

ITIL —— Information Technology Infrastructure Library,信息技术基础架构库

事件管理、问题管理、配置管理、变更管理、发布管理。其中配置管理是核心

资产信息收集:

windows系统:

wmiobj = wmi.WMI()来获取windows系统的相关信息,如:

wmiobj.Win32_Processor() # 获取cpu信息

相应的还有其他获取如磁盘、内存、网卡等信息的方法,以Win32_开头的一系列方法。

获取到相关数据后,传递给管理服务器,保存到对应数据库中,作为资产进行管理。

需要注意的,如果是以前保存过的资产,需要在本地保存一个标识ID,传递的同时读取这个ID一同提交,新资产则需要从管理服务器获取ID,保存到本地,以此来区分是进行更新还是添加。

api接口认证:在服务器和客户端保存一个token值,传递过程中,使用用户名+时间戳+token+其他,然后进行MD5,传递这个MD5值进行认证。

RESTful api:Representational State Transfer,表现层状态转化

资源:Resources —— URI
表现层:Representation,相当于Content-Type
状态转化:State Transfer,GET、POST、PUT、DELETE

RESTful架构:
1、每一个URI代表一种资源;
2、客户端和服务器之间,传递这种资源的某种表现层;
3、客户端通过四个HTTP动词,对服务器资源进行操作,实现“表现层状态转化”

Django RESTful framwork

以上内容涉及linux,自己在虚拟机上捣鼓了很长时间,也没将环境搭建好。下一步主攻linux。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

adb操作及常用命令

问题:no devices/emulators found:adb devices 没有连接的设备 解决方案: 大概率是因为usb调试功能没有打开,可以查看手机设备是否开启usb调试功能 Android若未开启,可通过设置-关于手机,连续点击版本号7…

以矩阵的形式,对点或线段或多边形绕固定点旋转方法

一、仅旋转 ,其中x,y旋转前横纵坐标,x’,y’为旋转后横纵坐标。θ旋转角度,单位为弧度。 等价于:x’ xcosθysinθ,y’-xsinθycosθ 注:此矩阵仅为旋转矩阵,不包含平移和缩放。 二、旋转平…

【IDEA】解决使用Terminal窗口按ESC键无法退出Vi的问题

背景 我们经常在IDEA中使用Terminal终端操作命令行,一般来说没问题,但使用与vi有关的命令时,需要按ESC键退出编辑,但在IDEA中会跳到编辑窗口,造成这个问题的原因是与IDEA的快捷键有关。 打开Setting设置 在左上角搜…

Spring Boot2.7生成用于登录的图片验证码

先在 pom.xml 注入依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>然后 需要在配置文件中声明一下DefaultKaptcha 的 bean对象 然后 我们…

[NPUCTF2020]ReadlezPHP 反序列化简单反序列

题目还是挺简单的 看代码 访问一下 一看就是反序列化 看看执行主要是 echo $b($a) 那就是$b是命令 $a是参数 这里还要fuzz一下 因为system不能执行 所以我们可以使用其他命令执行 函数 例如 assert 我们看看如何构造 public $a;public $b;public function __construct(){…

Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

使用香橙派学习 Linux的守护进程

Q&#xff1a;什么是守护进程 A&#xff1a;Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个…

MacOS如何降级旧版本?macOS降级,从 Ventura 13.0至Monterey 12

MacOS系统卡怎么办❓降级安装详细教程来了&#x1f495;&#xff0c;超详细的MacOS系统降级教程 如何使用Time Machine Backup&#xff08;时间机器备份&#xff09;降级macOS 如果您有备份&#xff0c;则此方法适合您。否则&#xff0c;您可以尝试下面提到的其他方法。 1.将…

Mybatis深度解析:从起源到现代应用的全景视角

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

web自动化测试 —— cypress测试框架

一、cypress简介 基于 JavaScript 的前端测试工具可以对浏览器中运行的任何内容进行快速、简单、可靠的测试对每一步操作都支持回看覆盖了测试金字塔模型的所有测试类型【界面测试&#xff0c;集成测试&#xff0c;单元测试】底层协议不采用 WebDriver > Cypress官网&#…

Apache shenyu,Java 微服务网关的首选

微服务网关的产生背景 当我们系统复杂度越来越高&#xff0c;团队协作效率越来越低时&#xff0c;我们通常会想到通过"拆分"来应对&#xff0c;这是典型的"化繁为简&#xff0c;分而治之"的思想。在落地过程中&#xff0c;我们通常会引入"SOA"或…

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…

用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取

背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以&#xff0c;想通过php异步协程&#xff0c;发起爬取url请求控制python爬虫脚本&#xff0c;达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…

Cesium 生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

【FAQ】安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…

网络代理工具软件Proxyman mac中文版功能特点

Proxyman mac是一款网络代理工具软件&#xff0c;适用于Mac和iOS平台。它可以帮助开发人员、测试人员和网络管理员监控和调试网络流量。 Proxyman mac软件功能和特点 流量捕获和监控&#xff1a;Proxyman可以捕获并显示设备上的所有网络流量&#xff0c;包括HTTP、HTTps和WebSo…

Android之MediaCodec::PostAndAwaitResponse消息原理(四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

vscode自动添加文件和函数注释

自动添加注释 Doxygen Documentation Generator配置配置选项介绍配置文件头注释配置函数头注释 Doxygen Documentation Generator 此插件是vscode自动注释添加的插件&#xff0c;首先需要在vscode中查找并安装插件。如下图所示&#xff0c;插件在未安装的情况下会显示蓝色的In…

go-redis 框架基本使用

文章目录 redis使用场景下载框架和连接redis1. 安装go-redis2. 连接redis 字符串操作有序集合操作流水线事务1. 普通事务2. Watch redis使用场景 缓存系统&#xff0c;减轻主数据库&#xff08;MySQL&#xff09;的压力。计数场景&#xff0c;比如微博、抖音中的关注数和粉丝数…

【zotero】解决换新电脑后PDF打不开

关于zoteroPDF无法打开&#xff0c;并且提示&#xff1a;它可能已被移动或删除到 Zotero 之外&#xff0c;或者一台计算机上的链接附件基本目录可能设置不正确。 第一步&#xff1a;下载zutilo第二步&#xff1a;zutilo获取路径第三步 修改路径最后&#xff1a;新旧路径对比 第…