Как добавить пользователей в группу в Terraform OCI
Мне нужно добавить существующий список пользователей для каждой группы в облаке Oracle (OCI), не могли бы вы помочь сделать это простым способом
пример:
iam_group = {
iamg1 = { group_name = "group_test", group_desc = "group test", user_list = ["test", "test1"] }
iamg2 = { group_name = "group_test", group_desc = "group test1", user_list = ["test", "test1"] }
}
Переменная:
variable "iam_group" {
type = map(object({
group_name = string
group_desc = string
user_list = list(string)
}))
}
Я могу создавать группы, как показано ниже
resource "oci_identity_group" "this" {
for_each = var.iam_group
compartment_id = var.tenancy_ocid
name = each.value.group_name
description = each.value.group_desc
}
Я не понимаю, как добавлять пользователей в группу в этом сценарии.
resource "oci_identity_user_group_membership" "test_user_group_membership" {
<logic here>
}
1 ответ
(Обширный отказ от ответственности - это не проверено, поэтому для работы может потребоваться некоторая настройка)
Я думаю, что основная трудность здесь в том, что Terraform имеет ограниченную поддержку сложных методов цикла. Поэтому вам нужен способ перебрать один объект.
Кроме того,
oci_identity_user_group_membership
ресурс принимает идентификаторы как ресурса, так и ресурса. Следовательно, прежде чем вы сможете попытаться связать пользователей с группами, вам необходимо сначала создать этих пользователей. Следовательно, похоже, что вам нужна переменная для отслеживания уникальной коллекции пользователей, которым может потребоваться предоставить доступ, чтобы вы могли создавать ресурсы. (В более сложном решении вы, вероятно, могли бы сгенерировать этот список из содержимого, но по одному шагу за раз :))
Переменная
iam_group_users
определены в
locals
раздел предназначен для создания такой структуры, как:
[
{ group_name = 'iamg1', user_name = 'test'}
{ group_name = 'iamg1', user_name = 'test1'}
{ group_name = 'iamg2', user_name = 'test'}
{ group_name = 'iamg2', user_name = 'test1'}
]
Итак, удар по фактическому решению:
(Обратите внимание, я поставил ваше
iam_group
имя переменной)
# Group Definitions
variable "iam_groups" {
default = {
iamg1 = { group_name = "group_test", group_desc = "group test", user_list = ["test", "test1"] }
iamg2 = { group_name = "group_test1", group_desc = "group test1", user_list = ["test", "test1"] }
}
}
# Unique User Definitions
variable "iam_users" {
default = {
test = {user_name = "test", user_desc = "user test"}
test1 = {user_name = "test1", user_desc = "user test1"}
}
}
locals {
# Create a list of maps, containing unique group name/user name combinations
iam_group_users = flatten([
for group, group_data in var.iam_groups : [
for user in group_data.user_list : {
group_name = group
user_name = user
}
]
])
}
# Iterate iam_groups, to create a collection of group resources
resource "oci_identity_group" "this" {
for_each = var.iam_groups
compartment_id = var.tenancy_ocid
name = each.value.group_name
description = each.value.group_desc
}
# Iterate iam_users, to create a colelction of user resources
resource "oci_identity_user" "this" {
for_each = var.iam_users
compartment_id = var.tenancy_ocid
name = each.value.user_name
description = each.value.user_desc
}
# Iterate the mapping of users that are members of each group to create the association
resource "oci_identity_user_group_membership" "test_user_group_membership" {
for_each = toset(local.iam_group_users)
group_id = oci_identity_group.this[each.value.group_name].id
user_id = oci_identity_user.this[each.value.user_name].id
}
Примечание:
each.value.group_name
&
each.value.user_name
относится к имени, которое Terraform связал с каждым экземпляром ресурсов, и берется из используемого в
for_each
заявления при создании
oci_identity_group
&
oci_identity_user
, соответственно. Кроме того, с учетом этого важно, чтобы
user_list
в вашей
iam_groups
var содержит имя ресурса (т. е.
key
в
iam_users
) для пользователя.
Некоторое дополнительное, возможно, полезное чтение: