Моя формулировка проблемы проста, но я не могу найти решение нигде в Интернете.
У меня есть список пользователей как locals
:
// users
locals {
allUsers = {
dev_user_1 = {
Name = "user1"
Email = "[email protected]"
GitHub = "user1" # github username
Team = "Dev"
}
devops_user_2 = {
Name = "user2"
Email = "[email protected]"
GitHub = "user2" # github username
Team = "DevOps"
}
product_user_3 = {
Name = "user3"
Email = "[email protected]"
Team = "Product"
}
}
}
Это теги local
, которые используются для создания доступа к внутренним инструментам, таким как Github, инструменты мониторинга и т. д.
Теперь для двух пользователей, принадлежащих к командам Dev
и DevOps
, им нужен доступ к 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".
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
, этот хак был бы очень полезен.
У вас была правильная идея с вашей третьей попытки, но условная логика в выражении for немного неверна. Вместо этого вам нужно использовать функцию can
:
{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }
Если вложенная карта содержит ключ Github
, то can(attributes.Github)
возвращает true
, а конструктор карты будет содержать пару ключ-значение. С помощью этого алгоритма вы можете создать новую карту из старой карты с удаленными записями, которые не содержат ключа Github
во вложенном значении карты.
@AlokKelsey Я пропустил, что имя переменной было GitHub
вместо Github
. Я обновил h
на H
, и теперь он работает правильно. Возможно, в будущем вы захотите рассмотреть возможность использования стандартного футляра TF для змеи.
Извините, это моя ошибка. Я не знаю, что я делал не так, но теперь это сработало как шарм! Спасибо чувак.
Да, верно, это была опечатка. Мы прокомментировали одновременно.
Превосходно. Еще раз спасибо за то, что сэкономили мне много времени ??
for_each = { for k, v in local.allUsers : k => v if v.GitHub != null }
Это исправляет проблему 50%, но я все еще должен установить тегGitHub = null
. Было бы неплохо не настроить это и заставить это работать.