LoginSignup
3
2

More than 5 years have passed since last update.

govmomiを使って仮想インスタンスの情報を取得してみた

Last updated at Posted at 2017-05-21

今まではpyvmomiを使って情報を取得したりしていましたが、試しにgovmomiも使ってみたくなったので仮想インスタンスの簡単な情報を取得するプログラムを書いてみたので備忘録として残しておきます。
ちなみに、goは勉強し始めたばかりです...。

govmomi

GitHub

ドキュメント

govmomiインストール

(1) govmomiをインストールします。

$ go get -v github.com/vmware/govmomi

govmomiを使って情報を取得

以下のソースでは、仮想インスタンスの Name CPU数 Memory容量 Guest を表示します。

package main

import (
    "context"
    "fmt"
    "net/url"
    "os"
    "text/tabwriter"

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

const (
    URL      = "https://vCenterIP/sdk"       // ESXi or vCenter URL
    UserName = "administrator@vsphere.local" // ログインユーザー
    Password = "password"                    // ログインパスワード
    Insecure = true                          // 自己証明書の許可 `true`
)

func exit(err error) {
    fmt.Fprintf(os.Stderr, "Error: %s\n", err)
    os.Exit(1)
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // 接続先のURLをパース
    u, err := url.Parse(URL)
    if err != nil {
        exit(err)
    }

    // ログインユーザーとパスワードをセット
    u.User = url.UserPassword(UserName, Password)

    // ログイン
    c, err := govmomi.NewClient(ctx, u, Insecure)
    if err != nil {
        exit(err)
    }
    f := find.NewFinder(c.Client, true)

    // データセンターを検索
    dc, err := f.DefaultDatacenter(ctx)
    if err != nil {
        exit(err)
    }

    // 見つけたデータセンターのローカルコールを使う
    f.SetDatacenter(dc)

    // データセンター内の仮装インスタンスリストを取得
    vms, err := f.VirtualMachineList(ctx, "*")
    if err != nil {
        exit(err)
    }

    // 参照リストに変換する
    var refs []types.ManagedObjectReference
    for _, vm := range vms {
        refs = append(refs, vm.Reference())
    }

    // 指定したプロパティの取得
    pc := property.DefaultCollector(c.Client)
    var vmt []mo.VirtualMachine
    err = pc.Retrieve(ctx, refs, []string{"config"}, &vmt) // ここでは `config` プロパティを指定
    if err != nil {
        exit(err)
    }

    // 仮想インスタンス情報を出力
    tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
    fmt.Fprintf(tw, "Name:\tCPU:\tMemory(MB):\tGuest:\n")
    for _, vm := range vmt {
        fmt.Fprintf(tw, "%s\t", vm.Config.Name)
        fmt.Fprintf(tw, "%d\t", vm.Config.Hardware.NumCPU)
        fmt.Fprintf(tw, "%d\t", vm.Config.Hardware.MemoryMB)
        fmt.Fprintf(tw, "%s\t", vm.Config.GuestFullName)
        fmt.Fprintf(tw, "\n")
    }
    tw.Flush()
}

実行例

実行してみます。

$ go run get_vm_info.go
Name:           CPU:  Memory(MB):  Guest:
MTA             1     2048         CentOS 7 (64-bit)
Windows7        1     1024         Microsoft Windows 7 (32-bit)
vCenter         2     8192         Microsoft Windows Server 2012 (64-bit)

動いた :-)
pyvmomiだと時間がかかる処理でも、goで作り直してあげれば実行処理が効率化されることを期待!!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2