在 Terraform 中使用 `execute` 插值声明一个变量

declare a variable using `execute` Interpolation in Terraform

我想将一个变量的子字符串声明为另一个变量。我测试了使用 terraform 控制台获取子字符串。

1
2
> echo 'element(split (".","10.250.3.0/24"), 2)' | terraform console
> 3

我的子网是 10.250.3.0/24,我希望我的虚拟机在这个子网掩码 10.250.3.6 内获得私有 IP 地址。我希望通过查看子网地址来自动分配它。我试过的;

test.tf

1
2
3
4
5
6
7
8
9
10
variable subnet {
  type ="string"
  default ="10.250.3.0/24"
  description ="subnet mask myTestVM will live"
}

variable myTestVM_subnet {
  type ="string"
  default ="10.250." ${element(split(".", var.trusted_zone_onpremises_subnet), 2)}".6"
}

然后我通过

对其进行测试

1
2
terraform console
>Failed to load root config module: Error parsing /home/anum/test/test.tf: At 9:25: illegal char

我猜这只是简单的语法问题。但不知道是什么!


如您所见,您无法在 Terraform 中插入变量的值。

但是,如果您想避免在任何地方重复自己,您可以插入局部变量并使用它们。

所以你可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
variable"subnet" {
  type ="string"
  default ="10.250.3.0/24"
  description ="subnet mask myTestVM will live"
}

locals {
  myTestVM_subnet ="10.250.${element(split(".", var.trusted_zone_onpremises_subnet), 2)}.6"
}

resource"aws_instance""instance" {
  ...
  private_ip ="${local.myTestVM_subnet}"
}

aws_instance 仅用于演示,可以是任何需要/获取 IP 地址的资源。

尽管您可以使用 cidrhost 函数在给定子网中生成主机地址,但在这个特定用例中作为一个更好的选择。

所以在你的情况下,你会得到这样的东西:

1
2
3
4
resource"aws_instance""instance" {
  ...
  private_ip ="${cidrhost(var.subnet, 6)}"
}

这将创建一个私有 IP 地址为 10.250.3.6 的 AWS 实例。然后,这可以更容易地创建整个系列的机器,这些机器通过使用 count 元参数来增加使用的 IP 地址。


Terraform 不允许在 default 中对变量进行插值声明。所以我得到了;

1
Error: variable"myTestVM_subnet": default may not contain interpolations

在敲了我的脑袋之后语法错误真的得到了修复,所以这就是 Terraform 喜欢的;

1
private_ip_address ="10.250.${element(split(".","${var.subnet}"), 2)}.5"