Конвейер Azure devops terraform генерирует идентификатор клиента и секрет

#bash #azure #terraform #az

#bash #azure #terraform #az

Вопрос:

Я использую этот манифест terraform для развертывания AKS в Azure. Я могу сделать это с помощью командной строки, и это работает, поскольку на моем компьютере настроен Azure cli для генерации идентификатора клиента и секретного

https://github.com/anubhavmishra/terraform-azurerm-aks

Однако сейчас я создаю это в конвейере Azure Devops

Итак, до сих пор мне удавалось запускать инициализацию terraform и планировать серверное хранилище в Azure, используя Azure Devops с использованием этого расширения

https://marketplace.visualstudio.com/items?itemName=charleszipp.azure-pipelines-tasks-terraform

Вопрос: Как мне получить идентификатор клиента и секрет в конвейере Azure devops и установить их в качестве переменной среды для 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://learn.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 
  

Ответ №1:

Вот как я делаю это с конвейерами Azure.

  1. Создайте участника-службу для Terraform.
  2. Создайте в своем конвейере следующие переменные
    • ARM_CLIENT_ID
    • ARM_CLIENT_SECRET
    • ARM_SUBSCRIPTION_ID
    • ARM_TENANT_ID

Если вы выберете для хранения ARM_CLIENT_SECRET а секрет в Azure концепция DevOps вам нужно будет сделать следующее в вашем задач под переменные среды разделов задания, чтобы сделать это расшифровывается так терраформировать можете прочитать его.

введите описание изображения здесь

Ответ №2:

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

вы можете использовать переменные сборки выпуска и заполнить их идентификатором клиента secret

Комментарии:

1. итак, я создаю участника-службу в Azure, а затем подключаюсь к конвейеру, нужно ли мне заполнять идентификатор клиента и секрет каждый раз, когда мне нужно запускать конвейер?

2. нет, просто поместите их в переменные сборки выпуска и ссылайтесь на них в своем скрипте. learn.microsoft.com/en-us/azure/devops/pipelines/process /…

3. существует ли угроза безопасности?

4. вероятно, меньше, чем создание нового участника службы при каждом запуске

5. я добавил переменные в конвейер выпуска, однако они недоступны для задачи планирования terraform, поэтому мне нужно сделать что-нибудь еще, в основном я хочу, чтобы они были переменной среды bash при запуске terraform

Ответ №3:

Подход, определенный в сообщении https://medium.com/@maninder.bindra/creating-a-single-azure-devops-yaml-pipeline-to-provision-multiple-environments-using-terraform-e6d05343cae2 ? также может быть рассмотрен. Здесь задача 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). Таким образом, задача bash / azure-cli может быть чем-то вроде

 # 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 и планирование (план показан ниже, подробные сведения о конвейере см. в публикации)

 # 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"

  

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