将输出从terraform传递到Azure后端存储中具有状态文件的Azure Devops Pipeline

时间:2019-08-12 15:01:07

标签: azure azure-devops terraform

我似乎无法检索Terraform的公共IP地址输出,以进行AzureDevops中构建管道的下一步。

Terraform状态提取有效,并输出到json文件,不能在输出上进行grep。

Terraform状态显示[选项] ADDRESS不支持Azure后端,因此无法使用或grep或过滤输出

还尝试将其存储为文件并读取该值。

resource "local_file" "foo" {
    content     = "foo!"
    filename = "${path.module}/foo.bar"
}

data "azurerm_public_ip" "buildserver-pip" {
  name                = "${azurerm_public_ip.buildserver-pip.name}"
  resource_group_name = "${azurerm_virtual_machine.buildserver.resource_group_name}"
}

output "public_ip_address" {
  value = "${data.azurerm_public_ip.buildserver-pip.ip_address}"
}

期望将要传递的公共IP地址,以便可以在下一步的ansible剧本,bash或python脚本中使用

4 个答案:

答案 0 :(得分:4)

基于以下解决方案的@JleruOHeP答案,将自动为terraform脚本提供的每个输出创建一个变量

  1. 在您的发行版中创建PowerShell步骤,并插入以下嵌入式PowerShell:
$json = Get-Content $env:jsonPath | Out-String | ConvertFrom-Json

foreach($prop in $json.psobject.properties) {
    Write-Host("##vso[task.setvariable variable=$($prop.Name);]$($prop.Value.value)")
}
  1. 确保您已像这样提供了环境变量jsonPath

supply environment variable

答案 1 :(得分:1)

出于您的目的,我建议您将Terraform存储在Azure存储帐户中。然后,您可以在另一个terraform文件中使用远程状态。这是一个示例:

创建公共IP并将状态存储在Azure存储帐户blob中:

terraform {
    backend "azurerm" {
        storage_account_name = "yourAccountName"
        container_name       = "yourContainerName"
        key                  = "terraform.tfstate"
    }
}

resource "azurerm_public_ip" "main" {
    name            = "terraform_backend_pip"
    location        = "East US"
    resource_group_name = "yourResourceGroup"
    allocation_method = "Static"
}

# this is important, you can get the remote outputs for this
output "public_address" {
    value = "${azurerm_public_ip.main.ip_address}"
}

在另一个Terraform文件中引用远程状态:

data "terraform_remote_state" "azure" {
        backend = "azurerm"
        config = {
                storage_account_name = "charlescloudshell"
                container_name       = "terraform"
                key                  = "terraform.tfstate"
        }
}

# the remote state outputs contain all the output that you set in the above file
output "remote_backend" {
        value = "${data.terraform_remote_state.azure.outputs.public_address}"
}

以下结果:

enter image description here

您可以按照有关如何在Azure存储here中存储状态的步骤进行操作。

希望有帮助。如果您还有其他问题,请告诉我。如果它适合您,请接受它作为答案。

答案 2 :(得分:1)

terraform output variable

1.如上图所示,仅当您将“Terraform by Microsoft DevLabs”添加为任务时,您才会获得变量列表。其他 terraform 提供程序不支持输出变量。 Terraform by Microsoft DevLabs

2.还有另一种方法可以将terraform输出变量转换为管道变量(在这种情况下您需要将Terraform CLI添加为任务Terraform CLI by Charles Zipp

第一步:Terraform code to output storage account access key

步骤 2:Add terraform output as task after terraform apply

  • terraform 输出变量将以 TF_OUT 为前缀,以将其转换为管道变量
  • 通过引用为 $(TF_OUT_variable_name) 来访问管道变量
  • terraform 输出的配置目录必须与 terraform apply 相同

第 3 步:Powershell script to access pipeline variable

参考: Terraform 输出到管道变量 https://marketplace.visualstudio.com/items?itemName=charleszipp.azure-pipelines-tasks-terraform

答案 3 :(得分:0)

如果我正确理解了您的问题,则您希望提供带有terraform的内容(公共ip),然后通过变量将该内容提供给进一步的步骤。所有这些都在单个Azure DevOps管道中。

这可以通过简单的输出和Powershell脚本(可以内联!)来完成:

1)我假设您已经对管道(https://github.com/microsoft/azure-pipelines-extensions/tree/master/Extensions/Terraform/Src/Tasks/TerraformTaskV1)使用了terraform任务

2)另一个假设您有一个输出变量(从您的示例中开始)

3)您可以从此任务中指定输出变量:

enter image description here

4)最后,使用最简单的脚本将powershell步骤添加到下一步,并将其环境变量设置为$(TerraformOutput.jsonOutputVariablesPath)

$json = Get-Content $env:jsonPath | Out-String | ConvertFrom-Json

Write-Host "##vso[task.setvariable variable=MyNewIp]$($json.public_ip_address.value)"

5)....

6)利润!您现在可以将IP地址用作管道变量MyNewIp