Python脚本:pve平台自动获取名字、类型、节点、备注、状态。

此脚本可自动获取pve平台的信息。有兴趣或者有需要大家可以看看。

#@anthor:bbxwg
#@explain:pve平台自动获取名字、类型、节点、备注、状态。
#@Date:2024-3-29import os
import subprocess
import json
import re
from datetime import datetime#lkh:@获取虚拟机IP地址函数
def Get_Ip_Virtual(nodes_list, qemu_ids_list, output_filename):with open(output_filename, 'a') as output_file:for qemu_id in qemu_ids_list:command = f"pvesh get /nodes/{nodes_list}/qemu/{qemu_id}/agent/network-get-interfaces  --output-format json"filtered_data_virtual = []    try:result = subprocess.check_output(command, shell=True, universal_newlines=True)parsed_result = json.loads(result) # 时间调试函数# current_time = datetime.now()# formatted_time = current_time.strftime('%Y-%m-%d %H:%M:%S')# result_message = f"Time = {formatted_time}, nodes = {nodes_list}, qemu_id = {qemu_id}"# output_file.write(result_message)# output_file.write("\n")for interface in parsed_result["result"]:if "ip-addresses" in interface:for ip_info in interface["ip-addresses"]:if ip_info["ip-address-type"] == "ipv4":filtered_data_virtual.append({"ip_address": ip_info["ip-address"],"qemu_id": qemu_id})elif "ip-address" in interface:if interface["ip-address-type"] == "ipv4":filtered_data_virtual.append({"ip_address": interface["ip-address"],"qemu_id": qemu_id})json_false = json.dumps(filtered_data_virtual, indent=4)desired_data = json.loads(json_false)output_file.write(json.dumps([desired_data[1]],indent=4))output_file.write("\n")except subprocess.CalledProcessError as e:# 时间调试函数# current_time = datetime.now()# formatted_time = current_time.strftime('%Y-%m-%d %H:%M:%S')# result_message = f"Time = {formatted_time}, nodes = {nodes_list}, qemu_id = {qemu_id}"# output_file.write(result_message)# output_file.write("\n")filtered_data_virtual.append({"ip_address": "0.0.0.0","qemu_id": qemu_id})output_file.write(json.dumps(filtered_data_virtual, indent=4))output_file.write("\n")# 调试语句# print(f"命令执行失败,错误信息:{e}")# error_message = f"Command execution failed for node={nodes_list}, qemu_id={qemu_id}. Error message: {e}"# output_file.write(error_message) # output_file.write("\n")
#lkh:@获取节点IP地址函数
def Get_Ip_Nodes(nodes_list, output_filename):with open(output_filename, 'a') as output_file:for node in nodes_list:command = f"pvesh get /nodes/{node}/hosts --output-format json"try:result = subprocess.check_output(command, shell=True, universal_newlines=True)parsed_result = json.loads(result)print(parsed_result)ipv4_pattern = re.compile(r'^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')data_lines = parsed_result["data"].split("\n") desired_data_objects = []for line in data_lines:parts = line.split()if len(parts) >= 2 and ipv4_pattern.match(parts[0]):hostname = parts[1].split('.')[0] desired_data_objects.append({"ip": parts[0], "hostname": hostname})json_false = json.dumps(desired_data_objects, indent=4)desired_data = json.loads(json_false)output_file.write(json.dumps([desired_data[1]], indent=4))output_file.write("\n") except subprocess.CalledProcessError as e:# 调试语句print(f"命令执行失败,错误信息:{e}")# output_file.write(e) # output_file.write('\n')# lkh:@合并字符串函数   
def combin_json_data(Masterfile, slave_data):with open(Masterfile, 'r') as masterfile:master_data = masterfile.read()master_value = json.loads(master_data)for i, node in enumerate(master_value):if node["type"] == "node" or node["type"] == "qemu":data_json = next((info for info in slave_data if info["id"] == node["id"]), None)if data_json is not None:master_value[i]["remark"] = data_json["remark"]with open("/Python_GetInfo/Data.json",'w') as output:# 时间调试函数current_time = datetime.now()formatted_time = current_time.strftime('%Y-%m-%d %H:%M:%S')result_message = f"Time = {formatted_time}"output.write(result_message)output.write("\n")output.write(json.dumps(master_value, indent=4))# lkh:@获取虚拟机和节点的运行状态、类型函数
def Node_and_virtual_status_type(output_filename):command = "pvesh get /cluster/resources --output-format json"try:result_bytes = subprocess.check_output(command, shell=True, text=True)resources_list = json.loads(result_bytes)if isinstance(resources_list, list):filtered_data = [{"id": r.get("id"), "type": r.get("type"), "status": r.get("status"), "node": r.get("node")}for r in resources_list if all(k in r for k in ("id", "type", "status", "node")) and r.get("type") != "storage" and r.get("type") != "sdn"]else:  filtered_data = {"id": resources_list.get("id"), "type": resources_list.get("type"), "status": resources_list.get("status"), "node": resources_list.get("node")}if all(k in filtered_data for k in ("id", "type", "status", "node")):filtered_data = [filtered_data]with open(output_filename, 'w') as output_file:if isinstance(filtered_data, list) and filtered_data:output_file.write(json.dumps(filtered_data, indent=4))except subprocess.CalledProcessError as e:print(f"命令执行失败,错误信息:{e}")         #lkh:@获取节点备注信息函数
def get_and_concatenate_files(dir_list, target_filename, output_filename):with open(output_filename, 'a') as output_file:for src_dir in dir_list:filepath = os.path.join(src_dir, target_filename)node_identifier = src_dir.split('/')[-1]new_filename = f"node/{node_identifier}"command = f"cat {filepath}"result_bytes = subprocess.check_output(command, shell=True, text=True)dic_list = {"id":new_filename, "remark": result_bytes.strip()}output_file.write(json.dumps(dic_list))output_file.write('\n')#lkh:@获取虚拟机备注信息函数
def get_and_concatenate_files_virtual(dir_list, output_filename):if os.path.exists(output_filename):os.remove(output_filename)for src_dir in dir_list:for filename in os.listdir(src_dir):if filename.endswith('.conf'):with open(os.path.join(src_dir, filename), 'r') as src_file:with open(output_filename, 'a') as output:content = src_file.read()lines = content.split('\n')new_filename = "qemu/" + filename[:-5]if lines:first_line = lines[0].strip()if first_line.startswith('#'): json_data = {"id":new_filename, "remark": first_line.lstrip('#').strip()}output.write(json.dumps(json_data, ensure_ascii=False))output.write('\n')else:error_message = f"virtual: {filename} no remarks"json_data_error = {"id":new_filename, "remark": error_message}output.write(json.dumps(json_data_error, ensure_ascii=False))output.write('\n')#lkh:@将备注格式转换字典型
def get_json_remarks(input_file):with open(input_file, 'r') as file:data = file.readlines()# 将每一行的JSON对象转换为Python字典,并添加到列表中json_objects = [json.loads(line) for line in data]# 将列表转换为JSON数组formatted_json = json.dumps(json_objects, ensure_ascii=False)# 写入新文件,注意此处为了显示效果追加了换行和逗号,实际JSON数组不应包含换行和最后一个逗号formatted_json_with_formatting = "[\n{}\n]".format(",\n".join(map(json.dumps, json_objects)))return formatted_json_with_formatting# 获取/etc/pve/nodes/目录下的所有条目(包括文件和目录)
entries_IP = os.listdir('/etc/pve/nodes/')# 筛选出只有目录的列表
directories_only_IP = [d for d in entries_IP if os.path.isdir(os.path.join('/etc/pve/nodes/', d))]# 虚拟机IP信息   
all_file_names = []
directories_IP = '/etc/pve/nodes/'
tail_IP = '/qemu-server/'
output_file_ip = '/Python_GetInfo/Ip.json'output_file_node_and_virtual = '/Python_GetInfo/Node_and_virtual_status_type.json'# 节点信息和文件和输出文件
directories = '/etc/pve/nodes/'
target_file_node = 'config'
output_file_remark = '/Python_GetInfo/Remarks.txt'# 虚拟机信息和文件和输出文件
Virture_directories = '/etc/pve/nodes/'
tail = '/qemu-server'# 获取/etc/pve/nodes/目录下的所有条目(包括文件和目录)
entries = os.listdir('/etc/pve/nodes/')# 筛选出只有目录的列表
directories_only = [d for d in entries if os.path.isdir(os.path.join('/etc/pve/nodes/', d))]node_list = [directories + item for item in directories_only]
virtual_list = [Virture_directories + item + tail for item in directories_only]Node_and_virtual_status_type(output_file_node_and_virtual)#lkh:@获取备注函数get_and_concatenate_files_virtual(virtual_list, output_file_remark)
get_and_concatenate_files(node_list, target_file_node, output_file_remark)formatted_json_with_formatting = get_json_remarks(output_file_remark)
formatted_json_list = json.loads(formatted_json_with_formatting.replace('\n', ''))#lkh:@合并data函数
combin_json_data(output_file_node_and_virtual, formatted_json_list)#lkh:@获取Ip函数
#Get_Ip_Nodes(directories_only_IP,output_file_ip)
for file_path in directories_only_IP:node_list = directories_IP + file_path + tail_IPif os.path.isdir(node_list):file_path_ip = [os.path.splitext(f)[0] for f in os.listdir(node_list) if os.path.isfile(os.path.join(node_list, f)) and f.endswith('.conf')] #首先判断join node_list和f的路径是否是一个文件并且是否以.conf结尾,如果是那么就去掉文件的结尾并且存到列表里      all_file_names.extend(file_path_ip)print(all_file_names)#Get_Ip_Virtual(file_path, all_file_names, output_file_ip)all_file_names.clear()

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

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

