【问题标题】:Terraform on Azure DevOps with azurerm Backend带有 azurerm 后端的 Azure DevOps 上的 Terraform
【发布时间】:2019-10-13 17:11:13
【问题描述】:

所以我想使用 terraform v0.12.0 来定义我的 Azure 基础架构。我们公司非常重视对使用的东西进行限制,所以我有点不愿意使用 Azure DevOps Marketplace 中现成的构建/发布任务。于是我下载了exe,添加到代码中,也可以直接在build/release agent上下载。

所以我使用 Azure DevOps Release pipelines 内置任务 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 后端一起工作吗?顺便说一句,我从 Azure Key Vault 获取机密和 Id,直接注入到 DevOps 管道中

【问题讨论】:

  • 你检查ARM_ACCESS_KEY是否真的按照你使用的方式设置?
  • 文档中使用了对命令export的调用,但是当我使用export时,却说它不是一个可识别的cmdlet
  • 我的意思是如果你确定环境变量可以设置ARM_ACCESS_KEY=$(az keyvault secret show --name mybackendkey --vault-name mykeyvault --query value -o tsv)的方式设置?您可以通过输出变量 ARM_ACCESS_KEY 来检查它。
  • 让我试一试
  • 你的尝试结果如何?

标签: azure azure-devops terraform terraform-provider-azure


【解决方案1】:

对于您的问题,正如错误显示您通过环境变量设置的存储帐户访问密钥错误一样。正如您的评论,设置环境变量ARM_ACCESS_KEY是错误的方法。

我认为有两种方法可以解决这个问题。一种是使用 DevOps 方式设置环境变量。它似乎是一个 Windows 主机。所以另一种方法是用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"

【讨论】:

  • 能否请您也添加从powershell和windows cmd添加环境变量的方法,如果不是太多,虽然我已经想通了,但可能有人需要它并从中获得帮助.
  • @MuhammadMamoorKhan 是的,我会添加方法。
猜你喜欢
  • 2018-08-13
  • 2020-10-03
  • 2021-07-17
  • 1970-01-01
  • 2020-12-02
  • 2021-07-22
  • 1970-01-01
  • 2017-12-13
  • 2021-05-09
相关资源
最近更新 更多