我似乎无法检索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脚本中使用
答案 0 :(得分:4)
基于以下解决方案的@JleruOHeP答案,将自动为terraform
脚本提供的每个输出创建一个变量
$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)")
}
jsonPath
:答案 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}"
}
以下结果:
您可以按照有关如何在Azure存储here中存储状态的步骤进行操作。
希望有帮助。如果您还有其他问题,请告诉我。如果它适合您,请接受它作为答案。
答案 2 :(得分:1)
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
第 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)您可以从此任务中指定输出变量:
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
!