Как автоматизировать Terraform, учитывая необходимость добавления переменных вручную?
Вариант использования, над которым я работаю, использует Jira для сбора информации о пользователях, а именно: имя пользователя и команда github, в которую должен быть добавлен пользователь.
а затем запускает сценарии Terraform, чтобы добавить этого пользователя в команды GitHub, как указано. Хотя это работает так, как ожидалось, поскольку я использую одно объявление ресурса, которое проходит через массив пользователей и их роли, например:
###
# Resource to define each user's membership in the org
###
resource "github_membership" "github_member" {
for_each = var.github_memberships
username = each.value.username
role = each.value.role
}
###
# Resource to define each team in the org
###
resource "github_team" "team" {
for_each = toset(var.github_teams)
name = each.value
lifecycle {
ignore_changes = [description, privacy]
}
}
###
# Resource to define a user's membership in a team
###
resource "github_team_membership" "team_membership" {
for_each = [some unique value i create using locals]
team_id = github_team.team[each.value["team_name"]].id
username = github_membership.github_member[each.value["username"]].username
role = each.value["role"]
}
мне нужно поддерживать список таких переменных:
##
# Membership here refers to simply belonging to GitHub as part of org, not any team
###
variable "github_memberships" {
type = map(object({username: string, role: string}))
default = {
"username_1" = {
username = "username_1",
role = "member"
},
"username_2" = {
username = "username_2",
role = "member"
},
"username_3" = {
username = "username_3",
role = "member"
},
"username_4" = {
username = "username_4",
role = "member"
}
}
}
###
# List of teams in the org
###
variable "github_teams" {
type = list(string)
default = ["test_team"]
}
variable "github_team_memberships" {
type = map(object({members: list(object({username: string, role: string}))}))
default = {
"test_team" = {
members = [{username = "username_1", role = "maintainer"}, {username = "username_2", role = "member"}]
}
}
}
теперь, если добавить нового пользователя в test_team:
module "GitHubAccessRequest" {
source = "./child_modules/GitHub_Team_Assigner_Child"
requested_username = "username_3"
requested_teams = ["test_team"]
requested_role = "member"
}
TF добавит username_3, но в следующий раз, когда мы будем использовать username_4, поскольку username_3 не был добавлен в переменную github_team_memberships вручную, например, username_1 и username_2, TF попытается удалить username_3 и добавить username_4.
Значит ли это, что нет возможности автоматизировать этот процесс? Каждый раз, когда отправляется тикет и запускается TF, разработчику необходимо вручную обновить эту переменную github_team_memberships, чтобы отслеживать? Это можно сделать с небольшими командами, но для больших организаций это может стать довольно громоздким.
2 ответа
Я согласен с ответом @Quentin Revel.
Единственный способ автоматизировать саму Terraform — это написать программу, которая выполняла бы ручное написание, которое пришлось бы делать вам.
По моему опыту, в большинстве компаний есть специальные инженеры (или команды), поддерживающие IaC во всех аспектах. Действительно, terraform лучше всего подходит для создания статических или универсальных ресурсов в качестве одноразовых, он ни в коем случае не динамичен.
Попробуйте какую-нибудь логику Python/Shell/PowerShell, которая может автоматизировать сам процесс.
Terraform — это декларативный язык, который сохраняет статические объекты в состоянии.
Следовательно, это не совсем подходит для случаев использования, когда нужно отменить одноразовое применение для создания новых ресурсов. Код всегда должен отражать то, чем управляет Terraform.
В настоящее время есть несколько решений для обхода этого:
Уменьшить масштаб Terraform
Используйте Terraform только для статических ресурсов (например, только GitHub Teams). Все, что является динамическим (членство в команде), управляется с помощью небольшого инструмента, напрямую использующего GitHub API. При создании заявки инструмент запускается программно, чтобы добавить или удалить членство в команде.
Его преимущество заключается в автоматизации процесса при удалении Terraform как промежуточного инструмента между созданием заявки и назначением членства в команде.
Генерировать код Terraform автоматически
Запрограммируйте инструмент, который обновит код Terraform в соответствии с запросом заявки, а затем запустите код Terraform.
Плюсы в том, что для простого варианта использования его можно реализовать в стратегии быстрого выигрыша с помощью небольшого сценария.
Использовать Terraform CDK
Несмотря на то, что он довольно молод и не продается как готовый к работе инструмент (как Terraform задолго до достижения версии 1.0), Terraform CDK может быть тем, что лучше всего отвечает этим потребностям в долгосрочной перспективе.
Короче говоря (перефразируя их README), он позволяет программно определять конструкции Terraform без написания самих файлов Terraform. Думайте об этом как о SDK для файлов Terraform.