Azure:Terraform创建服务主体并在提供程序中使用该主体

时间:2018-12-31 22:36:24

标签: azure terraform

我已经在线阅读了文章,但他们似乎并未完全涵盖该主题,并希望完成此任务的人可以为我提供一些指导。 我们正在建立一个复杂的Terraform模板,以满足与SaaS产品有关的IaC要求。为此,我们希望模板在启动时使用用户的凭据在Azure AD中创建新的服务主体(这部分我没有问题)。然后,在模板的下一部分中,我们使用该服务主体作为提供者。问题在于,由于服务主体不存在(由于服务提供者部分尚未运行,因此id不存在),它在计划/应用中引发错误。 那么有没有办法我可以做到这一点?创建服务主体,然后在使用该服务主体的提供者别名中使用它,而无需将其拆分为多个模板?

最后,我希望此模板使用本地用户的权限或MSI创建服务提供商,将其RBAC授予订阅,然后使用该服务提供商在该订阅中创建资产。

main.ts(根)

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 :(得分:0)

对于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"
}

希望这会对您有所帮助。

答案 1 :(得分:0)

当前没有可用于非hack(null_reference)模块的有效“ depends_on”。这意味着,如果您要将模板分为多个模块(关注点分开),则需要正确的操作顺序才能成功完成此操作,因为一个模块将不知道服务提供商的数据源必须等待上一个模块来完成。我不得不将其分为2个单独的模板,其中第一个创建服务主体,第二个具有模块化的分隔,然后可以使用azurerm_azuread_service_principal的数据源。 一旦Hashicorp可以实现模块depends_on,这将变得更加容易。