Python管理PVE(Proxmox VE)云平台--节点资源统计

一、前言

  写本脚本的初衷是因手动查看统计已分配的PVE资源过于耗时,因此写一个脚本一劳永逸,具体实现方法:利用Python的paramiko模块进行远程命令查看、统计PVE平台各节点已分配的cpu、内存、磁盘空间。

二、步骤

1.构建shell脚本

1.1 统计对象取值(cpu、mem、disk)

获取虚拟机ID

qm list | awk -F" " '{print $1}'|grep -v VMID > VMID

获取cpu核数

# 总核 = 插槽数量 * 核心数量
qm config VMID | grep cores | awk -F" " '{print $2}'

获取mem数据

qm config VMID | grep memory | awk -F" " '{print $2}'

获取disk数据

# 存在多块磁盘现象
qm config VMID | grep -e ^scsi* | grep -v scsihw | awk -F'[,=G]'  '{print $3 }'
1.2 sum_cpu.sh
#bin/bash
#计算单节点已分配cpu核数
qm list | awk -F" " '{print $1}'|grep -v VMID > VMIDi=0
vmids=`cat VMID` 
for vmid in $vmidsdoc_number=`qm config $vmid | grep cores | awk -F" " '{print $2}'`socket=`qm config $vmid | grep sockets | awk -F" " '{print $2}'`sum=`echo "$c_number * $socket"| bc`i=`echo "$i + $sum" | bc`
done
echo "$(hostname)节点Cpu已分配:$i 核"
1.3 sum_mem.sh
#bin/bash
#计算单节点已分配mem
qm list | awk -F" " '{print $1}'|grep -v VMID > VMIDi=0
vmids=`cat VMID` 
for vmid in $vmidsdom_number=`qm config $vmid | grep memory | awk -F" " '{print $2}'`sum=`echo "$m_number / 1024 "| bc`i=`echo "$i + $sum" | bc`
done
echo "$(hostname)节点内存已分配:$i G"
rm -rf VMID
1.4 sum_disk.sh
#bin/bash
#计算单节点已分配disk
qm list | awk -F" " '{print $1}'|grep -v VMID > VMIDi=0vmids=`cat VMID` 
for vmid in $vmidsdob=0qm config $vmid | grep -e ^scsi* | grep -v scsihw | awk -F'[,=G]'  '{print $3 }' > DISKqm config $vmid | grep -e ^ide* | grep -v ide2 | awk -F'[,=G]'  '{print $3 }' >> DISKdisks=`cat DISK`for disk in $disksdob=`echo "$b + $disk" | bc`donei=`echo "$i + $b" | bc`
done
echo "$(hostname)节点磁盘已分配:$i G"

2.构建python脚本

2.1 Cpu_Query.py
# -*- coding: utf-8 -*-
import paramiko# 连接信息:
# host = '192.168.100.103'
port = 22  # 默认的SSH端口
userName = 'root'
password = '******'def SafeCheck():for i in range(105, 109):try:# 创建SSHClient 实例对象ssh = paramiko.SSHClient()# 调用方法,表示没有存储远程机器的公钥,允许访问ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程机器ssh.connect(hostname=f"192.168.100.{i}", port=port, username=userName, password=password)# 组合bash命令为一个字符串bash_cmd = """qm list | awk -F" " '{print $1}' | grep -v VMID > VMID &&i=0 &&vmids=$(cat VMID) &&for vmid in $vmids; doc_number=$(qm config $vmid | grep cores | awk -F" " '{print $2}') &&socket=$(qm config $vmid | grep sockets | awk -F" " '{print $2}') &&sum=$(echo "$c_number * $socket" | bc) &&i=$(echo "$i + $sum" | bc);done &&echo "$(hostname)节点Cpu已分配:$i 核""""# 执行bash命令stdin, stdout, stderr = ssh.exec_command(bash_cmd)# 读取并打印结果result = stdout.read().decode('utf-8')err_result = stderr.read().decode('utf-8')print("执行结果:", result, "执行ip:", i)# 关闭SSH连接ssh.close()except paramiko.SSHException as sshException:print("SSH异常:", sshException)except TimeoutError:print("执行结果: b'Failed\\n'", "超时端口:", i)except KeyboardInterrupt:print("Ctrl + c 中断运行!")breakif __name__ == '__main__':SafeCheck()

