0

我正在执行一个 ARM 模板,该模板从 Azure 资源组部署任务创建 Azure Kubernetes 服务和其他资源。

我的 ARM 模板有一个参数servicePrincipalClientIdservicePrincipalClientSecret敏感数据,用于创建 Azure Kubernetes 集群,就在这里。(这个链接是我完整的ARM模板)

所以,我正在做的事情如下:

  • 我创建了servicePrincipalClientIdandservicePrincipalClientSecret作为管道变量

在此处输入图像描述

  • 我之前创建了服务主体及其数据servicePrincipalClientIdservicePrincipalClientSecret我使用它们来创建服务连接,以便以这种方式连接到 Azure 云:

在此处输入图像描述

  • 我有一个 PowerShell 任务以这种方式将servicePrincipalClientIdservicePrincipalClientSecret变量值转换为安全字符串:
$env:secretServicePrincipalClientId = ConvertTo-SecureString '$($env:servicePrincipalClientId)' -AsPlainText -Force

$env:secretServicePrincipalClientSecret = ConvertTo-SecureString '$($env:servicePrincipalClientSecret)' -AsPlainText -Force
  • 为了部署 ARM 模板中定义的资源,我创建了一个 Azure 资源组部署任务,其中包含以下选项:

  • 我正在使用创建的服务连接与我的订阅进行交互。

  • 要执行的操作:创建或更新资源组
  • Template,上面引用的 ARM 模板路径。

  • 覆盖模板参数 我在这里包含了所有 ARM 模板参数值,我想在这里强调我如何引用 servicePrincipalClientIdservicePrincipalClientSecret变量值的方式:

在我的第一个 azure devops 任务中,我在这里引用了我用来转换secretServicePrincipalClientId和变量值作为安全字符串的变量和变量secretServicePrincipalClientSecretservicePrincipalClientIdservicePrincipalClientSecret

-servicePrincipalClientId $($secretServicePrincipalClientId) 
-servicePrincipalClientSecret $($secretServicePrincipalClientSecret) 
   .
   .
-serviceCidr "100.0.0.0/16" 
-dnsServiceIP "100.0.0.10" 
-dockerBridgeCidr "172.17.0.1/16" 
   .
   .

所以,当我执行发布管道时,我在 Azure 资源组部署任务中得到了这个错误

2019-10-26T20:05:13.3246017Z The detected encoding for file 'd:\a\r1\a\Project\Deployments\ARMTemplates\Infrastructure\AzResourceGroupDeploymentApproach\testing.json' is 'utf-8'
2019-10-26T20:05:13.3410693Z Starting Deployment.
2019-10-26T20:05:13.3412081Z Deployment name is AzureDevOpsDeployment


2019-10-26T20:05:18.1729784Z There were errors in your deployment. Error code: InvalidTemplateDeployment.
2019-10-26T20:05:18.1730624Z ##[error]The template deployment 'AzureDevOpsDeployment' is not valid according to the validation procedure. The tracking id is 'xxxxxxx'. See inner errors for details.
2019-10-26T20:05:18.1731223Z ##[error]Details:


2019-10-26T20:05:18.1732062Z ##[error]ServicePrincipalNotFound: Provisioning of resource(s) for container service KubernetesCluster-aks in resource group testing failed. Message: {
  "code": "ServicePrincipalNotFound",
  "message": "Service principal clientID: $($secretServicePrincipalClientId) not found in Active Directory tenant ***, Please see https://aka.ms/aks-sp-help for more details."
 }. Details: 

2019-10-26T20:05:18.1733305Z ##[error]Task failed while creating or updating the template deployment.
2019-10-26T20:05:18.1765718Z ##[section]Finishing: Azure Deployment:Create Or Update Resource Group action on testing

看起来我用来连接到 Azure 云的服务主体不存在,但事实并非如此。该服务主体存在。

如果我直接在任务中的纯文本中包含servicePrincipalClientIdservicePrincipalClientSecret

-servicePrincipalClientId <servicePrincipalClientId-value> 
-servicePrincipalClientSecret <servicePrincipalClientSecret-value> 

Azure 资源组任务有效,ARM 模板中的资源从 Azure DevOps 部署在 Azure 云中。

  • 问题是什么?

根据此链接, AKS 需要创建一个服务主体。

  • az cli此外,当我们使用服务主体创建 Azure Kubernetes 服务时,会自动创建。

  • 当我们从 Azure 门户创建 Azure Kubernetes 服务时,也会发生同样的情况。

