一:本文目的

通过django展示服务器状态,比如cup和内存;就是说,尽可能减少运维或开发人员登录服务器,以免误操作引起故障。


二:结果展示

运维自动化【通过django展示服务器状态--cup和内存】_html

 

运维自动化【通过django展示服务器状态--cup和内存】_html_02

三:过程概述

1.用户点击web标签页,跳转到django定义好的url关联views视图。

2.通过views视图执行项目里的python脚本,并返回执行结果到前端。

3.前端通过jinjia语法展示脚本返回的内容。


四:过程细节

url:

#执行项目里的脚本,并把结果展示在页面上.
path('saemonitor/execute_script_for_ssh_server_do_top', saemonitor_views.execute_script_for_ssh_server_do_top),


views视图:

def execute_script_for_ssh_server_do_top(request):
    import subprocess
    result = subprocess.run(['python', 'saemonitor/templates/saemonitor/sshServerDoCommand_top.py'],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    try:
        # 如果脚本成功执行,返回输出
        if result.returncode == 0:
            output = result.stdout
            print(output)
            message = f"执行脚本:{result.args}"
            #return HttpResponse(output)  # 这里output的内容是执行脚本输出的内容(比如脚本里echo的内容),此时通过HttpResponse返回给前端页面,这种方式前端页面收到的结果格式很乱,不用了。
            return render(request, 'saemonitor/jieshou_mingling2.html', locals()) # 返回前端页面,locals()表示将当前作用域中的所有变量都传给前端页面。

        # 如果脚本执行出错,返回错误信息
        else:
            # 脚本执行失败,处理错误信息
            error = result.stderr
            return HttpResponse('Error: ' + error)
    except Exception as e:
        # 如果有异常,返回异常信息
        return HttpResponse(str(e))

python脚本(templates目录下):

#coding:utf-8
import paramiko  # 用于执行远程命令的库 , 安装命令:pip3 install paramiko  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
#使用paramiko的ssh协议远程到服务器执行命令,输出的结果和服务器上执行命令得到的结果,格式是一样的。


def execute_command_remote(hostname, username, password, command):
    # 创建SSH客户端对象
    client = paramiko.SSHClient()

    # 允许连接到未知的服务器(不推荐在生产环境中使用)
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        # 连接到服务器
        client.connect(hostname=hostname,port=port, username=username, password=password, timeout=10)

        # 执行命令
        stdin, stdout, stderr = client.exec_command(command)

        # 获取命令输出和错误(如果有)
        output = stdout.read().decode('utf-8')
        errors = stderr.read().decode('utf-8')

        if errors:
            print(f"Errors: {errors}")
        else:
            print(f"Output: {output}")

    except Exception as e:
        print(f"An error occurred: {e}")

    finally:
        # 关闭连接
        client.close()


# 使用示例
hostname = '192.168.1.1'  # 测试服务器IP地址或主机名
username = 'root'  # SSH用户名
password = '7W52Zal'  # SSH密码(建议使用密钥对进行更安全的认证)
port = 22  # SSH端口,默认是22
# 要执行的命令,例如'ls -l'列出目录详情
# 服务器上直接执行的命令: top -n 1 |grep "load average" &&  echo "----top15--cpu-----" &&  ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head -15 && echo "----top15-mem-----"   &&  ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head -15
command = 'echo >  /tmp/1.txt   &&  echo "----top15--cpu-----" >> /tmp/1.txt &&  ps aux|head -1 >> /tmp/1.txt && ps aux|grep -v PID|sort -rn -k +3|head -15 >> /tmp/1.txt && echo "----top15-mem-----" >> /tmp/1.txt  &&  ps aux|head -1 >> /tmp/1.txt && ps aux|grep -v PID|sort -rn -k +4|head -15 >> /tmp/1.txt &&  cat /tmp/1.txt '


execute_command_remote(hostname, username, password, command)


模板返回的html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>django project</title>
</head>
<body>
    <h4>{{ message }}</h4> <!-- 这里是Jinja2语法,用于显示Python传递过来的值 -->

<!--    # 打印出后端传来的Ouput和Errors。-->
    {% if errors %}
        <p><strong>Errors:</strong></p>
        <pre>{{ errors }}</pre>
    {% else %}
        <p><strong>执行结果:</strong></p>
        <pre>{{ output }}</pre>
    {% endif %}


</body>
</html>


汇报完毕,欢迎大家提问或指导,谢谢。 cupli  20240717