Terraform в Azure DevOps с серверной частью Azurerm

Поэтому я хочу использовать terraform v0.12.0 для определения моей лазурной инфраструктуры. Наша компания сильно налагает ограничения на использование вещей, поэтому я немного не хочу использовать готовые задачи сборки / выпуска из Azure DevOps Marketplace. Итак, я скачал exe, добавил его в код, я также могу загрузить его прямо в агент сборки / выпуска.

Поэтому я использовал встроенную задачу конвейеров выпуска Azure DevOps Release Azure Cli (v1.151.1) со следующим кодом.

call az login --service-principal -u $(clientid) -p $(clientsecret) --tenant $(tenantid)
call cd $(System.DefaultWorkingDirectory)/_DevOps/drop/Terraform/
call set ARM_ACCESS_KEY=$(az keyvault secret show --name mybackendkey --vault-name mykeyvault --query value -o tsv)
call set ARM_CLIENT_ID="$(clientid)"
call set ARM_CLIENT_SECRET="$(clientsecret)"
call set ARM_SUBSCRIPTION_ID="$(subscriptionid)"
call set ARM_TENANT_ID="$(tenantid)"
call terraform init -backend-config="storage_account_name=mystorageaccount" -backend-config="container_name=terraform-state" -backend-config="key=terraform.tfstate"
call terraform plan -input=false
call terraform apply -input=false

со следующим файлом terraform.tf

terraform {
  backend "azurerm" {
    storage_account_name = "mystorageaccount"
    container_name = "terraform-state"
    key = "terraform.tfstate"
    resource_group_name  = "myresourcegroup"
    subscription_id = "00000000-0000-0000-0000-000000000000"
    client_id = "00000000-0000-0000-0000-000000000000"
    client_secret = "mysecret"
    tenant_id = "00000000-0000-0000-0000-000000000000"
  }
}

Теперь это дает следующую ошибку

2019-05-27T14:45:53.7470711Z D:\a\r1\a\_DevOps\drop\Terraform>call set ARM_ACCESS_KEY=$(az keyvault secret show --name mybackendkey --vault-name mykeyvault --query value -o tsv) 
2019-05-27T14:45:53.7491727Z D:\a\r1\a\_DevOps\drop\Terraform>call set ARM_CLIENT_ID="***" 
2019-05-27T14:45:53.7511373Z D:\a\r1\a\_DevOps\drop\Terraform>call set ARM_CLIENT_SECRET="***" 
2019-05-27T14:45:53.7532794Z D:\a\r1\a\_DevOps\drop\Terraform>call set ARM_SUBSCRIPTION_ID="***" 
2019-05-27T14:45:53.7554859Z D:\a\r1\a\_DevOps\drop\Terraform>call set ARM_TENANT_ID="***" 
2019-05-27T14:45:53.7574875Z D:\a\r1\a\_DevOps\drop\Terraform>call terraform init -backend-config="storage_account_name=mystorageaccount" -backend-config="container_name=terraform-state" -backend-config="key=terraform.tfstate" 
2019-05-27T14:45:53.9641074Z ‌Initializing the backend...‌
2019-05-27T14:45:53.9721551Z Successfully configured the backend "azurerm"! Terraform will automatically
2019-05-27T14:45:53.9721831Z use this backend unless the backend configuration changes.‌
2019-05-27T14:45:53.9737291Z ‌Error: ‌Failed to get migrated workspaces: Error creating storage client for storage account "mystorageaccount": azure: malformed storage account key: illegal base64 data at input byte 0‌
2019-05-27T14:45:53.9856719Z D:\a\r1\a\_DevOps\drop\Terraform>call terraform plan -out=tfplan -input=false 
2019-05-27T14:45:54.1177547Z ‌Error: ‌Error loading state: Error creating storage client for storage account "mystorageaccount": azure: malformed storage account key: illegal base64 data at input byte 0‌
2019-05-27T14:45:54.1302709Z D:\a\r1\a\_DevOps\drop\Terraform>call terraform apply -input=false tfplan 
2019-05-27T14:45:54.2539375Z ‌CreateFile tfplan: The system cannot find the file specified.‌
2019-05-27T14:45:54.2782991Z ##[error]Script failed with error: Error: D:\a\_temp\azureclitaskscript1558968322690.bat failed with return code: 1
2019-05-27T14:45:54.2899205Z [command]C:\windows\system32\cmd.exe /D /S /C ""C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" account clear"

Это сработает, если я перенесу свой серверный модуль на локальный. Могу ли я заставить его работать с Azure Backend? Кстати, я получаю секреты и идентификаторы из Azure Key Vault, непосредственно вводимые в Peipline DevOps.


person Muhammad Mamoor Khan    schedule 28.05.2019    source источник
comment
Вы проверяете, действительно ли ARM_ACCESS_KEY установлен так, как вы используете?   -  person Charles Xu    schedule 28.05.2019
comment
В документации используется вызов команды export, но когда я использую экспорт, он говорит, что это не распознанный командлет   -  person Muhammad Mamoor Khan    schedule 28.05.2019
comment
Я имею в виду, уверены ли вы, что переменная окружения может быть установлена ​​так, как установлено ARM_ACCESS_KEY=$(az keyvault secret show --name mybackendkey --vault-name mykeyvault --query value -o tsv)? Проверить это можно через вывод переменной ARM_ACCESS_KEY.   -  person Charles Xu    schedule 28.05.2019
comment
позволь мне попробовать   -  person Muhammad Mamoor Khan    schedule 28.05.2019
comment
Каков результат вашей попытки?   -  person Charles Xu    schedule 28.05.2019
comment
@CharlesXu, это был хороший улов, и он не был настроен правильно, поэтому я просто установил его напрямую через DevOps и бац, теперь он работает   -  person Muhammad Mamoor Khan    schedule 28.05.2019
comment
Нет, я не использую powershell, мне нужно, чтобы он был установлен из задачи Azure Cli в Azure DevOps, которая, как мне кажется, использует оболочку bash. Но даже если я следовал синтаксису bash, он не устанавливался   -  person Muhammad Mamoor Khan    schedule 28.05.2019
comment
Кажется, вы запускаете команду в Windows, поэтому использовать команду bash для установки переменной среды - неправильный способ.   -  person Charles Xu    schedule 28.05.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Muhammad Mamoor Khan    schedule 28.05.2019


Ответы (1)


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

Думаю, есть два пути решения проблемы. Один из них - использовать способ DevOps для установки переменных среды. И вроде это Windows-хост. Другой способ - установить переменные среды в Windows.

Добавьте окна ниже:

В PowerShell:

$env:ARM_ACCESS_KEY=$(az keyvault secret show --name mybackendkey --vault-name mykeyvault --query value -o tsv)

В CMD кажется, что вы не можете напрямую установить переменные среды через вывод команды, просто можете установить их с помощью строки.

set ARM_ACCESS_KEY="xxxxx"

person Charles Xu    schedule 28.05.2019
comment
Не могли бы вы также добавить метод добавления переменных среды из PowerShell и Windows cmd, если это не слишком много, хотя я понял это, кому-то это может понадобиться и получить от него помощь. - person Muhammad Mamoor Khan; 28.05.2019
comment
@MuhammadMamoorKhan Ага, способы добавлю. - person Charles Xu; 28.05.2019