如何在Terraform中遍历对象列表?

时间:2019-03-17 17:36:04

标签: azure powershell terraform

我正在尝试使用外部数据源从azure动态获取VM列表并单独显示VM。

下面是Powershell脚本

$rgroup = [Console]::In.ReadLine()
$json = ConvertFrom-Json $rgroup
$name = $json.rg
$vm=Get-AzVM -ResourceGroupName $name  | select name  |  convertTo-json
Write-Output  "$vm"

Main.tf

variable "resourcegroup" {}
data "external" "test" {
program = ["Powershell.exe", "./vm.ps1"]
query = {
rg = "${var.resourcegroup}"
}}
output "value" {
value = "${data.external.test.result}"}

但是,我收到一个错误“命令“ Powershell.exe”产生无效的JSON:json:无法将数字解组为map [string] string类型的Go值”

有人可以打电话给我如何遍历VM列表并单独显示吗?

-------------编辑------------

Powershell脚本

$rgroup = [Console]::In.ReadLine()
$json = ConvertFrom-Json $rgroup
$name = $json.rg
$vms=(Get-AzVM -ResourceGroupName $name ).name
foreach ($vm in $vms){
$vmname= $vm |convertTo-json
Write-Output  "{""Name"" : $vmname}"}

Main.tf

output "value" {
value = "${data.external.powershell_test.result.Name}"}

Powershell输出

enter image description here

2 个答案:

答案 0 :(得分:2)

数据“外部”只能处理平面地图,带有嵌套对象的JSON文档将使其失败。您可能需要预处理Powershell输出。

答案 1 :(得分:1)

对于您的问题,正如胜利者所说,Terraform数据“外部”只能处理JSON模块的平面映射。

随着更新,当您在循环中输出它们时,它们不是JSON模块,而是多个JSON模块,因此也与Terraform数据“外部”的输入不匹配。

您可以创建一个JSON模块并将VM名称添加到其中。像这样更改您的PowerShell脚本:

$rgroup = [Console]::In.ReadLine()
$json = ConvertFrom-Json $rgroup
$name = $json.rg
$vmlist=(Get-AzVM -ResourceGroupName $name).Name
$vmNames=@{}
for($i=0; $i -lt $vmlist.Length; $i++) {
    $vmNames["Name$i"] = $vmlist[$i]
}
$vmNames | ConvertTo-Json