概要
vCenter 配下で管理されているフォルダ情報を govmomi を使って取得してみます
すべてのフォルダを取得する方法と単体で取得する方法を紹介します
環境
- Ubuntu 16.04
- golang 1.8
- govmomi 0.14.0
ソースコード
- vim main.go
package main
import (
"context"
"flag"
"fmt"
"net/url"
"os"
"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"
)
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_pass")
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)
// フォルダの取得
pc := property.DefaultCollector(c.Client)
frefs := []types.ManagedObjectReference{}
folder, err := f.Folder(ctx, "/dc/vm/folder_name/")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(folder.Common.InventoryPath)
frefs = append(frefs, folder.Reference())
var fdst []mo.Folder
err = pc.Retrieve(ctx, frefs, nil, &fdst)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for _, f := range fdst {
fmt.Println(f.Name)
fmt.Println(f.Tag)
}
// 全フォルダの取得
fsrefs := []types.ManagedObjectReference{}
folders, err := f.FolderList(ctx, "*")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for _, folder := range folders {
fmt.Println(folder.Common.InventoryPath)
fsrefs = append(fsrefs, folder.Reference())
}
var fsdst []mo.Folder
err = pc.Retrieve(ctx, fsrefs, nil, &fsdst)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for _, f := range fsdst {
fmt.Println(f.Name)
fmt.Println(f.Tag)
}
}
まず vCenter に接続しデータセンターの情報を取得します
その後 f.Folder にフォルダのパスを指定することでフォルダ単体を取得しています
取得後は types.ManagedObjectReference に突っ込んで pc.Retrieve することでフォルダの情報を取得しています
あとは types.ManagedObjectReference に設定された値をループで回して参照しているだけです
全件取得の場合には f.FolderList(ctx, "*")
とパスの部分をアスタリスクにすることで実現できます
あとは同じ流れで moref に突っ込んで pc.Retrieve で設定し、moref をループで回して参照するだけです
今回は Name と Tag を参照していますが、フォルダの他の情報を参照したい場合は godoc を見てください
https://godoc.org/github.com/vmware/govmomi/vim25/mo#Folder
最後に
govmomi を使ってフォルダを参照する方法を紹介しました
フォルダのオブジェクトが取得できるようになればフォルダに対する操作もできるようになります
例えば削除や名前の変更 VM をフォルダに移動することなどができるようになります
その辺の操作周りに関しても別記事で紹介できればなと思います
0 件のコメント:
コメントを投稿