Django-linux主机计划任务查看服务

news2024/11/23 19:29:46

目录

需求

功能介绍

页面效果

代码编写

docker部署


需求

  线上主机一百台左右,经常会在某个服务器上放置一些自动化脚本,并配置计划任务,时间长可能忘记计划任务所在服务器,所以开发一个用于收集展示crontab任务的服务

语言框架

python3.9 / Django

模块:Django~=4.2.3、paramiko~=3.2.0

版本别差太多就行

功能介绍

  具有收集功能,并将收集到的信息写入到文件中,用于存储

  打开主页会获取文件中的任务信息,并渲染到页面

  首次打开主页并不会获取到任务信息,需要点击‘重新获取’按钮进行任务获取和存储

  当服务器增加或减少任务,可点击‘重新获取’来更新最新的任务

页面效果

代码编写

编译器 pycharm 创建django服务

服务目录结构:

crontab/urls.py

from django.contrib import admin
from django.urls import path
from host_cron import views as crontab


urlpatterns = [
    path('admin/', admin.site.urls),
    path('crontab_get/', crontab.crontab_get, name='crontab_get'),
    path('', crontab.crontab_select)
]

crontab/config.py

该文件用于保存主机列表、登陆用户名、登陆密钥、存储任务信息的文件路径

因这些配置可能会根据不同环境变化,所以该文件在用docker启动时采用外挂的方式

def Host_Add():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机ip列表
    '''
    hostname_list = ['172.100.0.2',
                     '172.100.0.3']
    return hostname_list

def Host_User():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机登陆用户名
    '''
    user = 'root'
    return user

