首页 > 编程语言 >Python学习之十六_virsh批量获取虚拟机IP地址的方法

Python学习之十六_virsh批量获取虚拟机IP地址的方法

时间:2023-12-16 14:22:48浏览次数:34  
标签:11 Python 54 虚拟机 xxx xx virsh IP地址 K8S

Python学习之十六_virsh批量获取虚拟机IP地址的方法


Linux命令说明

for j in \
    $(for i in `virsh list |grep -v Id  |grep running |awk '{print $2}'` ; \
         do  virsh dumpxml $i |grep "mac address"| awk -F\' '{ print $2}' && echo $i ; done) ; \
    do echo -n $j  && arp -an|grep  $j |grep enp  ; done

命令说明

双层嵌套循环
内存获取机器名字列表,并且打印.
virsh list |grep -v Id  |grep running |awk '{print $2}'

然后利用机器名 获取 xml配置文件信息
virsh dumpxml  $vm_name
获取mac地址信息, 并且仅展示mac地址
grep "mac address"| awk -F\' '{ print $2}'

通过arp 列表找出 对应的IP地址信息
arp -an |gerp mac_address

执行效果为:

11-K8S-m20152:54:00:61:01:8a? (xx.xxx.xxx.162) at 52:54:00:61:01:8a [ether] on enp39s0f0
11-K8S-m20352:54:00:a7:cb:c5? (xx.xxx.xxx.161) at 52:54:00:a7:cb:c5 [ether] on enp39s0f0
11-K8S-m20252:54:00:9d:77:0c? (xx.xxx.xxx.163) at 52:54:00:9d:77:0c [ether] on enp39s0f0
11-K8S-w20452:54:00:7d:18:6b? (xx.xxx.xxx.164) at 52:54:00:7d:18:6b [ether] on enp39s0f0
11-K8S-w20552:54:00:96:47:60? (xx.xxx.xxx.165) at 52:54:00:96:47:60 [ether] on enp39s0f0
11-K8S-w20752:54:00:df:06:1a? (xx.xxx.xxx.166) at 52:54:00:df:06:1a [ether] on enp39s0f0
11-K8S-n20852:54:00:04:95:18? (xx.xxx.xxx.167) at 52:54:00:04:95:18 [ether] on enp39s0f0
11-K8S-db21052:54:00:0c:75:e9? (xx.xxx.xxx.169) at 52:54:00:0c:75:e9 [ether] on enp39s0f0

执行时间信息为:
real    0m0.225s
user    0m0.159s
sys     0m0.136s

最近学习python 尝试实现一下.

#!/usr/bin/python3
# coding=utf-8
import os
vmlist = os.popen("virsh list |grep -v Id  |grep running |awk '{print $2}'")
for i in vmlist :
    print(i[:-1] + "机器的IP地址为: ",end="")
    with os.popen("virsh dumpxml  " + i[:-1] + " |grep  'mac address'| awk -F \\' '{ print $2}'") as pipe :
        mac = pipe.read()
    with os.popen("arp -an | grep " + mac[:-1] + " | awk '{print $2}' |head -n 1 " ) as pipe2:
        ip = pipe2.read()
        print(ip[1:-2])

执行结果为:


11-k8s-w15机器的IP地址为: xx.xxx.xxx.158
11-k8s-w12机器的IP地址为:
11-K8S-m201机器的IP地址为: xx.xxx.xxx.160
11-K8S-m203机器的IP地址为: xx.xxx.xxx.162
11-K8S-m202机器的IP地址为: xx.xxx.xxx.161
11-K8S-w204机器的IP地址为: xx.xxx.xxx.163
11-K8S-w205机器的IP地址为: xx.xxx.xxx.164
11-K8S-w207机器的IP地址为: xx.xxx.xxx.165
11-K8S-n208机器的IP地址为: xx.xxx.xxx.166
11-K8S-db210机器的IP地址为: xx.xxx.xxx.167
11-K8S-r215机器的IP地址为: xx.xxx.xxx.169

执行时间信息为: 
real    0m0.274s
user    0m0.198s
sys     0m0.132s

Python命令解析

首先: 最开始三行的作用是指定运行脚本解析器, 以及编码和需要的os包.
#!/usr/bin/python3
# coding=utf-8
import os

其次: 一个命令获取机器列表
vmlist = os.popen("virsh list |grep -v Id  |grep running |awk '{print $2}'")
需要注意 os.system() 会直接界面化执行命令, 并不能够返回结果, 需要使用 popen 的方式才能够获取

再次: 建议循环:
for i in vmlist :

循环内处理:
print(i[:-1] + " 机器的IP地址为: ",end="")
通过[:-1] 去掉最后一个回车字符, 通过指定 end="", 不能行默认换行, 便于友好展示. 
with os.popen("virsh dumpxml  " + i[:-1] + " |grep  'mac address'| awk -F \\' '{ print $2}'") as pipe :
    mac = pipe.read()
通过 with as 命令, 将 popen 打开的命令结果集转为pipe
然后通过 read 命令, 将结果转换为字符, 不然会报对象未封装的错误. 

注意 shell 命令与linux的命令是一样的. 

感想

人生苦短, 要学python
python 的确能够极大的提高展现能力. 
我回继续学习python. 提高自己. 
虽然速度慢一点点 但是效果要好非常多. 

标签:11,Python,54,虚拟机,xxx,xx,virsh,IP地址,K8S
From: https://www.cnblogs.com/jinanxiaolaohu/p/17408775.html

相关文章

  • Python 以类作为装饰器 几种使用场景
    1.原函数、装饰器都没有参数代码:classTest:def__init__(self,func):print('Bein__init__process...')self.__func=funcdef__call__(self):print("...Startdecorate...")self.__func()prin......
  • 基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数
    简介LSTM是一种常用的循环神经网络,其全称为“长短期记忆网络”(LongShort-TermMemoryNetwork)。相较于传统的循环神经网络,LSTM具有更好的长期记忆能力和更强的时间序列建模能力,因此在各种自然语言处理、语音识别、时间序列预测等任务中广泛应用。问题场景:对一节火车进行装载货物,......
  • python操作文件夹
    帮我写一个python程序遍历文件夹下所有的压缩文件,如ziprar7z结尾的文件等等当然可以!以下是一个Python程序,它可以遍历指定文件夹下的所有压缩文件,如zip、rar、7z等等。你可以根据需要修改代码中的路径和文件类型。请注意,这个程序需要安装第三方库patool和pyunpack,你可以使用pip......
  • 使用Python Multiprocessing库提升代码性能
    在现代计算机编程中,利用多核处理器的能力来提高应用程序的执行速度至关重要。Python的multiprocessing库就是为此而生的,它允许程序员创建进程,这些进程可以在多个CPU核心间并行运行,从而提高程序的性能。在这篇技术博客中,我们将探索multiprocessing库的关键概念及其在Python中的应用......
  • JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)
    虚拟机栈虚拟机栈为每个线程所私有的,如下图:栈帧是什么?栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息栈内存为线程私有的空间,每个方法在执行时都会创建一个栈帧,执行该方法时,就会将该方法所对应的栈帧入栈局部变量表:用于存储方法参数和定义在方法体内部的局部......
  • Python NumPy 线性代数
    ​ 1、矩阵和向量积矩阵和向量积可以用 numpy.dot() 函数来计算。numpy.dot()函数的两个参数分别是矩阵和向量。1)矩阵积矩阵积是两个矩阵相乘的结果。矩阵积的计算方法是将矩阵的每一行与另一个矩阵的每一列相乘,然后将各个相乘结果相加。示例代码:PythonNumPy线性代数-......
  • python高级之包
    包1、包就是一个含有__init__.py文件的文件夹2、为何要有包?包的本质是模块的一种形,包是用来当作模块被导入#1.产生一个名称空间#2.运行包下__init__.py文件,将运行过程中产生的名字都丢到1的名称空间中。#3.在当前执行文件的名称空间中拿到一个名字mmm,mmm指向1的名称空间im......
  • python高级之软件开发的目录规范
    软件开发的目录规范为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可,假设你的软件名为foo,笔者推荐目录结构如下Foo/|--core/||--core.py||--api/||--api.py||--db/|......
  • python高级之名称空间和作用域
    名称空间与作用域补充知识栈区/堆区栈区:存放的是变量名与变量值的内存地址映射关系堆区:存放的是值真正的位置名称空间引入:1.什么是名称空间?-名称:定义的名字空间:存放名字的地方-名称空间即存放名字与对象映射/绑定关系的地方。-名称空间只是虚拟的概念......
  • python高级之函数对象与闭包函数
    函数对象和闭包函数函数对象1,什么是函数对象?函数对象简单理解就是将函数当变量来使用。如下图所示:定义一个函数可以简单的理解为:func=函数体内存地址函数名+()–>调用函数函数名-->函数对象,函数名不加括号此时的函数名就是函数对象函数用于赋值将函数赋值给某个变......