Pulum DigitalOcean:使用输出

Pulum DigitalOcean: use outputs

我想使用 Pulumi 在 DigitalOcean 上创建一些服务器。我有以下代码:

for i in range(0, amount):
    name = f"droplet-{i+1}"

    droplet = digitalocean.Droplet(
        name,
        image=_image,
        region=_region,
        size=_size,
    )
    pulumi.export(f"droplet-ip-{i+1}", droplet.ipv4_address)

这是在控制台上正确输出服务器的 IP 地址。

但是我想在我的 Python 脚本中的其他地方使用 IP 地址。因此,我将液滴添加到列表中,如下所示:

droplets = []

for i in range(0, amount):
    name = f"droplet-{i+1}"

    droplet = digitalocean.Droplet(
        name,
        image=_image,
        region=_region,
        size=_size,
    )
    pulumi.export(f"droplet-ip-{i+1}", droplet.ipv4_address)
    droplets.append(droplet)

然后按如下方式遍历液滴:

for droplet in droplets:
    print(droplet.ipv4_address)

在 Pulumi 输出中,我看到以下内容:

Diagnostics:
  pulumi:pulumi:Stack (Pulumi_DigitalOcean-dev):
    <pulumi.output.Output object at 0x105086b50>
    <pulumi.output.Output object at 0x1050a5ac0>

我意识到虽然 droplet 仍在创建中,但 IP 地址未知,但我在创建后将 droplet 添加到列表中。

有没有办法在某个时候知道 IP 地址,以便它可以在 Python 脚本的其他地方使用。

简短的回答是因为这些值是 Outputs,如果你想要字符串,你需要使用 .apply:

https://www.pulumi.com/docs/intro/concepts/inputs-outputs/#apply

To access the raw value of an output and transform that value into a new value, use apply. This method accepts a callback that will be invoked with the raw value, once that value is available.

您可以 print 这些 IP,方法是遍历列表并对 ipv4_address 输出值调用 apply 方法:

...
pulumi.export(f"droplet-ip-{i+1}", droplet.ipv4_address)
droplets.append(droplet)
...

for droplet in droplets:
    droplet.ipv4_address.apply(lambda addr: print(addr))
$ pulumi up
...

Diagnostics:
  pulumi:pulumi:Stack (so-71888481-dev):
    143.110.157.64
    137.184.92.205
 
Outputs:
    droplet-ip-1: "137.184.92.205"
    droplet-ip-2: "143.110.157.64"

根据您计划在程序中使用这些字符串的方式,这个方法可能并不完美,但总的来说,如果您想要 pulumi.Output 的展开值,您需要使用 .apply().

如果您想在使用之前等待多个输出值解析,pulumi.Output.all() 也派上用场:

https://www.pulumi.com/docs/intro/concepts/inputs-outputs/#all

If you have multiple outputs and need to join them, the all function acts like an apply over many resources. This function joins over an entire list of outputs. It waits for all of them to become available and then provides them to the supplied callback.

希望对您有所帮助!