Azure: Terraform создает участника службы и использует его в поставщике - PullRequest
0 голосов
/ 01 января 2019

Я прочитал статьи в Интернете, но они, кажется, не охватывают эту тему полностью и надеются, что кто-то, кто сделал это, может иметь какое-то направление для меня.Мы настраиваем сложный шаблон Terraform, чтобы удовлетворить наши требования IaC, касающиеся нашего предложения SaaS.При этом мы хотим, чтобы шаблон использовал учетные данные пользователя при запуске, чтобы создать нового участника службы в Azure AD (в этой части у меня нет проблем).Затем в следующей части шаблона мы используем этого участника службы в качестве поставщика.Проблема заключается в том, что он выдает ошибки в плане / применении, потому что субъект службы не существует (он также не существует, так как раздел поставщика услуг еще не запущен).Так есть ли способ, которым я могу это сделать?Создать субъект службы и затем использовать его в псевдониме поставщика, который использует этот субъект службы, не разбивая его на несколько шаблонов?

В конце я хочу, чтобы этот шаблон создал поставщика услуг с использованием разрешений локального пользователя или MSI,назначьте ей подписку RBAC, а затем используйте этого поставщика услуг для создания активов в этой подписке.

main.ts (root)

provider "azurerm" {
    alias               = "ActiveDirectory"
    subscription_id     = "${var.subscriptionNucleus}"
}

provider "azurerm" {
    alias               = "Infrastructure"
    subscription_id     = "${var.subscriptionInfrastructure}"
}
module "activedirectory" {
    providers                       = { azurerm = "azurerm.ActiveDirectory" 
}
    source                          = "./modules/activedirectory"
    subscription_id_infrastructure  = "${var.subscriptionInfrastructure}"
}
module "infrastructure" {
    providers                   = { azurerm = "azurerm.Infrastructure"}
    source                      = "./modules/infrastructure"
    location                    = "${var.location}"
    application_id              = 
 "${module.activedirectory.service_principal_application_id}"
    subscription_id             = "${var.subscriptionInfrastructure}"
    prefix                      = "${var.prefix}"
}

main.ts (./modules/infrastructure)

data "azurerm_azuread_service_principal" "serviceprincipal" {
    application_id = "${var.application_id}"
}

provider "azurerm" {
    alias           = "InfrastructureSP"
    subscription_id = "${var.subscription_id}"
    client_id       = "${var.application_id}"
    client_secret   = "secret"
    tenant_id       = 
"${data.azurerm_client_config.clientconfig.tenant_id}"  
}

Ответы [ 2 ]

0 голосов
/ 03 января 2019

В настоящее время не существует работающего "depen_on", который работает с модулями, которые не являются хаком (null_reference).Это означает, что если вы разбиваете свой шаблон на модули (разделяя проблемы), ваш порядок работы должен быть правильным, чтобы завершить это успешно, поскольку один модуль не будет знать, что источник данных поставщика услуг должен ждать завершения предыдущего модуля.,Мне пришлось разбить это на 2 отдельных шаблона, где первый создает принципала службы, а второй имеет модульное разделение, которое затем может использовать источник данных azurerm_azuread_service_principal.Как только Hashicorp сможет реализовать модуль зависящий_он, это станет проще.

0 голосов
/ 01 января 2019

Для субъекта службы Azure существует два способа использования субъекта службы.

Первый: Если у вас уже есть субъект службы и вы хотите использовать его в Terraform.Вы можете использовать данные Terraform и тестирование следующим образом:

data "azurerm_azuread_service_principal" "sp" {
        application_id  = "21f3e1de-54e2-4951-9743-c280ad7bd74a"
}

output "test" {
        value = "${data.azurerm_azuread_service_principal.sp.id}"
}

Снимок экрана с результатом представлен здесь:

enter image description here

Второй: У вас нет субъекта службы, и вы можете просто создать субъекта службы в Terraform следующим образом:

resource "azurerm_azuread_service_principal" "test" {
  application_id = "${azurerm_azuread_application.test.application_id}"
}

resource "azurerm_azuread_service_principal_password" "test" {
  service_principal_id = "${azurerm_azuread_service_principal.test.id}"
  value                = "your pasword"
  end_date             = "2020-01-01T01:02:03Z" 
}

Тогда , нетНезависимо от того, какой путь вы выберете, есть важный шаг, который вы должны сделать для большинства ресурсов.Шаг заключается в том, что вам нужно создать роль, чтобы дать разрешение, а затем назначить ее нужному ресурсу.Вы можете сделать это следующим образом:

resource "azurerm_role_assignment" "test" {
  scope              = "yourScope"   # the resource id
  role_definition_id = "the Role In need" # such as "Contributor"
  principal_id       = "your service principal id"
}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...