def Host_Key_Path():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机登陆密钥路径
    '''
    key_path = '/data/id_rsa'
    return key_path

def File_Path():
    '''
    用于crontab views中 crontab_get调用
    :return: 用于存放收集到的计划任务,避免每次访问都重新获取主机计划任务
    '''
    file_path = "/data/filename.txt"
    return file_path

host_cron/utils/select_crontab.py

import paramiko
import logging


def get_remote_crontab_tasks(hostname_list, username, private_key_path):
    '''
    用于获取主机上的crontab计划任务
    :param hostname_list: 主机列表['1.1.1.1', '2.2.2.2']
    :param username: 主机用户
    :param private_key_path: 远程密钥
    :return: 返回dict,{'hostname1': [crontab], 'hostname2': [crontab]}
    '''
    try:
        # 创建SSH客户端对象
        client = paramiko.SSHClient()
        # 自动添加和保存远程服务器的SSH密钥
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 使用私钥文件进行身份验证
        private_key = paramiko.RSAKey.from_private_key_file(private_key_path)

        crontab_dict = {}
        for hostname in hostname_list:
            try:
                # 连接远程服务器
                client.connect(hostname, username=username, pkey=private_key, timeout=5)
                # 执行命令获取crontab任务
                stdin, stdout, stderr = client.exec_command('crontab -l')
                # 获取命令输出结果
                crontab_tasks = stdout.read().decode().splitlines()
                crontab_dict[hostname] = crontab_tasks
                # 关闭SSH连接
                client.close()
            except:
                crontab_dict[hostname] = ['err: 登陆失败']
        return crontab_dict

host_cron/views.py

from host_cron.utils.select_crotnab import get_remote_crontab_tasks
from crontab.config import Host_Add, Host_User, Host_Key_Path, File_Path
from django.shortcuts import render
import json
import os

def crontab_select(request):
    '''
    首页,用于直接从计划任务存储文件中读取计划任务,如果文件不存在则创建,并传入空字典,写入时需要转为json,读取时需要转为字典
    :param request: 读取文件
    :return: 计划任务字典到html
    '''
    file_path = File_Path()
    if os.path.exists(file_path):
        # 从文件中读取字符串内容
        with open(file_path, "r") as file:
            str_data = file.read()
        # 将字符串解析为字典类型
        crontab_tasks_dict = json.loads(str_data)

        return render(request, 'crontab.html', {'crontab_tasks_dict': crontab_tasks_dict})
    else:
        crontab_tasks_dict = {}
        # 打开写入文件
        file = open(File_Path(), "w")
        file.write(json.dumps(crontab_tasks_dict))
        file.close()

        return render(request, 'crontab.html', {'crontab_tasks_dict': crontab_tasks_dict})


def crontab_get(request):
    '''
    获取主机上的计划任务,并以json格式写入到文件中
    :param request:
    :return:
    '''
    # 远程服务器的连接参数
    hostname_list = Host_Add()  # 替换为实际的远程服务器主机名或IP地址
    username = Host_User()  # 替换为实际的远程服务器用户名
    private_key_path = Host_Key_Path()  # 替换为实际的私钥文件路径

    # 获取远程服务器上的crontab任务
    crontab_tasks_dict = get_remote_crontab_tasks(hostname_list, username, private_key_path)
    # 打开文件
    file = open(File_Path(), "w")
    # 写入内容
    file.write(json.dumps(crontab_tasks_dict))
    # 关闭文件
    file.close()

    return render(request, 'crontab.html',  {'crontab_tasks_dict': crontab_tasks_dict})

templates/crontab.html

html中使用js,点击按钮但不跳转链接,执行完成后自动请求刷新当前页面。

缺点:点击‘重新获取’按钮等待返回时没有获取中...的提示,懒了没搞。

<!DOCTYPE html>
<html>
<head>
    <title>Crontab Tasks</title>
    <style>
        table {
            width: 100%;
            border-collapse: collapse;
        }

        th, td {
            padding: 8px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }

        th {
            background-color: #f2f2f2;
        }

        ul {
            list-style-type: none;
            padding: 0;
            margin: 0;
        }

        ul li {
            margin-left: 20px;
        }

        .custom-button {
            background-color: blue;
            color: white;
            padding: 10px 20px;
            margin-top: 10px;
            margin-bottom: 10px;
            border: none;
            cursor: pointer;
        }
    </style>
    <script>
    function triggerURL() {
        fetch('/crontab_get/')
            .then(response => {
                if (response.ok) {
                    console.log('URL triggered successfully');
                    // 执行其他操作,根据需要进行处理
                    location.reload(); // 重新加载当前页面
                } else {
                    console.error('URL triggering failed');
                }
            })
            .catch(error => {
                console.error('Error:', error);
            });
    }
    </script>
</head>
<body>
    <button class="custom-button" onclick="triggerURL()">重新获取</button>
    <table>
        <thead>
            <tr>
                <th>IP Address</th>
                <th>Crontab Tasks</th>
            </tr>
        </thead>
        <tbody>
            {% for ip, tasks in crontab_tasks_dict.items %}
            <tr>
                <td>{{ ip }}</td>
                <td>
                    <ul>
                        {% for task in tasks %}
                        <li>{{ task }}</li>
                        {% endfor %}
                    </ul>
                </td>
            </tr>
            {% empty %}
            <tr>
                <td colspan="2">No data available</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

docker部署

将代码目录压缩成crontab.tar.gz

Dockerfile

FROM python:3.9.13

RUN mkdir /data
RUN pip3 install Django paramiko -i https://mirrors.aliyun.com/pypi/simple/
ADD crontab.tar.gz /data

CMD python3 /data/crontab/manage.py runserver 0.0.0.0:18888

将代码中的config.py提取出来,根据你的docker启动命令定义和修改

构建镜像

docker build -t crontab:v1 .

启动

docker run -d \
--name crontab \
--network=host \
-v /data/crontab_py/id_rsa:/data/id_rsa \
-v /data/crontab_py/config.py:/data/crontab/crontab/config.py \
crontab:v1

网络直接用host宿主机网络,使用容器网络ip因为是陌生ip,会触发云上服务器的异常登陆报警。

浏览器 ip:18888 访问即可

搞定!

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

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

相关文章

Coremail易念:2022年企业邮件钓鱼模拟演练分析报告

以下为精华版阅读&#xff0c;如需下载完整版&#xff0c;关注【CACTER邮件安全】&#xff0c;后台回复关键词【钓鱼报告】即可免费下载。 Coremail&易念科技《2022年企业邮件钓鱼模拟演练分析报告》重磅发布&#xff01;有哪些精华亮点&#xff0c;点击下拉。 一、制造业钓…

opencv-07-感兴趣区域(ROI)

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区 域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…

ECMAScript 6 之二

目录 2.6 Symbol 2.7 Map 和 Set 2.8 迭代器和生成器 2.9 Promise对象 2.10 Proxy对象 2.11 async的用法 2.22 类class 2.23 模块化实现 2.6 Symbol 原始数据类型&#xff0c;它表示是独一无二的值。它属于 JavaScript 语言的原生数据类型之一&#xff0c;其他数据类型…

本地前端项目使用gitee仓库外链图片加载失败

错误&#xff1a;本地的前端项目&#xff0c;比如vue&#xff0c;纯html使用<img/>标签加载gitee保存的图片文件的时候&#xff0c;浏览器加载失败。 但是gitee可以正常访问图片 解决办法&#xff1a; 在index.html中加入meta标签就可以完美解决 <meta name"r…

使用fastjson序列化后字段属性发生了变化

问题描述 使用 fastjson 进行 JSON 序列化存储到数据库后&#xff0c;发现 JSON 字符串“莫名其妙地”多了一些属性&#xff0c;也少了些属性。问题出现在基本类型的布尔类型以 is 开头的属性。 复现 1、定义对象 其中一个boolean类型的属性isActive以is开头&#xff0c;一个…

Linux内核模块开发 第 10 章 系统调用

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09;源 LKMPG 10 系统调用 到目前为止&#xff0c;我们所做的唯一一件事就是使用定义明确的内核机制来注册…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

HTML文件概述

HTML是标准的ASCII文件&#xff0c;其后缀是.html。其由两部分部分组成。包扩声明文档&#xff0c;和HTML内容部分。其中HTML内容部分又由头标签,身体标签&#xff0c;和脚标签三部分组成。 那么我们完整的网页由HTML&#xff0c;CSS,Javascirpy三部分组成。 我们说HTML标签就相…

接口自动化测试框架开发 (pytest+allure+aiohttp+ 用例自动生成)

目录 前言&#xff1a; 第一部分&#xff08;整个过程都要求是异步非阻塞的&#xff09; 读取 yaml 测试用例 http 请求测试接口 收集测试数据 第二部分 动态生成 pytest 认可的测试用例 后续&#xff08;yml 测试文件自动生成&#xff09; 前言&#xff1a; 开发一个…

“Layui用户认证:实现安全高效的登录和注册体验”

目录 1.什么是layui2.layui、easyui与bootstrap的对比3.layui入门4.构建登录页面5.构建注册页面6.总结 1.什么是layui layui&#xff08;谐音&#xff1a;类 UI) 是一套开源的 Web UI 解决方案&#xff0c;采用自身经典的模块化规范&#xff0c;并遵循原生 HTML/CSS/JS 的开发…

历史邮件数据究竟该走向何方.....

市场背景 随着企业的快速发展&#xff0c;邮件系统的数据量也随之增加。陈年累月的邮件数据更是记录着企业诸多重要的交易信息记录。电子邮件可以作为法律证据支持诉讼 邮件保存已经成为关系到诉讼成败的关键一环 数据归档来源 由美国参议员Sarbanes和美国众议员Oxley联合提出…

YOLOv7 yaml 文件简化

文章目录 修改方式common.pyyolo.pyYOLOv7-ELAN.yaml原始的 YOLOv7 yaml 文件的模块是拆开写的,比较乱, 改进起来也不太容易,这篇博文将 YOLOv7 yaml 文件换了一种写法, 参数量和计算量是完全和原来一致的,区别只是在于 yaml文件的写法不同, 封装后具体的结构可以参考…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 一)

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…

TJUACM假期集训个人赛(九)(cf1453a-d cf1440a-c)

今天最后一场个人赛 出题玩抽象的 密码是 l a s t d a n c e lastdance lastdance 然后题名连起来是个人赛的最后一舞 最抽象的我觉得还是一套题出三道大模拟&#xff0c;人写没了 寻思最后一场好好打拿个 r k 1 rk1 rk1&#xff0c;最后十分钟被超了&#xff0c;三周个人赛没…

【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)

【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路&#xff08;回归改分类&#xff09; 针对单输入多输出分类预测&#xff0c;可采用回归的方式进行预测。 本文采用BP神经网络进行演示。 一、导入数据 数据为1输入&#xff0c;5输出&#…

短视频矩阵系统源码--开发实践

短视频矩阵系统源码开发技术&#xff1a; 1. 数据采集&#xff1a;使用Python的requests库进行数据爬取&#xff0c;使用Selenium模拟浏览器操作&#xff0c;解决抖音反爬虫机制。 2. 数据处理&#xff1a;使用Python的正则表达式、BeautifulSoup等库进行数据处理。 3. 关键…

C#开发的OpenRA游戏之变卖按钮

前面已经分析右边创建窗口的功能,当玩家建造了很多物品,由于某种原因,需要把建造的物品进行变卖掉,需要回收一些金币,以便建造更多攻击的力量。 从上图可以看到在顶端有四个按钮,第一个金钱的符号,就是变卖物品的按钮;第二个是维修的按钮;第三个是放置信号标记,以便盟…

云计算的学习(五)

五、虚拟化特性介绍 1.集群特性 1.1HA HA&#xff08;Hith Available&#xff0c;高可用特性)&#xff0c;克服单台主机的局限性&#xff0c;当一台服务器损坏&#xff0c;运行在损坏服务器上的虚拟机会自动迁移到其他运行状态正常的服务器上&#xff0c;整个迁移过程用户无感…

举例说明什么是基于线性回归的单层神经网络

基于线性回归的单层神经网络是一种简单的神经网络&#xff0c;通常用于解决回归问题。这种神经网络只包含一个输入层和一个输出层&#xff0c;没有隐藏层。我们可以通过求解权重和偏置项来拟合输入和输出之间的线性关系。 例如&#xff0c;给定一个数据集&#xff0c;其中包含了…