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