我的问题陈述很简单,但我无法在网上任何地方找到解决方案。
我有用户列表为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,而产品用户只需要访问某些仪表板,而不需要访问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".我为解决这个问题做了什么?
key,但它是value as 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,这将创建grep GitHub值的locals列表,那么黑客将非常有用。
发布于 2022-05-13 18:27:15
您在第三次尝试中有了正确的想法,但是for表达式中的条件逻辑略有偏离。您需要使用can函数来代替:
{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }如果嵌套映射包含Github键,则can(attributes.Github)返回true,映射构造函数将包含键值对。使用此算法,您可以从旧映射中构造一个新的映射,其中删除的条目在嵌套映射值中不包含Github键。
https://stackoverflow.com/questions/72233803
复制相似问题