你怎么长不高啊 发表于 2022-6-23 14:45

Python写一个Esxi服务器便携开关虚拟机与查看电源状态的程序

本帖最后由 你怎么长不高啊 于 2022-6-23 14:53 编辑

因自己有一台ESXI7服务器,直通了独显和usb给win11连显示器输出做HTPC主机,
每次想把黑群晖或者其他win或linux虚拟机开关机的时候就需要登入WEB后台,
或者使用VMware客户端进行操作,觉得有点麻烦不够便利,于是自己写了个很简易的程序。
这个程序好像也没什么用处,但是自己觉得方便了一些,但是同理可以修改一下作为远程linux实现需要的操作用途。
开启SSH服务,用命令正常关机虚拟机大概有两种方式(需要先给虚拟机安装vmwaretools工具):
1、esxcli vm process kill --type=soft --world-id=WorldNumber #执行正常关机,调用vmwaretools工具
2、vim-cmd vmsvc/power.shutdown VMID #执行正常关机,调用vmwaretools工具
第一种方式有个弊端就是虚拟机每次启动world-id就会变动一次,所以这里我采用第二种方式使用vim-cmd命令来控制不变的虚拟机VMID
相关操作命令(可根据需求自行修改):
vim-cmd vmsvc/getallvms #获取所有虚拟机的vmid信息
vim-cmd vmsvc/power.getstate VMID #通过VMID查询相应的虚拟机的当前状态:开关机
vim-cmd vmsvc/power.on VMID #打开虚拟机电源
vim-cmd vmsvc/power.shutdown VMID #虚拟机正常关机
vim-cmd vmsvc/power.off VMID #关闭虚拟机电源
vim-cmd vmsvc/power.reset VMID #重启虚拟机
esxcli vm process list #查看正在运行的虚拟机
esxcli vm process kill --type=soft --world-id=WorldNumber #执行正常关机,调用vmwaretools工具
esxcli vm process kill --type=hard --world-id=WorldNumber #断开电源
esxcli vm process kill --type=force --world-id=WorldNumber #强制关机

代码很简单,只需要用到paramiko模块,全部代码如下:
#-*- coding: utf-8 -*-
import paramiko
#Esxi服务器SSH连接信息
hostip = input("请输入服务器IP或域名:")
user = 'root'
passwd = input("请输入服务器密码:")
print("正在连接服务器...")

#主程序
def run():
    try:
      ssh = paramiko.SSHClient()
      ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
      ssh.connect(hostip, 22, user, passwd)
      print("%s连接成功"%hostip)

      # 打印所有虚拟机wmid号
      ALLWMID = "vim-cmd vmsvc/getallvms | awk '{print $1,$2}'"
      # 执行变量命令
      ssh.exec_command(ALLWMID)
      # stdout 为正确输出,stderr为错误输出
      stdin, stdout, stderr = ssh.exec_command(ALLWMID)
      # 输出命令执行结果
      result = stdout.read()
      # 将types转为str,并将输出结果自动换行打印
      result = result.decode('UTF-8').replace('', '')
      # 打印输出结果
      print(result)

      WMID = input("请输入需要操作的虚拟机wmid:")
      NUM = input("操作选项列表:\n0.查看状态\n1.开机\n2.关机\n请输入需要执行的选项:")

      if NUM == str(0):
            STATUS = "vim-cmd vmsvc/power.getstate %s"
            ssh.exec_command(STATUS)
            stdin, stdout, stderr = ssh.exec_command(STATUS % WMID)
            result = stdout.read()
            result = result.decode('UTF-8').replace('', '')
            print("该虚拟机状态如下:\n%s" % result)
      elif NUM == str(1):
            ssh.exec_command("vim-cmd vmsvc/power.on %s" % WMID)
            print("%s已开机"% WMID)
      elif NUM == str(2):
            ssh.exec_command("vim-cmd vmsvc/power.shutdown %s"% WMID)
            print("%s已关机"% WMID)
      else:
            print("输入有误,请重新输入选项!")

      print("正在重新连接中...")
    except Exception as e:
      print("连接失败请联系管理员")

if __name__ == '__main__':
    # 循环运行
    while 1:
      run()



以下是运行结果测试:



运行开机后电源状态

使用pyinstaller打包后程序大小为7.48MB



cuv.cc 发表于 2022-9-6 11:51

感谢分享,ESXi 我前几天帮朋友弄的时候遇到过一个问题,有一台虚拟机在停电之后突然进不了桌面了,新建的虚拟机授予账号之后也进不了桌面,报错,不知道什么原因,不知道你遇到过没有

你怎么长不高啊 发表于 2022-9-7 10:20

cuv.cc 发表于 2022-9-6 11:51
感谢分享,ESXi 我前几天帮朋友弄的时候遇到过一个问题,有一台虚拟机在停电之后突然进不了桌面了,新建的 ...

没有,开不了机得话是遇到过,修复一下就行

败笔网络 发表于 2022-6-23 15:39

成品没有吗

你怎么长不高啊 发表于 2022-6-24 00:03

败笔网络 发表于 2022-6-23 15:39
成品没有吗

拿源码直接编译就可以了,这里好像不允许发成品

bwuaich 发表于 2022-6-24 11:43

nice; thank you for sharing; 或往后会用; {:301_1003:}

wa0lchenxisxa 发表于 2022-6-24 15:25

有编译的成品嘛?求个

你怎么长不高啊 发表于 2022-6-24 16:17

败笔网络 发表于 2022-6-23 15:39
成品没有吗

https://wwu.lanzouf.com/i6ysD06voruj

你怎么长不高啊 发表于 2022-6-24 16:18

wa0lchenxisxa 发表于 2022-6-24 15:25
有编译的成品嘛?求个

https://wwu.lanzouf.com/i6ysD06voruj

xpeng86 发表于 2022-9-7 17:23

需要exsi开启ssh功能才能使用吗
页: [1] 2
查看完整版本: Python写一个Esxi服务器便携开关虚拟机与查看电源状态的程序