在Terraform中使用'execute'插值声明变量

在Terraform中使用'execute'插值声明变量,terraform,Terraform,我想将一个变量的子字符串声明为另一个变量。我使用terraform控制台测试了一个子串 > echo 'element(split (".", "10.250.3.0/24"), 2)' | terraform console > 3 我的子网是10.250.3.0/24,我希望我的虚拟机在此子网掩码10.250.3.6中获取私有IP地址。我想通过查看子网地址来自动分配。我试过的 test.tf variable subnet { type = "string" defau

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

> echo 'element(split (".", "10.250.3.0/24"), 2)' | terraform console
> 3
我的子网是10.250.3.0/24,我希望我的虚拟机在此子网掩码10.250.3.6中获取私有IP地址。我想通过查看子网地址来自动分配。我试过的

test.tf

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"
}
然后我通过测试

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

我想这只是一个简单的语法问题。但我想不出是什么

Terraform不允许在
default
中插入变量声明。所以我得到了

Error: variable "myTestVM_subnet": default may not contain interpolations
语法错误真的在我的头上敲了一下之后得到了修复,所以这里是Terraform喜欢的

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

正如你所看到的,你不能在地形中插值变量的值

但是,如果您想避免在任何地方重复自己,您可以使用插值代替

所以你可以这样做:

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}"
}
resource "aws_instance" "instance" {
  ...
  private_ip = "${cidrhost(var.subnet, 6)}"
}
其中,
aws_实例
仅用于演示,可以是需要/获取IP地址的任何资源

作为此特定用例中的更好选项,您可以使用该函数在给定子网中生成主机地址

因此,在您的情况下,您将有如下内容:

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}"
}
resource "aws_instance" "instance" {
  ...
  private_ip = "${cidrhost(var.subnet, 6)}"
}
这将创建一个AWS实例,其私有IP地址为
10.250.3.6
。这样就可以更容易地创建一系列机器,通过使用
count
元参数来增加使用的IP地址