首页 > 解决方案 > Terraform:如何处理可选输入变量

问题描述

所以我遇到了这个普遍的问题,还没有找到答案。

问题:输入值可以有可选变量,如下例所示,group_memberships是可选输入,目前我将其设为空字符串输入以使其工作。
但是,如果我如下所示将其注释掉并运行它,我会收到错误消息:

The given key does not identify an element in this collection value.

基本上它抱怨我没有list_of_users.test_user.group_memberships。如果输入没有被声明,有没有办法告诉 terraform,只是忽略它?我知道我可以保持原样,但用户可能有许多可选值,并且制作大量空输入并没有真正意义。

谢谢!第一个帖子问题,对于代码布局不佳感到抱歉:)

在我的 .tfvars 文件中:

  list_of_users = {
  regular_user = {
    email = "pdv@abc.com",
    group_memberships = "regular_group"
  },
  test_user = {
    email = "test@abc.com",
//    group_memberships = ""    <------ Currently can work if not comment out, looking for solution that I can remove those reduent empty declariation
  },
  admin_user = {
    email = "admin@abc.com",
    group_memberships = "admin_group"
  }
}

在 .tf 文件中:

variable "list_of_users" {}
resource "user_api_from_provider" "user_generate" {
  for_each = var.list_of_users
    email = each.value["email"]
    group_memberships = each.value["group_memberships"] !=""? [user_api_from_provider.group_generate[each.value["group_memberships"]].id] : null
}

标签: terraform

解决方案


作为Terraform 的“实验” ,对此有支持(它已实现,但在未来的版本中可能会更改或删除)。你必须在你的模块中声明你正在使用这个实验:

terraform {
  # Optional attributes and the defaults function are
  # both experimental, so we must opt in to the experiment.
  experiments = [module_variable_optional_attrs]
}

然后你会像这样在你的情况下使用它:

variable "list_of_users" {
  type = map(object({
    email = string
    group_memberships = optional(string)
  }))
}

现在,如果group_membership未为给定用户定义,则该字段的值为null,因此您现在可以执行以下操作:

resource "user_api_from_provider" "user_generate" {
  ...
  group_memberships = each.value.group_memberships != null ? [user_api_from_provider.group_generate[each.value["group_memberships"]].id] : null
}

或者,如果您不想使用该实验,您应该可以这样做(未经测试):

resource "user_api_from_provider" "user_generate" {
  ...
  group_memberships = contains(each.value, "group_memberships") ? [user_api_from_provider.group_generate[each.value["group_memberships"]].id] : null
}

推荐阅读