相关文章

SiteSucker Pro mac 5.3.2激活版 网站扒站神器

SiteSucker是一个Macintosh应用程序,可以从互联网自动下载网站。它通过将站点的网页、图像、PDF、样式表和其他文件异步复制到本地硬盘驱动器,复制站点的目录结构来实现此目的。只需输入一个URL(统一资源定位器),按回车…

JavaScript 入门指南(三)BOM 对象和 DOM 对象

BOM 对象 BOM 简介 BOM(browser Object Model)即浏览器对象模型BOM 由一系列对象组成,是访问、控制、修改浏览器的属性的方法BOM 没有统一的标准(每种客户端都可以自定标准)。BOM 的顶层是 window 对象 window 对象 …

习题2-5 求平方根序列前N项和

本题要求编写程序,计算平方根序列 的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不…

1.10 类、方法、封装、继承、多态、装饰器

一、介绍类 类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例 实例化:创建一个类的实例,类的具体对象。 对象:通过类定义的数据结构实例。对象包括两个数据成员&#x…

做题目

4.1 1.目标:读懂文件中SVM算法,识别文件中的测试数据是RFID信号或者是LORA信号。 使用训练数据训练模型,并使用testdata测试,对实验结果进行分析并截图形成报告提交。 2.做法: ①读懂两篇博客 ②训练模型弄出来&a…

