2017年9月5日火曜日

govmomi を使って VirtualMachine の moid を取得してみた

概要

govmomi を使って VM の情報を取得します
その際に ManagedObjectReference の moid を取得してみます

環境

  • Ubuntu 16.04
  • golang 1.8
  • govmomi 0.14.0

事前準備

ライブラリのインストールなどは過去の記事を参考にしてください
http://blog.hawksnowlog.cf/2017/04/try-vmware-govmomi.html

ソースコード

  • vim get_vm_moid.go
package main

import (
    "context"
    "flag"
    "fmt"
    "net/url"
    "os"

    "github.com/vmware/govmomi"
    "github.com/vmware/govmomi/find"
    "github.com/vmware/govmomi/vim25/types"
        "github.com/vmware/govmomi/property"
        "github.com/vmware/govmomi/vim25/mo"
)

var envURL = "https://192.168.100.101/sdk"
var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL)
var urlFlag = flag.String("url", envURL, urlDescription)

var envInsecure = true
var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure)
var insecureFlag = flag.Bool("insecure", envInsecure, insecureDescription)

func main() {
        // vCenter への接続
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
        flag.Parse()
        u, err := url.Parse(*urlFlag)
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        u.User = url.UserPassword("vcenter-user", "vcenter-password")
        c, err := govmomi.NewClient(ctx, u, *insecureFlag)
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        fmt.Println(c.Client.Client.Version)

        // データセンターの取得
        f := find.NewFinder(c.Client, true)
        dc, err := f.DefaultDatacenter(ctx)
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        f.SetDatacenter(dc)
        fmt.Println(dc)

        // VM の検索
        pc := property.DefaultCollector(c.Client)
        refs := []types.ManagedObjectReference{}
        vss, err := f.VirtualMachineList(ctx, "/dc/vm/folder/folder2/target_vm")
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        for _, vs := range vss {
                fmt.Println(vs.Common.InventoryPath)
                refs = append(refs, vs.Reference())
        }
        var vdst []mo.VirtualMachine
        err = pc.Retrieve(ctx, refs, nil, &vdst)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        for _, vs := range vdst {
        fmt.Println(vs.Self.Value) // <- これで moid を取得できる
                fmt.Println(vs.Summary.Guest.GuestId)
                fmt.Println(vs.Summary.Guest.GuestFullName)
                fmt.Println(vs.Summary.Guest.HostName)
                fmt.Println(vs.Summary.Guest.IpAddress)
                fmt.Println(vs.Summary.Config.Name)
                fmt.Println(vs.Summary.Config.VmPathName)
                fmt.Println(vs.Summary.Config.MemorySizeMB)
                fmt.Println(vs.Summary.Config.NumCpu)
        }
}

ポイントは最後の vs.Self.Value です
これで moid が取得できます
フィールド名が Value なので moid だと名前から推測できないのでわかりづらいです

参考サイト

0 件のコメント:

コメントを投稿