目的

可以监控每台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运行一次
    image.png
    image.png

  • Zabbix中创建模板

image.png

image.png

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

  • 效果

image.png


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

何为高效?

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

脚本


$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)