因此,我使用任务和服务连接中的现有服务主体凭据,通过资源组部署任务从执行 ARM 模板的 Azure Devops 创建 Azure Kubernetes 服务。

  • 为什么我的服务主体无法识别?

我尝试使用此选项来解决问题并解决问题,但我担心问题不是服务主体本身,而不是它,我认为我需要引用特殊方式的 - servicePrincipalClientId $($secretServicePrincipalClientId)and
-servicePrincipalClientSecret $($secretServicePrincipalClientSecret)

我怎样才能做到这一点?

如果有人能指出我正确的方向,我将不胜感激

4

1 回答 1

0

我决定简化 ARM 模板的执行,删除我将值转换为安全字符串的安全任务。

所以,最后,我以正常方式定义了管道变量,在administratorLogin那里有一个非加密变量:

在此处输入图像描述

在我正在执行的Azure 资源组部署任务中:

  • 模板:我选择我的 ARM 模板

  • 部署模式:完整

    完整模式会删除不在您的模板中的资源。[警告] 此操作将删除资源组中所有未在模板中指定的现有资源。

我选择这种模式是为了让平台中创建的所有资源都来自 ARM 模板,以便从 ARM 模板中获取资源或对基础设施所做的更改的日志。尝试应用基础架构即代码方法

  • 我决定的覆盖参数 包括我从 ARM 模板获得的所有参数值,包括这种方式的servicePrincipalClientIdservicePrincipalClientSecret变量:
-administratorLogin "my-username" 
-administratorLoginPassword $(administratorLoginPassword)  
-environmentName "dev" 
-location "West Europe" 
-servicePrincipalClientId $(servicePrincipalClientId) 
-servicePrincipalClientSecret $(servicePrincipalClientSecret) 
         .
         .    
-serviceCidr "100.0.0.0/16" 
-dnsServiceIP "100.0.0.10" 
-dockerBridgeCidr "172.17.0.1/16" 
         .
         .

而最终的执行结果是:

在此处输入图像描述

2019-10-27T15:58:18.3523334Z ##[section]Starting: Azure Deployment:Create Or Update Resource Group action on sentia-assessment-testing
2019-10-27T15:58:18.3886841Z ==============================================================================
2019-10-27T15:58:18.3887055Z Task         : Azure resource group deployment
2019-10-27T15:58:18.3887210Z Description  : Deploy an Azure Resource Manager (ARM) template to a resource group and manage virtual machines
2019-10-27T15:58:18.3887334Z Version      : 2.157.4
2019-10-27T15:58:18.3887438Z Author       : Microsoft Corporation
2019-10-27T15:58:18.3887559Z Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-resource-group-deployment
2019-10-27T15:58:18.3887710Z ==============================================================================


### WE CAN SEE HERE THAT AZ RESOURCE GROUP TASK CREATE THE RESOURCE GROUP
### IF IT DOES NOT EXIST. 

2019-10-27T15:58:19.3677672Z Checking if the following resource group exists: resource-group.
2019-10-27T15:58:19.6898000Z Resource group exists: false.
2019-10-27T15:58:19.6900439Z Creating resource Group: resource-group
2019-10-27T15:58:20.1586233Z Resource Group created successfully.
2019-10-27T15:58:20.1589727Z Creating deployment parameters.

############### THIS IS THE ARM TEMPLATE EXECUTED ##################

2019-10-27T15:58:20.1681560Z The detected encoding for file 'd:\a\r1\a\Github\Deployments\ARMTemplates\Infrastructure\AzResourceGroupDeploymentApproach\testing.json' is 'utf-8'

############### THIS IS THE ARM TEMPLATE EXECUTED END ##################

2019-10-27T15:58:20.1864884Z Starting Deployment.
2019-10-27T15:58:20.1866605Z Deployment name is AzureDevOpsDeployment_91
2019-10-27T16:13:20.7707558Z Successfully deployed the template.
2019-10-27T16:13:20.7834983Z ##[section]Finishing: Azure Deployment:Create Or Update Resource Group action on resource-group

这是一个好的和更简单的方法吗,但也许理想的场景可以将上面提到的变量作为安全字符串处理,并在发布管道中的不同任务之间共享它们的值。

于 2019-10-27T16:24:29.797 回答