代码之家  ›  专栏  ›  技术社区  ›  Basil Musa

地形条件属性

  •  3
  • Basil Musa  · 技术社区  · 6 年前

    地形是否支持条件属性?我只想根据变量的值使用属性。

    例子:

    resource "aws_ebs_volume" "my_volume" {
      availability_zone = "xyz"
      size              = 30
    
      if ${var.staging_mode} == true:
        snapshot_id = "a_specific_snapshot_id"
      endif
    }
    

    以上 if 包含属性的语句 snapshot_id 是我要找的。TerraForm是否支持基于变量值的此类属性包含?

    2 回复  |  直到 6 年前
        1
  •  3
  •   ydaetskcoR    6 年前

    地形0.12(尚未发布)也将带来 support for HCL2 它允许您使用可以为空的参数,如下所示:

    resource "aws_ebs_volume" "my_volume" {
      availability_zone = "xyz"
      size              = 30
      snapshot_id       = "staging_mode ? a_specific_snapshot_id : null"
    }
    

    可空参数包含在 this 0.12 preview guide .

    现在,0.12之前, Markus answer 可能是你最好的选择,尽管我会更明确地告诉你 count 就这样:

    resource "aws_ebs_volume" "staging_volume" {
       count=${var.staging_mode ? 1 : 0}
       availability_zone = "xyz"
       size = 30
    
       snapshot_id = "a_specific_snapshot_id"
    }
    
    resource "aws_ebs_volume" "non_staging_volume" {
       count=${var.staging_mode ? 0 : 1}
       availability_zone = "xyz"
       size = 30
    }
    

    请注意,资源名称必须是唯一的,否则TerraForm将投诉。如果需要参考EBS卷,例如 aws_volume_attachment 如在 pre 0.12 the ternary expression is not lazy 所以像这样的事情是行不通的:

    resource "aws_volume_attachment" "ebs_att" {
      device_name = "/dev/sdh"
      volume_id   = "${var.staging_mode ? aws_ebs_volume.staging_volume.id : aws_ebs_volume.non_staging_volume.id}"
      instance_id = "${aws_instance.web.id}"
    }
    

    因为它将尝试对三元的两边进行评估,其中在任何点上只有一个是有效的。在TerraForm 0.12中,情况将不再是这样,但显然您可以使用可以为空的参数更容易地解决它。

        2
  •  4
  •   Markus    6 年前

    我不知道这样一个特性,但是,如果您的案例不太复杂,您可以围绕这个建模。因为布尔值 true false 被认为是 1 0 ,您可以在计数内使用它们。所以你可以使用

    provider "null" {}
    
    resource "null_resource" "test1" {
       count= ${var.condition ? 1 : 0}
    }
    resource "null_resource" "test2" {
       count = ${var.condition ? 0 : 1}
    }
    
    output "out" {
        value = "${var.condition ? join(",",null_resource.test1.*.id) : join(",",null_resource.test2.*.id) }"
    }
    

    由于 count 属性。

    你必须使用 join 对于价值观,因为这似乎能优雅地处理两个价值观中的一个的不存在。

    谢谢 ydaetskcor 用于指出 their answer 变量处理的改进。