メインコンテンツへスキップ
  1. Blogs/

pyvmomiで自動化4 -VMに命令実行-

·1587 文字·
Blog VMware VSphere Pyvmomi Python
hiroki
著者
hiroki
クラウドを作るお仕事をしてます。
目次
pyvmomi - 関連記事
4: << この記事 >>

はじめに
#

第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]

img001

2. VMのリソース情報の取得
#

第3回と同様にVMのリソース情報を取得します。

以下の画像のようなVMのリソース情報を取得してみます。(OSを入れてないので使用率がほぼ0ですが…)

  • 性能がCPU:1vCPU、MEM:1GB
  • 使用率がCPU:0MHz、MEM:10MB

img002

現在のリソース使用量
#

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) []
    }

img003

スペック情報
#

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,

img004

これが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のオブジェクトを地道に探索するのではなく、状況に応じて動的に探す便利な手法について紹介します。

pyvmomi - 関連記事
4: << この記事 >>

Related

pyvmomiで自動化3 -ESXiに命令実行-
·2981 文字
Blog VMware VSphere Pyvmomi Python
pyvmomiで自動化1 -MOBを触ってみよう-
·2382 文字
Blog VMware VSphere Pyvmomi Python
pyvmomiで自動化2 -vCenterにアクセス-
·3692 文字
Blog VMware VSphere Pyvmomi Python