执行结果:
在这里插入图片描述

2.2 Disk_Query.py
# -*- coding: utf-8 -*-
import paramiko# 连接信息:
# host = '192.168.100.103'
port = 22  # 默认的SSH端口
userName = 'root'
password = 'adfmaoijo1869#!@%'def SafeCheck():for i in range(105, 109):try:# 创建SSHClient 实例对象ssh = paramiko.SSHClient()# 调用方法,表示没有存储远程机器的公钥,允许访问ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程机器ssh.connect(hostname=f"192.168.100.{i}", port=port, username=userName, password=password)# 组合bash命令为一个字符串bash_cmd = """qm list | awk -F" " '{print $1}'|grep -v VMID > VMIDi=0vmids=`cat VMID` for vmid in $vmidsdob=0qm config $vmid | grep -e ^scsi* | grep -v scsihw | awk -F'[,=G]'  '{print $3 }' > DISKqm config $vmid | grep -e ^ide* | grep -v ide2 | awk -F'[,=G]'  '{print $3 }' >> DISKdisks=`cat DISK`for disk in $disksdob=`echo "$b + $disk" | bc`donei=`echo "$i + $b" | bc`doneecho "$(hostname)节点磁盘已分配:$i G""""# 执行bash命令stdin, stdout, stderr = ssh.exec_command(bash_cmd)# 读取并打印结果result = stdout.read().decode('utf-8')err_result = stderr.read().decode('utf-8')print("执行结果:", result, "执行ip:", i)# 关闭SSH连接ssh.close()except paramiko.SSHException as sshException:print("SSH异常:", sshException)except TimeoutError:print("执行结果: b'Failed\\n'", "超时端口:", i)except KeyboardInterrupt:print("Ctrl + c 中断运行!")breakif __name__ == '__main__':SafeCheck()

执行结果:
在这里插入图片描述

2.3 Mem_Query.py
# -*- coding: utf-8 -*-
import paramiko# 连接信息:
# host = '192.168.100.103'
port = 22  # 默认的SSH端口
userName = 'root'
password = 'adfmaoijo1869#!@%'def SafeCheck():for i in range(105, 109):try:# 创建SSHClient 实例对象ssh = paramiko.SSHClient()# 调用方法,表示没有存储远程机器的公钥,允许访问ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程机器ssh.connect(hostname=f"192.168.100.{i}", port=port, username=userName, password=password)# 组合bash命令为一个字符串bash_cmd = """qm list | awk -F" " '{print $1}'|grep -v VMID > VMID &&i=0 &&vmids=`cat VMID` &&for vmid in $vmidsdom_number=`qm config $vmid | grep memory | awk -F" " '{print $2}'`sum=`echo "$m_number / 1024 "| bc`i=`echo "$i + $sum" | bc`doneecho "$(hostname)节点内存已分配:$i G"rm -rf VMID"""# 执行bash命令stdin, stdout, stderr = ssh.exec_command(bash_cmd)# 读取并打印结果result = stdout.read().decode('utf-8')err_result = stderr.read().decode('utf-8')print("执行结果:", result, "执行ip:", i)# 关闭SSH连接ssh.close()except paramiko.SSHException as sshException:print("SSH异常:", sshException)except TimeoutError:print("执行结果: b'Failed\\n'", "超时端口:", i)except KeyboardInterrupt:print("Ctrl + c 中断运行!")breakif __name__ == '__main__':SafeCheck()

执行结果:

在这里插入图片描述

三、结束语

  到此Python统计PVE(Proxmox VE)云平台节点资源讲解就完毕啦,如果有其它问题欢迎大家评论留言,如果觉得还可以,那么给作者点赞、收藏、关注吧!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LangChain学习之旅】—(21)聊天客服机器人的开发(上)

