Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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
Azure DevOps上带有azurerm后端的Terraform_Azure_Azure Devops_Terraform_Terraform Provider Azure - Fatal编程技术网

Azure DevOps上带有azurerm后端的Terraform

Azure DevOps上带有azurerm后端的Terraform,azure,azure-devops,terraform,terraform-provider-azure,Azure,Azure Devops,Terraform,Terraform Provider Azure,所以我想使用terraform v0.12.0来定义我的azure基础设施。我们公司严格限制使用的东西,所以我有点不愿意使用Azure DevOps Marketplace的现成构建/发布任务。所以我下载了exe,将其添加到代码中,我还可以直接在构建/发布代理上下载它 因此,我使用了Azure DevOps发布管道内置任务Azure Cli(v1.151.1)和以下代码 call az login --service-principal -u $(clientid) -p $(clientsec

所以我想使用terraform v0.12.0来定义我的azure基础设施。我们公司严格限制使用的东西,所以我有点不愿意使用Azure DevOps Marketplace的现成构建/发布任务。所以我下载了exe,将其添加到代码中,我还可以直接在构建/发布代理上下载它

因此,我使用了Azure DevOps发布管道内置任务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,这些机密和ID直接注入到DevOps peipline中,用于解决您的问题,正如错误显示您通过环境变量设置的存储帐户访问密钥是错误的一样。正如您的评论,设置环境变量
ARM\u ACCESS\u 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"


您是否检查ARM\u ACCESS\u键是否真的按您使用的方式设置?文档使用了对命令导出的调用,但当我使用导出时,它表示它不是可识别的cmdlet。我的意思是,如果您确定环境变量可以按set
ARM\u ACCESS\u键的方式设置=$(az keyvault机密显示--名称mybackendkey--vault名称mykeyvault--查询值-o tsv)
?您可以通过输出变量ARM\u ACCESS\u KEY来检查它。让我试试看您的尝试结果如何?您是否可以添加从powershell和windows cmd添加环境变量的方法,如果这不算太多,尽管我已经找到了它,但可能有人需要它并从中获得帮助。@muhammamoorkhan是的,我会添加方法。