はじめに #
第3回では、ESXiに簡単な命令を実行しました。今回はVMのオブジェクトに簡単な命令を実行してみます。
1. VMのオブジェクト取得 #
ESXi上で稼働しているVMは、<esxiのobject>.vm
で取得することができます。今回はsample001のVMを取得します。
from pyVim import connect
si = connect.SmartConnect(
host=vc_ip,
user=vc_usr,
pwd=vc_pwd,
disableSslCertValidation=True
)
# esxiを取得
esxi = si.content.rootFolder.childEntity[0].hostFolder.childEntity[0].host[0]
print(esxi.name)
>>> v10-nesxi-01.lab.local
# esxiで稼働しているVMを取得
print(esxi.vm)
>>>(ManagedObject) [
'vim.VirtualMachine:vm-49',
'vim.VirtualMachine:vm-42']
# 分かりやすく名前も出力
for vm in esxi.vm:
print(f"{vm}:{vm.name}")
>>>'vim.VirtualMachine:vm-49':sample001
>>>'vim.VirtualMachine:vm-42':vCLS-d52cd7a2-f480-49be-9013-984a796ef551
vm = esxi.vm[0]
2. VMのリソース情報の取得 #
第3回と同様にVMのリソース情報を取得します。
以下の画像のようなVMのリソース情報を取得してみます。(OSを入れてないので使用率がほぼ0ですが…)
- 性能がCPU:1vCPU、MEM:1GB
- 使用率がCPU:0MHz、MEM:10MB
現在のリソース使用量 #
VMの現在のリソース使用量は<vmのobject>.summary.quickStats
で取得することができます。公式のdocs
print(vm.summary.quickStats)
>>>(vim.vm.Summary.QuickStats) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
overallCpuUsage = 0,
overallCpuDemand = 0,
overallCpuReadiness = 0,
guestMemoryUsage = 10,
hostMemoryUsage = 69,
...
compressedMemory = 0,
uptimeSeconds = 2956,
ssdSwappedMemory = 0,
activeMemory = 10,
memoryTierStats = (vim.vm.Summary.QuickStats.MemoryTierStats) []
}
スペック情報 #
VMのスペック情報は2箇所で確認する必要があります。
基本的な情報は<vmのobject>.summary.config
print(vm.summary.config)
>>>(vim.vm.Summary.ConfigSummary) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
name = 'sample001',
template = false,
vmPathName = '[v10-nesxi-01-esx-install-datastore] sample001/sample001.vmx',
memorySizeMB = 1024,
cpuReservation = 0,
memoryReservation = 0,
numCpu = 1,
numEthernetCards = 1,
numVirtualDisks = 1,
uuid = '4215e36d-d514-7794-d01f-45dfb71faaf7',
instanceUuid = '5015d0f0-e681-6a60-2211-579a9771a192',
guestId = 'ubuntu64Guest',
guestFullName = 'Ubuntu Linux (64-bit)',
annotation = '',
product = <unset>,
installBootRequired = false,
ftInfo = <unset>,
managedBy = <unset>,
tpmPresent = false,
numVmiopBackings = 0,
hwVersion = 'vmx-20'
}
VMのcpuの最大周波数だけは、<vmのobject>.summary.runtime)
で確認が必要です。
(vim.vm.RuntimeInfo) {
dynamicType = <unset>,
host = 'vim.HostSystem:host-40',
...
connectionState = 'connected',
powerState = 'poweredOn',
maxCpuUsage = 3194,
maxMemoryUsage = 1024,
これがMOBのProperties情報を取得する例になります。ESXiと同じようにMOBの階層をpyvmomiでも指定するだけなので簡単ですね。(MOBが複雑ですが…)
3. VMのpowerON/OFF #
今度はMOBのMethodsを実行する例として、VMのpowerON/OFFを実施します。
VMのpowerONは<vmのobject>.PowerOnVM_Task()
、powerOFFは<vmのobject>.PowerOnVM_Task()
で実施できます。
from pyVim import task
if vm.summary.runtime.powerState == "poweredOn": # powerONならpowerOFFの実施
print("VM is powered on. Powering off...")
print(task.WaitForTask(vm.PowerOffVM_Task()))
else:
print("VM is powered off. Powering on...")
print(task.WaitForTask(vm.PowerOnVM_Task())) # powerOFFならpowerONの実施
例えばpyvmomi-community-sampleのように、たまにPowerOn()
とPowerOFF()
を使っている例を見かけます。これはvSphere8でも使えますが、MOBからは削除されておりPowerOnVM_Task()
のように_Task()
がついているものが推奨されているようです。(powerON/OFFに限らず)
# Find the vm and power it on
tasks = [vm.PowerOn() for vm in vm_list if vm.name in vmnames]
# Wait for power on to complete
wait_for_tasks(si, tasks)
4. [おまけ]Clusterのリソース情報の取得 #
ここまでESXi,VMのリソース情報の取得を実施してきましたが、Clusterの取得方法はこれらとは異なるのでおまけとして載せておきます。
Clusterのリソース情報はProperties情報ではなく、GetResourceUsage()
のMethodsで取得する形になります。非常に分かりにくいですね…
print(cluster.GetResourceUsage())
>>>(vim.cluster.ResourceUsageSummary) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
cpuUsedMHz = 331,
cpuCapacityMHz = 19164,
memUsedMB = 5933,
memCapacityMB = 24573,
pMemAvailableMB = 0,
pMemCapacityMB = 0,
storageUsedMB = 7179,
storageCapacityMB = 29952
}
おわりに #
第3回と今回とオブジェクトのProperties情報の取得、Methodsの実行とオブジェクトに関して取り扱ってきましたが、これでpyvmomiのオブジェクトの扱い方は掴めたのではと思います。
第5回では、VMやESXiのオブジェクトを地道に探索するのではなく、状況に応じて動的に探す便利な手法について紹介します。