【LangChain学习之旅】—(21)聊天客服机器人的开发(上) “聊天机器人”说明项目的技术实现细节技术实现步骤简述第二步:增加记忆机制第三步:增加检索机制总结“聊天机器人”说明 聊天机器人(Chatbot)是 LLM 和 LangChain 的核心用例之一,很多人学习大语言模型,学习 …

Redis:分布式系统

文章目录 认识RedisRedis和MySQLRedis的场景Redis的设计 分布式单机架构应用数据分离架构应用服务集群架构 认识Redis 在开始Redis学习前,要先认识一下Redis Redis的设计,是想要把它当做是一个数据库,一个缓存,或者说是一个消息…

Selenium + Pytest自动化测试框架实战(下)

前言 本文接上篇文章哟。 一、简单学习元素定位 在日常的工作中,我见过很多在浏览器中直接在浏览器中右键Copy Xpath复制元素的同学。这样获得的元素表达式放在 webdriver 中去运行往往是不够稳定的,像前端的一些微小改动,都会引起元素无法…

采油厂职工向媒体投稿的好方法找到了

作为一名采油厂的职工,我深知在媒体上定期投稿的重要性。这不仅是我们展示工作成果、传播企业文化的重要途径,更是上级考核我们工作表现的一项指标。然而,在投稿的过程中,我经历了不少心酸与困扰。 起初,我采用传统的邮箱投稿方式。每天,我都会花费大量时间在网络上搜索合适的媒…

浏览器执行渲染原理

一、事件循环 事件循环(Event Loop)是JavaScript的执行环境的核心概念之一,它负责处理JavaScript中的异步操作和执行顺序。事件循环使得JavaScript能够在单线程上有效地处理并发,同时保持编程模型的简单性。 以下是事件循环的一…

直播预告 | 明晚19:00,「低代码开放麦」6家低代码领军者线上论道

⏰5月14日晚19:00-20:30【低代码开放麦】邀请到 华为云Astro低代码产品经理高妍 得帆信息aPaaS业务线副总裁&PMO总监 李健达 上海博科Yigo平台研发部总经理、副总裁周志军 零赛云生态发展总监徐健林 普元信息事业部副总经理郝振明 致远互联高级咨询总监纪闪 线上论道…

netstat命令详解

netstat网络连接分析工具 工具说明: netstat 是一款命令行工具,主要是用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。除…

【linux-IMX6ULL-uboot初次编译及烧录

目录 1. uboot基本概念1. 1 uboot的编译 3. uboot的烧录2. uboot的烧录结果 第一次不进行原理性的探究,也不关注源码内容,只是进行一个直观的了解,对uboot进行初次编译并进烧录到IMX6ULL板卡中 1. uboot基本概念 U-Boot(Universa…

RobbitMQ基本消息队列的消息接收

1.先给工程引入依赖 父工程有了子工程就不用导了 <!--AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml…

2024电商数据资料汇总

2024年跨境电商&#xff1a;连接全球市场的新纪元 随着全球数字化进程的不断推进&#xff0c;跨境电商已经成为了国际贸易的重要组成部分。2024年&#xff0c;跨境电商行业迎来了一系列挑战和机遇&#xff0c;塑造了全新的市场格局。 跨境电商市场规模的持续扩大 2024年&…

ARP中间人

文章目录 ARP中间人ARP协议介绍使用kali进行ARP毒化使用kali进行ARP中间人使用kali进行ARP钓鱼ARP攻击防御ARP总结 ARP中间人 ARP协议介绍 维基百科ARP介绍 ARP&#xff08;地址解析协议&#xff09;在网络通信中扮演着至关重要的角色&#xff0c;它通过将网络层地址&#x…

基于单片机的自动售货机系统

基于单片机的售货机系统 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.货物种类一共设有8种&#xff0c;这8种商品通过选择按键进行选择确认&#xff1b; 2.通过数量选择按键确定购买数量&#xff0c;价格规定为1-8…