物联网实战--入门篇之(六)嵌入式-WIFI驱动(ESP8266)

目录 一、WIFI简介 二、基础网络知识 三、思路讲解 四、代码分析 4.1 状态机制 4.2 客户端连接 4.3 应用数据接收处理 4.4 数据发送 4.5 主函数调用 4.6 网络连接ID分配 五、总结 一、WIFI简介 WIFI在我们生活中太常见了,手机电脑都可以用WiFi连接路由器进行上…

2024品牌私域运营:「去中心化」正在成为企业决胜关键

越来越多的品牌选择以DTC模式与消费者互动和销售。通过与消费者建立紧密联系,不仅可提供更具成本效益的规模扩张方式,还能控制品牌体验、获取宝贵的第一方数据并提升盈利能力。许多企业采取的DTC私域策略以交易为中心的方法往往导致了成本上升和运营复杂…

TCP/IP:互联网通信的核心协议

引言 在当今数字化时代,互联网已经成为人类社会不可或缺的一部分,而TCP/IP协议则是支撑互联网运作的关键。无论是发送电子邮件、浏览网页,还是进行视频通话,TCP/IP协议都在背后默默地发挥着作用。本文将引领读者深入了解TCP/IP协…

Ubuntu 16.04/18.04 LTS内核降级及通过GURB指定内核

