我们通过 Jenkins 在我们的 Azure 租户中部署资源,Jenkins 使用 terraform 来提供基础设施资源。我们使用同一租户中的服务主体进行身份验证和基础设施配置。在我们的基础设施部署中,我们还创建了与部署的新 Vnet 和我们的中央 VNET 对等的 VNET,它拥有所有基础设施资源,如监控和日志记录平台。现在我们有一个用例,通过使用相同的 Jenkins 和 terraform 脚本,我们希望在不同的租户上配置资源。这可以通过使用远程租户的服务主体来完成。但现在的问题是服务主体TenantB
无权在TenantA
. 要做到这一点,服务主体TenantB
应该可以在 Vnet 上访问TenantA
. 我正在寻找文档或指导,我们如何才能访问我们的服务TenantB
主体TenantA
?
问问题
179 次
1 回答
2
- 希望您已经创建了一个服务主体,一个使用多租户身份验证的服务主体(如果是单租户,请将身份验证方法更改为多租户),添加一个重定向 uri
https://www.microsoft.com
。
创建服务主体后,您可以在专用浏览器中打开以下 url 以将其添加到另一个租户:
https://login.microsoftonline.com/<Tenant B ID>/oauth2/authorize?client_id=<Application (client in tenant A) ID>&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com%2F
它将代表组织请求授权,您可以接受。
完成上述操作后,您可以登录该租户的门户并转到企业应用程序,您将看到,为该订阅(所有者/贡献者)提供角色分配。
- 完成此操作后,您可以使用类似于以下 terraform 脚本的内容:
provider "azurerm" {
alias = "tenantA"
subscription_id = "b83c1ed3-xxxxx-xxxxxx-xxxxxx-xxxxxx" #subid for tenant A
tenant_id = "72f988bf-xxxxxx-xxxxx-xxxxxxx-xxxxxx"#tenantid of tenant A
client_id = "f6a2f33d-xxxx-xxxx-xxxxx-xxxxxxxx"#client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxx"#client secret of service principal in tenant A
auxiliary_tenant_ids = ["ab078f81-xxxxxx-xxxxxxxx-xxxxxx"]# tenant id of tenant B
features {}
}
provider "azurerm"{
alias = "tenantB"
subscription_id = "88073b30-xxx-xxxxx-xxxxx-xxxxxxx"#sub id of tenant B
tenant_id = "ab078f81-xxxxx-xxxxxxx-xxxxxxxxx" # tenant id of tenant B
client_id = "f6a2f33d-xxxx-xxxxxx-xxxxxx-xxxxxx" #client id of service principal in tenant A
client_secret = "y5L7Q~oiMOoGCxm7fK~xxxxxxxxxxxxxxxx" #client secret of service principal in tenant A
auxiliary_tenant_ids = ["72f988bf-xxxx-xxxxx-xxxxxxxxxx-xx"] # tenant id of tenant A
features {}
}
data "azurerm_resource_group" "tenantARG"{
provider = azurerm.tenantA
name = "reswourcegroup"
}
data "azurerm_resource_group" "tenantBRG"{
provider = azurerm.tenantB
name = "ansuman-resourcegroup"
}
data "azurerm_virtual_network" "GlobalVnet"{
provider = azurerm.tenantA
name = "ansuman-vnet"
resource_group_name= data.azurerm_resource_group.tenantARG.name
}
data "azurerm_virtual_network" "tenantBVnet"{
provider = azurerm.tenantB
name = "test-vnet"
resource_group_name= data.azurerm_resource_group.tenantBRG.name
}
resource "azurerm_virtual_network_peering" "example-1" {
provider= azurerm.tenantA
name = "peer1to2"
resource_group_name = data.azurerm_resource_group.tenantARG.name
virtual_network_name = data.azurerm_virtual_network.GlobalVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.tenantBVnet.id
}
resource "azurerm_virtual_network_peering" "example-2" {
provider = azurerm.tenantB
name = "peer2to1"
resource_group_name = data.azurerm_resource_group.tenantBRG.name
virtual_network_name = data.azurerm_virtual_network.tenantBVnet.name
remote_virtual_network_id = data.azurerm_virtual_network.GlobalVnet.id
}
输出:
注意:在我的测试用例中,我使用了存在于不同租户中的 2 个 vnet。我在租户 A 中创建了一个服务主体,并使用上述方法在租户 B 中为其提供了贡献者权限,然后使用 terraform 执行 vnet 对等互连。
于 2021-09-27T10:26:15.600 回答