如何根据 4 个变量在 Terraform 变量中赋值

How assign a value in a Terraform variable based on 4 variables

您好,我需要根据 3 个 AWS SSM 参数的 3 个值从输入变量分配值,然后更新这 3 个 AWS SSM 参数中的 1 个的值。

这里我解释一个案例,为了更清楚: 我有一个输入变量 filename1 和 3 个局部变量

variable "filename1" {
  type = string
}

locals {
  path1     = "filevar1"
  path2     = "filevar2"
  path3     = "filevar3"
}

然后我得到了 3 个 AWS SSM 参数的值

data "aws_ssm_parameter" "variable1" {
  name = local.path1
}

data "aws_ssm_parameter" "variable2" {
  name = local.path2
}

data "aws_ssm_parameter" "variable3" {
  name = local.path3
}

如果变量 1 与其他 2 个变量不同,根据我得到的值,我应该将输入变量分配给变量 2。

根据一些研究,我认为我应该这样做 这个

locals {
file2 = "${data.aws_ssm_parameter.variable2.value}" == "${data.aws_ssm_parameter.variable3.value}" != "${data.aws_ssm_parameter.variable1.value}" ? "${data.aws_ssm_parameter.variable2.value}" : "${var.filename1}"

然后用这个更新 SSM 值

resource "aws_ssm_parameter" "variable2" {
  name      = local.path2
  type      = "String"
  value     = "${local.file2}"
  overwrite = true
}

这行不通,您是否有一些示例说明如何根据 3 个值为任何类型的变量赋值?

我有其他不同的条件,我只需要了解如何声明以便在其他条件下复制。

感谢您的帮助!!

在您的 file2 定义中,您编写了以下内容 sub-expression:

"${data.aws_ssm_parameter.variable2.value}" == "${data.aws_ssm_parameter.variable3.value}" != "${data.aws_ssm_parameter.variable1.value}"

==!= 运算符都是二元运算符(也就是说,它们只接受两个参数)并且都产生布尔结果。这意味着 Terraform 将首先评估第一个,然后将其结果与另一个进行比较。

"${data.aws_ssm_parameter.variable2.value}" == "${data.aws_ssm_parameter.variable3.value}"

如果两者相等,则结果为true。如果它们是 non-equal,结果将是 false

如果我们用这些结果代替原始表达式,我们得到:

true != "${data.aws_ssm_parameter.variable1.value}"
false != "${data.aws_ssm_parameter.variable1.value}"

这两个表达式总是 return false,因为在 Terraform 语言中布尔值永远不可能等于字符串值。

如果我对你的要求的理解正确,你想测试第一个是否等于其他的 both。这需要两个单独的测试,然后您可以使用 && 运算符将它们组合在一起,这意味着“和”:

(
  data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable2.value &&
  data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable3.value
)

上面的意思是:variable1和variable2不同 variable1和variable 3不同。换句话说,只有满足这两个条件,它才会产生true是真的。

现在我们可以将其与您在示例中显示的条件测试结合起来以获得完整的表达式:

(
  (
    data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable2.value &&
    data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable3.value
  ) ?
  data.aws_ssm_parameter.variable2.value :
  var.filename1
)

我将它包裹在多行中,以便更容易阅读表达式的不同部分,但这些换行符并不重要,因此您可以根据需要以不同方式布局。

鉴于此处条件的长度,我可能更愿意将其拆分为一个单独的本地值,然后将其作为条件的一部分进行引用:

locals {
  override_path = (
    data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable2.value &&
    data.aws_ssm_parameter.variable1.value != data.aws_ssm_parameter.variable3.value
  )
  file2 = (
    local.override_path ?
    data.aws_ssm_parameter.variable2.value :
    var.filename1
  )
}