Pulum DigitalOcean:使用输出



我想用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>

我意识到当液滴仍在创建时,IP地址未知,但我在创建后将液滴添加到列表中。

是否有一种方法可以知道IP地址,以便它可以在Python脚本的其他地方使用。

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

https://www.pulumi.com/docs/intro/concepts/inputs-outputs/应用

要访问输出的原始值并将其转换为新值,请使用apply。此方法接受一个回调,一旦原始值可用,将使用原始值调用该回调。

您可以通过遍历列表并在ipv4_address输出值上调用apply方法来print这些ip:

...
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函数就像对许多资源的应用程序一样。该函数连接整个输出列表。它等待它们全部可用,然后将它们提供给所提供的回调。

希望有帮助!

最新更新