首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果terraform中不存在键,如何跳过for_each循环

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

Stack Overflow用户
提问于 2022-05-13 18:06:42
回答 1查看 1.6K关注 0票数 3

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

我有用户列表为locals

代码语言:javascript
复制
// 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、监控工具等。

现在,对于属于DevDevOps团队的2名用户来说,他们需要访问Github,而产品用户只需要访问某些仪表板,而不需要访问Github,因此标签就缺失了。

我如何在terraform资源github_membership上循环以跳过这个产品用户(或者仅仅是没有标记key GitHub的任何人)?

我正在尝试下面的代码,但没有成功

代码语言:javascript
复制
// Send GitHub invite
resource "github_membership" "xyzTeam" {
  for_each = local.allUsers
  username = each.value.GitHub
  role     = "member"
}

错误:

代码语言:javascript
复制
╷
│ 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".

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

  1. 为每个人设置了GitHub key,但它是value as null。错误:

代码语言:javascript
复制
╷
│ 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" {
│
╵

如果值为空,则为

代码语言:javascript
复制
Error: PATCH https://api.github.com/user/memberships/orgs/XYZ: 422 You can only update an organization membership's state to 'active'. []

  1. for k, v in local.allUsers : k => v if v != ""相同的错误,因为它仍然试图创建具有空值的用户,并最终失败。

我想不出还有什么别的了。如果有人可以帮助创建独立于现有localslocals,这将创建grep GitHub值的locals列表,那么黑客将非常有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-13 18:27:15

您在第三次尝试中有了正确的想法,但是for表达式中的条件逻辑略有偏离。您需要使用can函数来代替:

代码语言:javascript
复制
{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72233803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档