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.mzph.cn/bicheng/9781.shtml

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

相关文章

Ubuntu系统下编译OpenCV4.8源码

OpenCV4.8源码编译与安装 其实很简单,只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。 01下载OpenCV4.8源码包 在Ubunt…

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念,而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中,高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者,西门子Insight楼宇自动化…

KMeans,KNN,Mean-shift算法的学习

1.KMeans算法是什么? 在没有标准标签的情况下,以空间的k个节点为中心进行聚类,对最靠近他们的对象进行归类。 2.KMeans公式: 2. 1.关键分为三个部分: 1.一开始会定义n个中心点,然后计算各数据点与中心点…

jenkins使用gitLab(极狐)认证登陆

jenkins安装 GitLab Authentication插件 我因为java版本和最新GitLab Authentication 1.19版本不兼容,选择了本地安装 找个历史版本1.13版本,然后下载到电脑上 - 本地上传插件并安装 在极狐上创建一个应用 - 配置应用信息 应用名:jenkinsLo…

你以为是个黄金程序员,结果是个王者

玩过王者荣耀的同学都知道,从青铜到王者,过程中需要步步修炼,可以说等级的提升是胜利的积累,也可以说是技术的提升。 而程序员行业也是这样,技术越高段位越高,当然段位越高技术也越高,这个行业大…

Oracle -在线回缩表

conn scott/tiger DROP TABLE EMP1 PURGE; CREATE TABLE EMP1 AS SELECT * FROM EMP; alter table emp1 enable row movement; -- 启动回缩特性 insert into emp1 select * from emp1; / / commit; -- 增加到14000行 -- 分析表的结构 analyze table emp1 comput…

小程序如何确定会员身份并批量设置会员积分或余额

因为一些原因,商家需要从其它系统里面批量导入会员,确定会员身份,然后给他们设置对应的账户余额。下面,就具体介绍如何进行这种操作。 一、客户进入小程序并绑定手机号 进入小程序:客户打开小程序,系统会自…

交友软件源码-源码+搭建+售后,上线即可运营聊天交友源码 专业语聊交友app开发+源码搭建-快速上线

交友小程序源码是一种可以帮助开发者快速搭建交友类小程序的代码模板。它通常包括用户注册、登录、个人信息编辑、匹配推荐、好友聊天等常见功能,以及与后台数据交互的接口。使用这种源码可以极大地缩短开发时间,同时也可以根据自己的需求进行二次开发和…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网:访问 Node.js 官网,下载适合你操作系统的安装程序。运行安装程序:下载完成后,双击安装程序并按照提示进行安装。验证安装:安装完成后,在终…

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据:是数据库中存储的基本对象,是描述事物的符号记录 数据库(DataBase,DB):是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统(DataBas…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数拷贝构造函数浅拷贝深拷贝拷贝构造函数实现 析构函数赋值重载 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 迭代器begin & endrbegin & rend 总结 前言 模拟实现不是为了写得和库里面一样好。而是为…

OmniReader Pro mac激活版:智慧阅读新选择,开启高效学习之旅

在追求知识的道路上,一款优秀的阅读工具是不可或缺的。OmniReader Pro作为智慧阅读的新选择,以其独特的功能和卓越的性能,为您开启高效学习之旅。 OmniReader Pro具备高效的文本识别和处理技术,能够快速准确地提取文档中的关键信息…

《QT实用小工具·五十四》果冻弹出效果的动画按钮

1、概述 源码放在文章末尾 该项目实现动画按钮,鼠标放在按钮上可以弹性拉出的三个按钮,使用贝塞尔曲线实现,项目demo显示如下所示: 项目部分代码如下所示: #ifndef WATERCIRCLEBUTTON_H #define WATERCIRCLEBUTTON…

Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

最后一块石头重量Ⅱ 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

【go项目01_学习记录10】

操作数据库 1 插入数据2 显示文章2.1 修改 articlesShowHandler() 函数2.2 代码解析 3 编辑文章3.1 添加路由3.2 编辑articlesEditHandler()3.3 新建 edit 模板3.4 代码重构3.5 完善articlesUpdateHandler()3.6 测试更新3.7 封装表单验证 1 插入数据 . . . func articlesStore…

厚德提问大佬答4:AI绘画生成的心得

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

车载电子电器架构 —— 应用软件开发(中)

车载电子电器架构 —— 应用软件开发(中) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

算法设计课第五周(贪心法实现活动选择问题)

目录 一、【实验目的】 二、【实验内容】 三、实验源代码 一、【实验目的】 &#xff08;1&#xff09;熟悉贪心法的设计思想 &#xff08;2&#xff09;理解贪心法的最优解与正确性证明之间的关系 &#xff08;3&#xff09;比较活动选择的各种“贪心”策略&#xff0c;…