如果 terraform 中不存在密钥,如何跳过 for_each 循环
How to skip for_each loop if key does not exist in terraform
我的问题陈述很简单,但我无法在互联网上的任何地方找到解决方案。
我的用户列表为 locals
:
// users
locals {
allUsers = {
dev_user_1 = {
Name = "user1"
Email = "user1@abc.com"
GitHub = "user1" # github username
Team = "Dev"
}
devops_user_2 = {
Name = "user2"
Email = "user2@abc.com"
GitHub = "user2" # github username
Team = "DevOps"
}
product_user_3 = {
Name = "user3"
Email = "user3@abc.com"
Team = "Product"
}
}
}
这些 local
标签用于创建对 Github、监控工具等内部工具的访问权限
现在,对于属于 Dev
和 DevOps
团队的 2 个用户,他们需要访问 Github ORG,而产品用户只需要访问一些仪表板但不是 Github,因此缺少标签。
我如何遍历 terraform 资源 github_membership
以跳过此产品用户(或任何没有标签 key
GitHub 的人?)
我正在尝试以下代码,但没有成功
// Send GitHub invite
resource "github_membership" "xyzTeam" {
for_each = local.allUsers
username = each.value.GitHub
role = "member"
}
错误:
╷
│ Error: Unsupported attribute
│
│ on users.tf line 12, in resource "github_membership" "xyzTeam":
│ 12: username = each.value.GitHub
│ ├────────────────
│ │ each.value is object with 3 attributes
│
│ This object does not have an attribute named "GitHub".
我做了什么来解决这个问题?
- 为每个人设置 GitHub
key
但 value
为 null
。
错误:
╷
│ Error: "username": required field is not set
│
│ with github_membership.xyzTeam["user3"],
│ on users.tf line 10, in resource "github_membership" "xyzTeam":
│ 10: resource "github_membership" "devops" {
│
╵
- 如果我将值留空,错误:
Error: PATCH https://api.github.com/user/memberships/orgs/XYZ: 422 You can only update an organization membership's state to 'active'. []
for k, v in local.allUsers : k => v if v != ""
同样的错误,因为它仍然试图创建具有空值的用户,但最终失败了。
我想不出别的了。如果有人可以帮助从这些现有的 locals
中创建单独的 locals
,这会创建 locals
的列表,grep GitHub
值,那么 hack 将非常有帮助。
您第三次尝试的想法是正确的,但 for 表达式中的条件逻辑略有偏差。您需要改用 can
函数:
{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }
如果嵌套映射包含 Github
键,则 can(attributes.Github)
returns true
,映射构造函数将包含 key-value 对。使用此算法,您可以从旧地图构建新地图,并删除不包含嵌套地图值中的 Github
键的条目。
我的问题陈述很简单,但我无法在互联网上的任何地方找到解决方案。
我的用户列表为 locals
:
// users
locals {
allUsers = {
dev_user_1 = {
Name = "user1"
Email = "user1@abc.com"
GitHub = "user1" # github username
Team = "Dev"
}
devops_user_2 = {
Name = "user2"
Email = "user2@abc.com"
GitHub = "user2" # github username
Team = "DevOps"
}
product_user_3 = {
Name = "user3"
Email = "user3@abc.com"
Team = "Product"
}
}
}
这些 local
标签用于创建对 Github、监控工具等内部工具的访问权限
现在,对于属于 Dev
和 DevOps
团队的 2 个用户,他们需要访问 Github ORG,而产品用户只需要访问一些仪表板但不是 Github,因此缺少标签。
我如何遍历 terraform 资源 github_membership
以跳过此产品用户(或任何没有标签 key
GitHub 的人?)
我正在尝试以下代码,但没有成功
// Send GitHub invite
resource "github_membership" "xyzTeam" {
for_each = local.allUsers
username = each.value.GitHub
role = "member"
}
错误:
╷
│ Error: Unsupported attribute
│
│ on users.tf line 12, in resource "github_membership" "xyzTeam":
│ 12: username = each.value.GitHub
│ ├────────────────
│ │ each.value is object with 3 attributes
│
│ This object does not have an attribute named "GitHub".
我做了什么来解决这个问题?
- 为每个人设置 GitHub
key
但value
为null
。 错误:
╷
│ Error: "username": required field is not set
│
│ with github_membership.xyzTeam["user3"],
│ on users.tf line 10, in resource "github_membership" "xyzTeam":
│ 10: resource "github_membership" "devops" {
│
╵
- 如果我将值留空,错误:
Error: PATCH https://api.github.com/user/memberships/orgs/XYZ: 422 You can only update an organization membership's state to 'active'. []
for k, v in local.allUsers : k => v if v != ""
同样的错误,因为它仍然试图创建具有空值的用户,但最终失败了。
我想不出别的了。如果有人可以帮助从这些现有的 locals
中创建单独的 locals
,这会创建 locals
的列表,grep GitHub
值,那么 hack 将非常有帮助。
您第三次尝试的想法是正确的,但 for 表达式中的条件逻辑略有偏差。您需要改用 can
函数:
{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }
如果嵌套映射包含 Github
键,则 can(attributes.Github)
returns true
,映射构造函数将包含 key-value 对。使用此算法,您可以从旧地图构建新地图,并删除不包含嵌套地图值中的 Github
键的条目。