使用govmomi从vCenter获取最近完成任务列表无结果求助
解决govmomi无法获取vCenter任务列表的问题
你的代码无法获取任务列表的核心原因是:vCenter的Task实体并不存放在常规的资源容器层级中,不能通过ContainerView直接检索,必须通过vCenter提供的TaskManager来查询任务记录。
以下是修正后的完整代码,可直接获取最近完成的任务:
package main import ( "context" "fmt" "log" "net/url" "github.com/vmware/govmomi" "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/soap" ) func main() { ctx := context.Background() // 替换为你的vCenter信息 vcURL := "https://your-vcenter-url/sdk" username := "Admin" password := "password" // 创建客户端连接 u, err := soap.ParseURL(vcURL) if err != nil { log.Fatal(err) } u.User = url.UserPassword(username, password) client, err := govmomi.NewClient(ctx, u, true) if err != nil { log.Fatal(err) } // 获取TaskManager实例 var taskManager mo.TaskManager err = client.RetrieveOne(ctx, client.ServiceContent.TaskManager, []string{"recentTasks"}, &taskManager) if err != nil { log.Fatal(err) } // 获取最近任务的详情 var tasks []mo.Task err = client.Retrieve(ctx, taskManager.RecentTasks, []string{"info"}, &tasks) if err != nil { log.Fatal(err) } // 筛选并打印已完成的任务 fmt.Println("最近完成的任务列表:") for _, task := range tasks { // 过滤已成功或失败的任务(排除正在运行的) if task.Info.State == mo.TaskInfoStateSuccess || task.Info.State == mo.TaskInfoStateError { fmt.Printf("任务名称: %s\n", task.Info.Name) fmt.Printf("任务状态: %s\n", task.Info.State) fmt.Printf("完成时间: %s\n", task.Info.CompleteTime) fmt.Printf("发起用户: %s\n", task.Info.UserName) fmt.Println("------------------------") } } }
关键修改说明:
- 改用TaskManager查询:通过
client.ServiceContent.TaskManager获取vCenter的任务管理器引用,这是官方推荐的任务查询入口 - 获取最近任务列表:调用
taskManager.RecentTasks获取系统存储的最近任务记录(vCenter默认保留一定数量的历史任务) - 过滤已完成任务:通过
task.Info.State字段筛选出已成功(success)或失败(error)的任务,排除正在运行中的任务
内容的提问来源于stack exchange,提问作者Sruthi CP
相关产品推荐
相关产品推荐

