使用Golang的govmomi库通过指定IP、用户名和密码登录vCenter的方法

使用Golang的govmomi库通过指定IP、用户名和密码登录vCenter的方法 我想收集有关 vCenter 资源(主机、虚拟机、虚拟磁盘等)的所有信息。 是否有类似 pyvmomi 那样使用凭据登录 vCenter 的方法?

3 回复

是的,但我无法使用IP、用户名和密码登录

更多关于使用Golang的govmomi库通过指定IP、用户名和密码登录vCenter的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,使用 govmomi 库可以通过指定 IP、用户名和密码登录 vCenter。以下是一个完整的示例代码,展示如何建立连接并获取 vCenter 资源信息。

首先,确保已安装 govmomi 库:

go get github.com/vmware/govmomi

然后,使用以下代码登录 vCenter 并列出主机和虚拟机:

package main

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

	"github.com/vmware/govmomi"
	"github.com/vmware/govmomi/find"
	"github.com/vmware/govmomi/object"
	"github.com/vmware/govmomi/vim25"
)

func main() {
	// 设置 vCenter 连接参数
	vCenterIP := "192.168.1.100" // 替换为你的 vCenter IP
	username := "administrator@vsphere.local" // 替换为你的用户名
	password := "yourpassword" // 替换为你的密码

	// 创建上下文
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 构建 vCenter URL
	u := &url.URL{
		Scheme: "https",
		Host:   vCenterIP,
		Path:   "/sdk",
	}
	u.User = url.UserPassword(username, password)

	// 连接到 vCenter
	client, err := govmomi.NewClient(ctx, u, true)
	if err != nil {
		fmt.Printf("连接失败: %v\n", err)
		os.Exit(1)
	}
	defer client.Logout(ctx)

	fmt.Println("成功连接到 vCenter")

	// 创建 Finder 来查找资源
	finder := find.NewFinder(client.Client, true)

	// 获取默认数据中心
	dc, err := finder.DefaultDatacenter(ctx)
	if err != nil {
		fmt.Printf("获取数据中心失败: %v\n", err)
		os.Exit(1)
	}
	finder.SetDatacenter(dc)

	fmt.Printf("使用数据中心: %s\n", dc.Name())

	// 列出所有主机
	hosts, err := finder.HostSystemList(ctx, "*")
	if err != nil {
		fmt.Printf("获取主机列表失败: %v\n", err)
	} else {
		fmt.Printf("找到 %d 个主机:\n", len(hosts))
		for _, host := range hosts {
			fmt.Printf(" - %s\n", host.Name())
		}
	}

	// 列出所有虚拟机
	vms, err := finder.VirtualMachineList(ctx, "*")
	if err != nil {
		fmt.Printf("获取虚拟机列表失败: %v\n", err)
	} else {
		fmt.Printf("找到 %d 个虚拟机:\n", len(vms))
		for _, vm := range vms {
			fmt.Printf(" - %s\n", vm.Name())
		}
	}

	// 获取虚拟磁盘信息的示例
	if len(vms) > 0 {
		vm := vms[0]
		fmt.Printf("\n获取虚拟机 '%s' 的磁盘信息:\n", vm.Name())
		
		// 获取虚拟机配置
		vmObj := object.NewVirtualMachine(client.Client, vm.Reference())
		devices, err := vmObj.Device(ctx)
		if err != nil {
			fmt.Printf("获取设备失败: %v\n", err)
		} else {
			disks := devices.SelectByType((*object.VirtualDisk)(nil))
			fmt.Printf("找到 %d 个虚拟磁盘:\n", len(disks))
			for _, disk := range disks {
				if vdisk, ok := disk.(*object.VirtualDisk); ok {
					fmt.Printf(" - 磁盘: %s\n", vdisk.DeviceInfo.GetDescription().Summary)
				}
			}
		}
	}
}

这段代码演示了:

  1. 使用 IP、用户名和密码建立到 vCenter 的连接
  2. 获取默认数据中心
  3. 列出所有主机系统
  4. 列出所有虚拟机
  5. 获取特定虚拟机的虚拟磁盘信息

要运行此代码,请将 vCenterIPusernamepassword 替换为你的实际 vCenter 凭据。代码会自动处理 SSL 证书验证(通过 true 参数启用)。

对于生产环境,建议添加错误处理和更完善的资源收集逻辑。你可以扩展此代码来收集其他资源类型,如数据存储、网络等。

回到顶部