如果 terraform 中不存在键,如何跳过 for_each 循环

Alo*_*ath 5 terraform terraform-provider-github

我的问题陈述很简单,但我无法在互联网上的任何地方找到解决方案。

\n

我的用户列表如下locals

\n
// users\n\nlocals {\n  allUsers = {\n\n    dev_user_1 = {\n      Name   = "user1"\n      Email  = "user1@abc.com"\n      GitHub = "user1" # github username\n      Team   = "Dev"\n    }\n\n    devops_user_2 = {\n      Name   = "user2"\n      Email  = "user2@abc.com"\n      GitHub = "user2" # github username\n      Team   = "DevOps"\n    }\n\n    product_user_3 = {\n      Name   = "user3"\n      Email  = "user3@abc.com"\n      Team   = "Product"\n    }\n  }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

这些local标签用于创建对内部工具(例如 Github、监控工具等)的访问。

\n

现在,对于属于DevDevOps团队的 2 个用户,他们需要访问 Github ORG,而产品用户只需要访问一些仪表板,但不需要访问 Github,因此,标签丢失。

\n

我如何循环 terraform 资源github_membership以跳过此产品用户(或只是任何没有标签keyGitHub 的人?)

\n

我正在尝试以下代码,但没有运气

\n
// Send GitHub invite\nresource "github_membership" "xyzTeam" {\n  for_each = local.allUsers\n  username = each.value.GitHub\n  role     = "member"\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

错误:

\n
\xe2\x95\xb7\n\xe2\x94\x82 Error: Unsupported attribute\n\xe2\x94\x82\n\xe2\x94\x82   on users.tf line 12, in resource "github_membership" "xyzTeam":\n\xe2\x94\x82   12:   username = each.value.GitHub\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82     \xe2\x94\x82 each.value is object with 3 attributes\n\xe2\x94\x82\n\xe2\x94\x82 This object does not have an attribute named "GitHub".\n
Run Code Online (Sandbox Code Playgroud)\n

我做了什么来解决这个问题?

\n
    \n
  1. 为所有人设置 GitHub key,但它value就像null。\n错误:
  2. \n
\n
\xe2\x95\xb7\n\xe2\x94\x82 Error: "username": required field is not set\n\xe2\x94\x82\n\xe2\x94\x82   with github_membership.xyzTeam["user3"],\n\xe2\x94\x82   on users.tf line 10, in resource "github_membership" "xyzTeam":\n\xe2\x94\x82   10: resource "github_membership" "devops" {\n\xe2\x94\x82\n\xe2\x95\xb5\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 如果我将该值留空,则会出现错误:
  2. \n
\n
Error: PATCH https://api.github.com/user/memberships/orgs/XYZ: 422 You can only update an organization membership\'s state to \'active\'. []\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. for k, v in local.allUsers : k => v if v != ""\n同样的错误,因为它仍然尝试创建具有空值的用户,并最终失败。
  2. \n
\n

我想不出别的什么了。如果有人可以帮助创建locals与这些现有的分离的,这会创建该 grep值locals的列表,那么该 hack 将非常有帮助。localsGitHub

\n

Mat*_*ard 6

您的第三次尝试的想法是正确的,但 for 表达式中的条件逻辑略有偏差。您需要改用该can函数:

{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }
Run Code Online (Sandbox Code Playgroud)

如果嵌套映射包含Github键,则can(attributes.Github)返回true,并且映射构造函数将包含键值对。Github使用此算法,您可以从旧映射构造一个新映射,并删除嵌套映射值中不包含键的条目。