我正在使用Go语言中的Pulumi的自动化API将服务器部署到Hetzner,但是我不知道如何从部署结果中获取最终的连接信息。
下面是截断的代码:
import (
...
"github.com/pulumi/pulumi-command/sdk/go/command/remote"
"github.com/pulumi/pulumi/sdk/v3/go/auto"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
...
deployFunc := func(ctx *pulumi.Context) error {
// Create SSH key pair, upload them to Hetzner, get back a `*hcloud.SshKey`
...
// `server` is a *hcloud.Server object
server, _ := DeployServerToHetzner(ctx, sshKey)
// This is the info I want to retrieve from the result
connectInfo := remote.ConnectionArgs{
Host: server.Ipv4Address,
Port: pulumi.Float64(22),
User: pulumi.String("root"),
PrivateKey: sshKeyPair.Private,
}
ctx.Export("server-connect-info", connectInfo)
return nil
}
stack, _ := auto.UpsertStackInlineSource(ctx, stackName, projectName, deployFunc, opts...)
res, _ := stack.Up(ctx)
// This is a string but I need it as either map or struct
serverConnectInfo := fmt.Sprintf("%v", res.Outputs["server-connect-info"].Value)
我可以从res.Outputs
中检索结果,但它是一个字符串。我知道服务器部署和连接详细信息的响应是成功的,因为当我记录serverConnectInfo
时,它看起来像这样:
serverConnectInfo map[host:123.456.789.10 port:22 privateKey:-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNza...
-----END OPENSSH PRIVATE KEY-----
user:root]
基于网上一些可疑的解决方案,我尝试将其编组为JSON,然后将其解编组为Pulumi remote.ConnectionArgs
示例。这显然不起作用,因为结构体看起来像这样:
// From https://pkg.go.dev/github.com/pulumi/pulumi-command/sdk@v0.7.2/go/command/remote#ConnectionArgs
type ConnectionArgs struct {
...
Host pulumi.StringInput `pulumi:"host"`
Port pulumi.Float64PtrInput `pulumi:"port"`
PrivateKey pulumi.StringPtrInput `pulumi:"privateKey"`
User pulumi.StringPtrInput `pulumi:"user"`
}
我正在考虑构造自己的结构体,然后重试JSON解组和编组解决方案,但似乎如果ConnectionArgs
结构体已经有pulumi
标记,那么应该在某处有某种pulumi.Unmarshal
方法。我说错了吗?反正我也找不到。
我也看过文档,但没有看到任何有用的东西。也许我错过了一页。
1条答案
按热度按时间pxiryf3j1#
正如Peter在评论中指出的那样,
res.Outputs["server-connect-info"].Value
是一个Map,并且正确地猜到我通过fmt.Sprintf
运行了它。我真是太傻了这是可行的:
在使用内置测试包的Go测试中也能很好地工作: