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

Anu*_*raz 1 terraform

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

> echo 'element(split (".", "10.250.3.0/24"), 2)' | terraform console
> 3
Run Code Online (Sandbox Code Playgroud)

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

测试文件

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"
}
Run Code Online (Sandbox Code Playgroud)

然后我通过测试

terraform console
>Failed to load root config module: Error parsing /home/anum/test/test.tf: At 9:25: illegal char
Run Code Online (Sandbox Code Playgroud)

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

yda*_*coR 5

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

但是,您可以对本地人进行插值,如果不想在任何地方重复自己的话,可以使用这些人。

因此,您可以执行以下操作:

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}"
}
Run Code Online (Sandbox Code Playgroud)

其中aws_instance只是用于演示,可以是需要/使用IP地址的任何资源。

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

因此,在您的情况下,您将改为以下内容:

resource "aws_instance" "instance" {
  ...
  private_ip = "${cidrhost(var.subnet, 6)}"
}
Run Code Online (Sandbox Code Playgroud)

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