terraform - 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 {
# 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
}
推荐阅读
- excel - 按数字排序范围(包含数字和字符串)
- mysql - 以相反的顺序将列添加到查询中
- javascript - 无法使用 Jasmine 和 Karma 测试 Angular http 服务
- javascript - 几秒钟后JavaScript清除setTimeout
- dns - WSL 解析器需要在内部和外部进行解析
- c++ - 通过引用或值捕获句柄到类模板ctor
- c++ - 委托工厂函数调用 - 找不到正确的语法
- unit-testing - 向 Clojure CLI 工具和 deps.edn 添加单元测试
- sql-server - kafka JDBC Sink Connector 是否跟踪加载到目标数据库的数据?
- sqlite - 使用 SQLite NOT %LIKE% 并返回所有行,即使值为 NULL