Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Azure devops terraform管道生成客户端id和密码_Bash_Azure_Terraform_Az - Fatal编程技术网

Bash Azure devops terraform管道生成客户端id和密码

Bash Azure devops terraform管道生成客户端id和密码,bash,azure,terraform,az,Bash,Azure,Terraform,Az,我正在使用这个地形清单在Azure上部署AKS。我可以通过命令行很好地完成这项工作,因为我在我的机器上配置了azure cli以生成客户端id和密码 然而,我现在正在Azure Devops管道上构建这个 到目前为止,我已经设法在Azure上运行terraform init并计划使用后端存储,使用Azure Devops并使用此扩展 问题:我如何在Azure devops管道上获取客户端id和secret,并将其设置为terraform的环境变量?我尝试在管道中创建一个bash-az命令 >

我正在使用这个地形清单在Azure上部署AKS。我可以通过命令行很好地完成这项工作,因为我在我的机器上配置了azure cli以生成客户端id和密码

然而,我现在正在Azure Devops管道上构建这个

到目前为止,我已经设法在Azure上运行terraform init并计划使用后端存储,使用Azure Devops并使用此扩展

问题:我如何在Azure devops管道上获取客户端id和secret,并将其设置为terraform的环境变量?我尝试在管道中创建一个bash-az命令

> az ad sp create-for-rbac --role="Contributor"
> --scopes="/subscriptions/YOUR_SUBSCRIPTION_ID"
但是由于这个错误失败了

> 2019-03-27T10:41:58.1042923Z 
2019-03-27T10:41:58.1055624Z Setting AZURE_CONFIG_DIR env variable to: /home/vsts/work/_temp/.azclitask
2019-03-27T10:41:58.1060006Z Setting active cloud to: AzureCloud
2019-03-27T10:41:58.1069887Z [command]/usr/bin/az cloud set -n AzureCloud
2019-03-27T10:41:58.9004429Z [command]/usr/bin/az login --service-principal -u *** -p *** --tenant ***
2019-03-27T10:42:00.0695154Z [
2019-03-27T10:42:00.0696915Z   {
2019-03-27T10:42:00.0697522Z     "cloudName": "AzureCloud",
2019-03-27T10:42:00.0698958Z     "id": "88bfee03-551c-4ed3-98b0-be68aee330bb",
2019-03-27T10:42:00.0704752Z     "isDefault": true,
2019-03-27T10:42:00.0705381Z     "name": "Visual Studio Enterprise",
2019-03-27T10:42:00.0706362Z     "state": "Enabled",
2019-03-27T10:42:00.0707434Z     "tenantId": "***",
2019-03-27T10:42:00.0716107Z     "user": {
2019-03-27T10:42:00.0717485Z       "name": "***",
2019-03-27T10:42:00.0718161Z       "type": "servicePrincipal"
2019-03-27T10:42:00.0718675Z     }
2019-03-27T10:42:00.0719185Z   }
2019-03-27T10:42:00.0719831Z ]
2019-03-27T10:42:00.0728173Z [command]/usr/bin/az account set --subscription 88bfee03-551c-4ed3-98b0-be68aee330bb
2019-03-27T10:42:00.8569816Z [command]/bin/bash /home/vsts/work/_temp/azureclitaskscript1553683312219.sh
2019-03-27T10:42:02.4431342Z ERROR: Directory permission is needed for the current user to register the application. For how to configure, please refer 'https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal'. Original error: Insufficient privileges to complete the operation.
2019-03-27T10:42:02.5271752Z [command]/usr/bin/az account clear
2019-03-27T10:42:03.3092558Z ##[error]Script failed with error: Error: /bin/bash failed with return code: 1
2019-03-27T10:42:03.3108490Z ##[section]Finishing: Azure CLI 

您只需授予您的服务连接权限即可创建服务主体。但我通常不建议这样做,只需预先创建一个服务主体并在您的管道中使用它。在每次运行时创建一个新的服务主体似乎太过分了


您可以使用build\release变量,并使用client id\secret填充这些变量。下面是我如何使用Azure管道进行操作的

为Terraform创建服务主体。 在管道中创建以下变量 ARM\u客户端\u ID ARM_客户_机密 ARM\u订阅\u ID ARM\u租户\u ID 如果您选择在Azure DevOps中将ARM_CLIENT_SECRET存储为机密,则您需要在任务的环境变量部分中执行以下操作,以将其解密,以便terraform可以读取它


文章中定义的方法? 也可以考虑。此处,Keyvault任务用于从Azure Vault获取机密,这些机密包括terraform后端访问机密以及aks sp机密:

#KEY VAULT TASK
- task: AzureKeyVault@1
  inputs:
    azureSubscription: '$(environment)-sp'
    KeyVaultName: '$(environment)-pipeline-secrets-kv'
    SecretsFilter: 'tf-sp-id,tf-sp-secret,tf-tenant-id,tf-subscription-id,tf-backend-sa-access-key,aks-sp-id,aks-sp-secret'
  displayName: 'Get key vault secrets as pipeline variables'
然后,您可以在管道的其余部分使用这些秘密作为变量。例如,aks sp id可以称为$aks-sp-id

# AZ LOGIN USING TERRAFORM SERVICE PRINCIPAL
- script: |
    az login --service-principal -u $(tf-sp-id) -p $(tf-sp-secret) --tenant $(tf-tenant-id)
    cd $(System.DefaultWorkingDirectory)/tf-infra-provision
接着是terraform init和下图所示的平面图,有关完整的管道详细信息,请参阅文章

# TERRAFORM PLAN    
    echo '#######Terraform Plan########'
    terraform plan -var-file=./tf-vars/$(tfvarsFile) -var="client_id=$(tf-sp-id)" -var="client_secret=$(tf-sp-secret)" -var="tenant_id=$(tf-tenant-id)" -var="subscription_id=$(tf-subscription-id)" -var="aks_sp_id=$(aks-sp-id)" -var="aks_sp_secret=$(aks-sp-secret)" -out="out.plan"


希望这有帮助。

所以我在Azure上创建服务主体,然后连接到管道,是否每次需要运行管道时都需要填充客户端id和密码?不,只需将它们放入build\release变量中并引用脚本中的变量即可。是否存在安全风险?可能比每次运行时生成新的服务主体要少。我在发布管道上添加了变量,但是terraform计划任务无法使用这些变量,因此我需要做其他事情,基本上我希望在terraform运行时将它们作为bash环境变量