terraform - 如何在属性中使用变量

阿里夫

我不确定这是否是正确的方法,但我想使用变量作为属性。

例如,我有一个根据用户输入而变化的变量:os_name = ubuntu.

我想像下面这样使用这个变量名,

resource "aws_instance" "workerNode" {
  ..................
  ami = data.aws_ami.${var.os_name}.image_id
  ..................
}

以下是数据块的示例,

data "aws_ami" "suse" {
    count  = "${var.os_name == "suse" ? 1 : 0}"
    owners = ["amazon"]
    most_recent = true
    filter {
        name = "name"
        values = ["suse-sles-${var.os_version}-sp*-v????????-hvm-ssd-x86_64"]
    }
}    

结果如下,

  "architecture" = "x86_64"
  "hypervisor" = "xen"
  "id" = "ami-0d3905203a039e3b0"
  "image_id" = "ami-0d3905203a039e3b0"

但是 terraform 不允许我这样做。有什么办法可以做到这一点,或者我必须改变工作流程?

马丁·阿特金斯

在不适合在单个资源 using 下收集所有实例的情况下for_each(这会隐式地使该资源显示为对象映射),您可以通过编写本地值表达式来构建等效映射来显式获得类似的结果

locals {
  amis = {
    suse   = data.aws_ami.suse
    ubuntu = data.aws_ami.ubuntu
  }
}

然后您可以参考local.amis["ubuntu"]local.amis["suse"](如果需要,可以用变量替换元素键。


话虽如此,对于您的案例,似乎有一种可能的不同方法,只需一个data块即可到达那里

locals {
  os_ami_queries = {
    suse = {
      owners = ["amazon"]
      filters = {
        name = ["suse-sles-${var.os_version}-sp*-v????????-hvm-ssd-x86_64"]
      }
    }
    ubuntu = {
      owners = ["amazon"]
      filters = {
        name = ["ubuntu-${var.os_version}-something-something"]
      }
    }
  }
  ami_query = local.os_ami_queries[var.os_name]
}

data "aws_ami" "selected" {
  owners = local.ami_query.owners

  dynamic "filter" {
    for_each = local.ami_query.filters
    content {
      name   = filter.key
      values = filter.value
    }
  }
}

这种不同的排列查找之前进行操作系统选择data "aws_ami",因此它可以使用与调用者选择的任何操作系统相关联的设置。然后 AMI id 将在data.aws_ami.selected.id.

话虽如此,这种方法的缺点是非常间接和使用dynamic块,所以我会权衡替代方案的可读性,选择一种对于不熟悉这种配置的人来说主观上最容易遵循的方法. 对此没有唯一的答案,因为在某种程度上这是一个品味问题,所以如果你在团队环境中工作,这可能是与同事讨论的事情,看看哪种方法最适合权衡,比如你期望的频率添加和删​​除支持的操作系统与更改结果使用方式的详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章