🗒️

複数のvCenterのリソース状況を取得するスクリプト

2024/07/14に公開

はじめに

複数のvCenterを運用していて、リソースの状況(CPU、メモリ、DISK)を取得するPowerCLIスクリプトを作ってみましたので記事にしました。

概要

  • 各vCenter上のVMホストごとのCPU/メモリの、使用量/空き/総量を取得してCSV出力します
  • 各vCenter上のDatastoreごとの、使用量/空き/総容量を取得してCSV出力します

やってみた

環境

以前紹介した、VMwareハンズオンラボ環境で行います。

https://zenn.dev/arbr/articles/b5f17dcdfaa089

スクリプト・ファイル

ファイル構成は以下とします。10_run_get_resources.batをダブルクリックするだけで実行するようにしています。

─(適当なフォルダ)
   │  get_resources.ps1
   │  10_run_get_resources.bat
   └─conf/
           vcenter_info.csv

各ファイルは以下です。

get_resources.ps1
get_resources.ps1
param (
    [Parameter(Mandatory = $true)]
    [string]$csvPath
)

# Initialize an array to store resource information
$resourcesInfo = @()
$disksInfo = @()

$vcInfo = Import-Csv -Path $csvPath

# Loop through each entry in the CSV file
foreach ($vc in $vcInfo) {
    # Connect to vCenter
    Write-Output "Connecting to vCenter $($vc.hostname)..."
    Connect-VIServer -Server $vc.hostname -User $vc.username -Password $vc.password

    # Get resource allocation and total amounts for CPU, Memory
    $vmHosts = Get-VMHost
    foreach ($vmHost in $vmHosts) {
        $cpuUsageMhz = $vmHost.CpuUsageMhz
        $cpuTotalMhz = $vmHost.CpuTotalMhz
        $cpuFreeMhz = $cpuTotalMhz - $cpuUsageMhz

        $memoryUsageBytes = $vmHost.MemoryUsageGB
        $memoryTotalBytes = $vmHost.MemoryTotalGB
        $memoryFreeBytes = $memoryTotalBytes - $memoryUsageBytes

        # Store the information in the array
        $resourcesInfo += [PSCustomObject]@{
            VC_Hostname = $vc.hostname
            VM_Hostname = $vmHost.Name
            CPU_Usage_MHz = $cpuUsageMhz
            CPU_Free_MHz = $cpuFreeMhz
            CPU_Total_MHz = $cpuTotalMhz
            Memory_Usage_GB = $memoryUsageBytes
            Memory_Free_GB = $memoryFreeBytes
            Memory_Total_GB = $memoryTotalBytes
        }
    }

    # Get resource allocation and total amounts for Disk
    $dataStore = Get-Datastore
    foreach ($eachStore in $dataStore) {
        $diskCapacityBytes = $eachStore.CapacityGB
        $diskFreeBytes = $eachStore.FreeSpaceGB
        $diskUsageBytes = $diskCapacityBytes - $diskFreeBytes

        # Store the information in the array
        $disksInfo += [PSCustomObject]@{
            VC_Hostname = $vc.hostname
            Datastore_Name = $eachStore.Name
            Disk_Usage_GB = $diskUsageBytes
            Disk_Free_GB = $diskFreeBytes
            Disk_Capacity_GB = $diskCapacityBytes
        }
    }

    # Disconnect from vCenter
    Disconnect-VIServer -Server $vc.hostname -Confirm:$false
    Write-Output "Disconnected to vCenter $($vc.hostname)"
}

# Export the resource information to a CSV file
$resourcesInfo | Export-Csv -Path "resource_info.csv" -NoTypeInformation
$disksInfo | Export-Csv -Path "disk_info.csv" -NoTypeInformation

Write-Output "Resource information has been exported to resource_info.csv and disk_info.csv"
10_run_get_resources.bat
10_run_get_resources.bat
@echo off
powershell.exe -File "get_resources.ps1" -csvPath "conf\vcenter_info.csv"
pause
vcenter_info.csv
conf/vcenter_info.csv
hostname,username,password,remarks
vcsa-01a.corp.vmbeans.com,administrator@vsphere.local,VMware1!,Primary vCenter

実行すると、同じフォルダにresource_info.csvdisk_info.csvが作成され、それぞれに取得したリソースの状況が出力されます。

おわりに

今回もラボ環境を使い、リソース状況を取得するスクリプトを作ってみました。
前回と同様、ChatGPTにプロンプト文を投げて作ろうとしたのですが、今回はあまり出来が良くありませんでした。そのため生成に用いたプロンプト文は記載しておりません。
この記事がどなたかのお役に立てれば幸いです。

Discussion