我正在尝试使用govmomi library确定我的 ESX 资产中每台服务器的集群成员资格。从文档中,它看起来像ComputeResource
嵌入在ClusterComputeResource
但我没有阅读它。到目前为止,我有:
package main
import (
"context"
"fmt"
"log"
"net/url"
"github.com/crooks/vmware_exporter/config"
"github.com/vmware/govmomi/session/cache"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/mo"
"github.com/vmware/govmomi/view"
"github.com/vmware/govmomi/vim25/soap"
)
var (
cfg *config.Config
)
func newClient(ctx context.Context) (*vim25.Client, error) {
u, err := soap.ParseURL(cfg.API.URL)
u.User = url.UserPassword(cfg.API.UserID, cfg.API.Password)
s := &cache.Session{
URL: u,
Insecure: cfg.API.Insecure,
}
c := new(vim25.Client)
err = s.Login(ctx, c, nil)
if err != nil {
return nil, err
}
return c, nil
}
func main() {
var err error
flags := config.ParseFlags()
cfg, err = config.ParseConfig(flags.ConfigFile)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
c, err := newClient(ctx)
if err != nil {
log.Fatal(err)
}
m := view.NewManager(c)
v, err := m.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"ClusterComputeResource"}, true)
if err != nil {
log.Fatal(err)
}
defer v.Destroy(ctx)
var hss []mo.ClusterComputeResource
err = v.Retrieve(ctx, []string{"ClusterComputeResource"}, []string{"host", "summary", "name"}, &hss)
if err != nil {
log.Fatalf("Retrieval Error: %v", err)
}
for _, hs := range hss {
fmt.Printf("%+v\n", hs.Name)
fmt.Printf("Host: %+v\n", hs.Host)
fmt.Printf("%+v\n", hs.Summary)
}
}
在host
属性中,我可以看到以下形式的集群节点:
[HostSystem:host-8600 HostSystem:host-8571]
这些看起来像 HostSystem 对象,但不是我可以从中提取项目(如主机名)的结构。
使用govc
,我的目标是微不足道的!govc tree <DC>/host/<cluster>
.