You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go中反序列化Pulumi auto.Result的连接信息

解决Pulumi自动化API提取Hetzner服务器连接信息的问题

核心问题原因

remote.ConnectionArgs 的字段使用了Pulumi封装的输入类型(如pulumi.StringInput、pulumi.Float64PtrInput),而Pulumi导出的栈输出是原始基础类型值(string、float64等),两者类型不匹配,因此无法直接反序列化。


解决方案1:逐个导出字段(最直接)

避免导出整个ConnectionArgs结构体,而是在部署函数里分别导出单个连接参数,后续直接提取基础类型值:

deployFunc := func(ctx *pulumi.Context) error {
    // ... 省略SSH密钥、服务器部署逻辑

    // 单独导出每个连接字段
    ctx.Export("server-host", server.Ipv4Address)
    ctx.Export("server-port", pulumi.Float64(22))
    ctx.Export("server-user", pulumi.String("root"))
    ctx.Export("server-private-key", sshKeyPair.Private)

    return nil
}

// 部署后提取值
res, _ := stack.Up(ctx)

host := res.Outputs["server-host"].Value.(string)
port := res.Outputs["server-port"].Value.(float64)
user := res.Outputs["server-user"].Value.(string)
privateKey := res.Outputs["server-private-key"].Value.(string)

// 若需要转换成remote.ConnectionArgs
connArgs := remote.ConnectionArgs{
    Host:       pulumi.String(host),
    Port:       pulumi.Float64(port),
    User:       pulumi.String(user),
    PrivateKey: pulumi.String(privateKey),
}

解决方案2:自定义基础类型结构体解析

如果坚持导出整个结构体,可先将输出值断言为map[string]interface{},再转成自定义的基础类型结构体:

// 定义与输出结构匹配的基础类型结构体
type PlainConnectionInfo struct {
    Host       string  `json:"host"`
    Port       float64 `json:"port"`
    User       string  `json:"user"`
    PrivateKey string  `json:"privateKey"`
}

// 部署后提取并解析
res, _ := stack.Up(ctx)

// 直接断言为map,不要用fmt.Sprintf转成字符串
outputVal, ok := res.Outputs["server-connect-info"].Value.(map[string]interface{})
if !ok {
    // 处理类型断言失败逻辑
}

// 方式1:手动赋值
var connInfo PlainConnectionInfo
connInfo.Host = outputVal["host"].(string)
connInfo.Port = outputVal["port"].(float64)
connInfo.User = outputVal["user"].(string)
connInfo.PrivateKey = outputVal["privateKey"].(string)

// 方式2:JSON序列化后反序列化
import "encoding/json"

jsonBytes, err := json.Marshal(outputVal)
if err != nil {
    // 处理序列化错误
}

var connInfo PlainConnectionInfo
err = json.Unmarshal(jsonBytes, &connInfo)
if err != nil {
    // 处理反序列化错误
}

// 转换成remote.ConnectionArgs
pulumiConnArgs := remote.ConnectionArgs{
    Host:       pulumi.String(connInfo.Host),
    Port:       pulumi.Float64(connInfo.Port),
    User:       pulumi.String(connInfo.User),
    PrivateKey: pulumi.String(connInfo.PrivateKey),
}

关键说明

Pulumi的输入类型(如pulumi.StringInput)是用于部署阶段的声明式资源定义,而栈输出只会保留原始的实际值,因此无法直接将输出值映射回带Pulumi输入类型的结构体,必须通过基础类型中转。

内容的提问来源于stack exchange,提问作者nusantara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:10:26