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 > VMID

i=0
vmids=`cat VMID` 
for vmid in $vmids
  do
    c_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 > VMID

i=0
vmids=`cat VMID` 
for vmid in $vmids
  do
    m_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 > VMID

i=0

vmids=`cat VMID` 
for vmid in $vmids
  do
    b=0
    qm config $vmid | grep -e ^scsi* | grep -v scsihw | awk -F'[,=G]'  '{print $3 }' > DISK
	qm config $vmid | grep -e ^ide* | grep -v ide2 | awk -F'[,=G]'  '{print $3 }' >> DISK
	disks=`cat DISK`
	for disk in $disks
	  do
	    b=`echo "$b + $disk" | bc`
	done
    i=`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; do
                c_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 中断运行!")
            break


if __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 > VMID
            i=0
            vmids=`cat VMID` 
            for vmid in $vmids
              do
                b=0
                qm config $vmid | grep -e ^scsi* | grep -v scsihw | awk -F'[,=G]'  '{print $3 }' > DISK
                qm config $vmid | grep -e ^ide* | grep -v ide2 | awk -F'[,=G]'  '{print $3 }' >> DISK
                disks=`cat DISK`
                for disk in $disks
                  do
                    b=`echo "$b + $disk" | bc`
                done
                i=`echo "$i + $b" | bc`
            done
            echo "$(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 中断运行!")
            break


if __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 $vmids
              do
                m_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
            """
            # 执行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 中断运行!")
            break


if __name__ == '__main__':
    SafeCheck()

执行结果:

在这里插入图片描述

三、结束语

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cs阿坤dn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值