Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 将模块中的值映射到每个输出_Terraform_Openstack - Fatal编程技术网

Terraform 将模块中的值映射到每个输出

Terraform 将模块中的值映射到每个输出,terraform,openstack,Terraform,Openstack,我有一个模块,可以为一个名称列表创建多个资源。因此,对于名为instances的变量中提供的每个名称,将创建一组资源(vm、端口、卷)。 在该模块的输出中,我希望有一个映射,它将实例(instances实例中的每个值)映射到相关端口的IP 这是端口的定义 resource "openstack_networking_port_v2" "this" { for_each = var.instances name = &q

我有一个模块,可以为一个名称列表创建多个资源。因此,对于名为
instances
的变量中提供的每个名称,将创建一组资源(vm、端口、卷)。
在该模块的输出中,我希望有一个映射,它将实例(instances实例中的每个值)映射到相关端口的IP

这是端口的定义

resource "openstack_networking_port_v2" "this" {
  for_each = var.instances

  name               = "port-${each.key}"
  network_id         = var.network_id
  admin_state_up     = true
  security_group_ids = var.security_group_ids
  fixed_ip {
    subnet_id = var.subnet_id
  }
}
直到现在,我在模块的输出中都有这个

output "int-port" {
  value     = openstack_networking_port_v2.this
}
这就是我使用它的地方

int-ip : module.my-instance.int-port["${var.deployment}-my-01"].all_fixed_ips[0]
升级terraform后,我需要将
sensitive=true
添加到输出中,因为openstack提供程序已将某些内容标记为敏感,这将导致输出无法打印。(我知道我可以通过
terraform输出-json
)获得它
所以我只想在输出中返回我需要的IP,而不是整个对象,但我不知道如何返回

我试过以下方法:

output "int-ip" {
  value = openstack_networking_port_v2.this.*.all_fixed_ips[0]
}

这让我

│ Error: Unsupported attribute
│
│   on ../../modules/ext-instance-v2/outputs.tf line 24, in output "int-port":
│   24:   value = openstack_networking_port_v2.this.*.all_fixed_ips[0]
│
│ This object does not have an attribute named "all_fixed_ips".
我也试过了

output "int-ip" {
  value = {
    for instance in var.instances:
    instance => openstack_networking_port_v2.this["${instance}"].all_fixed_ips[0]
  }
}

这导致了这个错误

│ Error: Invalid index
│ 
│   on ../../modules/ext-instance-v2/outputs.tf line 19, in output "int-ip":
│   19:     instance => openstack_networking_port_v2.this["${instance}"].all_fixed_ips[0]
│     ├────────────────
│     │ openstack_networking_port_v2.this is object with 9 attributes
│ 
│ The given key does not identify an element in this collection value.
感觉我离得很近,但就是够不着。

我不仅对解决方案感兴趣,而且对我尝试的事情没有成功的原因也感兴趣。

由于您的
openstack\u networking\u port\u v2。这是映射,因为
对于每个
,它应该是:

output "int-ip" {
  value = values(openstack_networking_port_v2.this)[*].all_fixed_ips[0]
}
更新

根据评论。最后一次尝试的正确方法是:

output "int-ip" {
  value = {
    for instance in keys(var.instances):
      instance => openstack_networking_port_v2.this[instance].all_fixed_ips[0]
  }
}

这是必需的,因为
实例
是一个映射,但您需要一个列表。在这种情况下,您希望使用for each中的键列表。

操作符()仅用于生成列表。文件说明了以下内容:

上面显示的splat表达式模式仅适用于列表、集合和元组。若要使用贴图或对象值获得类似的结果,必须使用

为每个
参数使用
的资源将以对象映射的形式出现在表达式中,因此不能对这些资源使用splat表达式。有关详细信息,请参阅

带有
for
表达式的最简单版本如下:

output "int-ip" {
  value = {
    for k, port in openstack_networking_port_v2.this : k => port.all_fixed_ips[0]
  }
}
这意味着构建一个新的映射,其中
openstack\u networking\u port\u v2的每个元素都被转换成一个元素,该元素具有相同的键,但只有第一个IP地址作为值

我上面的例子与您问题中的例子有一个重要区别,那就是
for
子句有两个符号:
k,port
。这意味着将每个元素的键放在
k
中,并将每个元素的值放在
端口中。如果您只编写一个符号,比如端口的
,那么Terraform将把它绑定到每个元素的值,而不是键,并且没有简单的方法来找到与特定值对应的键,只找到与键对应的值

原则上也可以使用重复键,然后使用键查找元素:

output "int-ip" {
  value = {
    for k in keys(openstack_networking_port_v2.this) : k => openstack_networking_port_v2.this[k].all_fixed_ips[0]
  }
}

这相当于我在上面展示的
表达式的另一个
,但由于需要引用
openstack\u networking\u port\u v2,因此更为详细。这
两次。因此,对于
,我更喜欢使用两个符号
,尤其是在这样的情况下,当映射的表达式中包含大量字符时。

如何使用此符号访问特定实例的值?@toydarian不确定要执行什么操作。我的回答解决了您不正确使用此映射的问题。
value=openstack\u networking\u port\u v2。此。*.all\u fixed\u ips[0]
。我实际上想获得一个映射,将实例映射到已分配给它的固定ip。@toydarian如果您在问题中提供的代码实际上是您的代码,那么最后一次尝试使用var.instances:
中的
实例是正确的。但错误消息表明,您可能使用的代码与您在SO上演示的代码不同。错误与SO上的代码不匹配。它几乎是正确的。现在它点击了,我需要
键(var.instances)
,然后它就正确了。
output "int-ip" {
  value = {
    for k, port in openstack_networking_port_v2.this : k => port.all_fixed_ips[0]
  }
}
output "int-ip" {
  value = {
    for k in keys(openstack_networking_port_v2.this) : k => openstack_networking_port_v2.this[k].all_fixed_ips[0]
  }
}