Terraform:如何处理可选输入变量



所以我遇到了这个一般性问题,但还没有找到答案。

问题:输入值可以有可选的变量,就像下面的情况一样,group_memberships是一个可选的输入,目前我将其设为空字符串输入以使其工作
但如果我像下面这样评论并运行它,我会得到错误:

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

基本上是在抱怨我没有list_of_users.test_user.group_memberships。有没有办法告诉terraform,如果输入没有声明,就忽略它?我知道我可以让它保持原样,但用户可能有很多可选值,并且进行大量的空输入实际上没有意义。

谢谢!第一个帖子问题,很抱歉代码布局不好:(

在我的.tfwars文件中:

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 {
# 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
}

从Terraform v1.3开始,可选对象类型属性功能是官方的,这意味着它不再是一个实验,语法被认为是稳定的。

如前所述,您现在可以执行以下操作:

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

在上面的例子中,使用默认值(""(可以让项目/模块中的Terraform代码发挥作用,就好像总是有一个值一样,即使它从输入变量中被省略了。

最新更新