我想使用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脚本的其他地方使用。
发布于 2022-04-15 22:45:43
简单的回答是,由于这些值是Output的,如果需要字符串,则需要使用.apply
https://www.pulumi.com/docs/intro/concepts/inputs-outputs/#apply
若要访问输出的原始值并将该值转换为新值,请使用
。此方法接受一个回调,一旦该值可用,该回调将与原始值一起调用。
您可以通过迭代列表并对print输出值调用apply方法来实现这些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
如果您有多个输出并且需要加入它们,那么all函数的作用就像在许多资源上应用一样。该函数连接整个输出列表。它等待它们全部可用,然后将它们提供给所提供的回调。
希望这能帮上忙!
https://stackoverflow.com/questions/71888481
复制相似问题