监控Hyper-V 宿主机上的虚拟机数量

Posted 史振宁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监控Hyper-V 宿主机上的虚拟机数量相关的知识,希望对你有一定的参考价值。

目的

可以监控每台Hyper-V宿主机上虚拟机总数、Running状态的数量、off状态的数量。

思路

  • powershell脚本获取每台相关数据,zabbix_sender到zabbix server。设置为定时任务。
  • zabbix server 创建对应模板,宿主机关联到模板。

问题

  • 脚本集中在某台服务器上运行,由这台服务器搜集所有宿主机数据。定时任务只在这台服务器上设置即可。

  • 脚本分散在每台宿主机上,各自搜集各自的数据。 每台宿主机都要跑一个定时任务。

考虑到分散运行脚本的话,定时任务维护量大。 所以选择通过将脚本集中在某台服务器上运行,在最后也会提供分散运行如何实现。

实现

  • PS脚本
$computers = "Hyper-V01",
    "Hyper-V02",
    "Hyper-V03",
    "Hyper-V04",
    "Hyper-V05",
    "Hyper-V06",
    "Hyper-V07"

foreach ($h in $computers)  

$zabbix_host = $h + "-PM"   #构造主机名对应到zabbix中的host name字段。

$vmcount = (Get-VM -ComputerName $h | Measure-Object).Count
$vm_on_count = (Get-VM -ComputerName $h | Where-Object $_.State -eq "Running"|Measure-Object).Count
$vm_off_count = (Get-VM -ComputerName $h | Where-Object $_.State -ne "Running"|Measure-Object).Count

C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.count -o $vmcount
C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.oncount -o $vm_on_count
C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.offcount -o $vm_off_count


  • 定时任务
    每2h运行一次

  • Zabbix中创建模板

之后将所有宿主机关联到该模板。

  • 效果


如果选择在每台宿主机单独运行脚本,怎么高效的实现呢?

何为高效?

  • 脚本写好后,高效复制到每台宿主机。(不能人工复制吧?)
  • 高效批量创建定时任务。(不能人工逐台创建吧)

脚本


$h = hostname
$zabbix_host = $h.ToString() + "-PM" 

$vmcount = (Get-VM | Measure-Object).Count
$vm_on_count = (Get-VM | Where-Object $_.State -eq "Running"|Measure-Object).Count
$vm_off_count = (Get-VM | Where-Object $_.State -ne "Running"|Measure-Object).Count

C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.count -o $vmcount
C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.oncount -o $vm_on_count
C:\\zabbix\\bin\\zabbix_sender.exe -z ZABBIX_SERVER_IP  -s $zabbix_host  -k vm.offcount -o $vm_off_count

将脚本批量拷贝到目标机器

  • 方式一:powershell脚本拷贝

Script_name:copy.ps1

$PC = Get-Content("C:\\computer_list.txt") # hyper-v宿主机列表,一行一个。
$PATH_script =  "C:\\zabbix\\scripts\\count_vm.ps1"
$i = 0

foreach ($h in $PC)

$i++
Copy-Item -Path $PATH_script -Destination \\\\$h\\C$\\zabbix\\scripts\\ -Recurse -Force

if ($h -eq $PC[-1])
    Write-Progress -Activity "进度显示" -status "正在处理最后一台主机 $h !"
    Write-Output "总计处理 $i 台主机,传输完毕!"
    #Start-Sleep -Seconds 20
    pause

else
    Write-Progress -Activity "进度显示" -status "正在处理 第 $i 台主机 $h ,请耐心等待!"  -PercentComplete  ($i/$PC.count*100)


  • 方式二: salt拷贝脚本到目标机器
    
    [root@BJ-SaltStack-Node1 sync_file]# salt *Hyper-v* cp.get_file salt://sync_file/count_vm.ps1 c:\\\\zabbix\\scripts\\


### 在目标机器批量创建定时任务

该部分可以详见以下博文,分别对应了两种创建定时任务的方法。
[PowerShell创建定时任务计划](https://blog.51cto.com/magic3/2607133) 
[SaltStack创建WIN定时任务计划](https://blog.51cto.com/magic3/2583246)

以上是关于监控Hyper-V 宿主机上的虚拟机数量的主要内容,如果未能解决你的问题,请参考以下文章

win10 hyper-v 虚拟机ping不通宿主机问题

Hyper-V 虚拟机实时迁移配置

Hyper-V虚拟机和宿主机内网外局域网互通配置

Hyper-V如何实现vm中的共用宿主主机IP上网?

hyper-v虚拟机无法上外网,但与宿主机之间可以ping通。

win10 hyper-v 虚拟机ping不通宿主机问题