列出当前安装的所有LINUX内核 dpkg -l|grep linux-image 安装4.4.0-47内核 sudo apt-get install linux-image-4.4.0-47-generic linux-image-extra-4.4.0-47-generic 删除4.4.0-97内核 sudo apt-get purge linux-image-generic linux-image-4.4.0-97-generic linux-image-ex…

DevOps迈向标准化,平台工程让开发运维更轻松

在近一代人的时间里,DevOps 在软件开发和运维领域占据了主导地位。这是一套开发人员都离不开的技能和方法。Pearl Zhu 在 “The Digital Master” 一书中描述了它的重要性,强调 “敏捷和 DevOps 是为了利用整合、互动和创新”。在当今竞争激烈的市场中&a…

【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

区块链浏览器概述 区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据,然后使用数据库来排列搜索到的数据,并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项,然后通过数据库上…

使用git-repo提交代码

前置环境安装 使用Git-Repo提交代码时, 需要先在本地安装好Git环境 git下载地址: https://git-scm.com/download/win 安装git-repo git-repo文档: 阿里git文档 下载地址: 下载地址 下载完git-repo以后, windows的话,将git-repo.exe放到C:\Windows\system32 文件夹下 PS: 注…

市场复盘总结 20240329

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 60% 最常用…

STM32系统结构及总线介绍

1、学习路径 STM32中文参考手册中的第二章存储器和总线构架 2、系统架构(中等容量芯片stm32f103c8) 在小容量、中容量和大容量产品中,主系统由以下部分构成: 四个驱动单元: CortexTM-M3内核DCode总线(D-bus)&#…

python的函数传入参数

函数作为参数传入 函数本身是可以作为参数,传入另一个函数中进行使用的 将函数传入的作用在于:传入计算逻辑,而非传入数据 def test_func(compute):resultcompute(1,2)print(type(compute))print(f"{result}")def compute(x,y):r…

霍尼韦尔大路灯怎么样?书客、雷士、霍尼韦尔护眼落地灯实测PK!

生活在快节奏的时代中,当代青少年都顶着很大的压力,熬夜学习是家常便饭,有时还需要借助电子产品来辅助学习,再加上许多家长都不太注重孩子的视力健康问题,孩子长时间处于一个不良的环境光下学习,眼睛极易疲…

PyLMKit(9):ChatTable与你的表格聊天,表格问答

功能介绍 与你的结构化数据聊天:支持主流数据库、表格型excel等数据! ChatDB:支持数据库问答ChatTable:支持txt,excel,csv等pandas dataframe表格的问答 1.下载安装 pip install pylmkit -U pip install pandasql2.ChatTable实…

Meta 如何将缓存一致性提高到 99.99999999

介绍 缓存是一项强大的技术,广泛应用于计算机系统的各个方面,从缓存等硬件到操作系统、Web 浏览器,尤其是后端开发。对于像 Meta 这样的公司来说,缓存非常重要,因为它可以帮助他们减少延迟、扩展繁重的工作负载并节省资金。由于它们的用例缓存量很大,因此给它们带来了另…

【AI+儿童绘本】从0到1制作儿童绘本故事操作思路

今天刷了会小H书,无意刷到一些 睡前儿童绘本故事, 下面一堆评论说 求软件什么的,博主只是引流没做任何回复。 这里写一篇文章科普下吧,免得有人被割韭菜。 制作儿童绘本, 大概这几个步骤。1、写生动有趣的故事&#x…

隐私计算实训营学习六:隐语PIR介绍及开发指南

文章目录 一、隐语实现的PIR总体介绍1.1 PIR的定义和种类1.2 隐语PIR功能分层 二、Index PIR-SealPIR介绍三、Keyword PIR- Labeled PSI介绍四、隐语PIR后续计划 一、隐语实现的PIR总体介绍 1.1 PIR的定义和种类 PIR(Private Information Retrieval PIR)隐匿查询:…