【问题标题】:How to loop through list of objects in terraform?如何遍历terraform中的对象列表?
【发布时间】:2019-08-08 03:31:57
【问题描述】:

我正在尝试使用外部数据源从 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: cannot unmarshal number into Go value of type map[string]string”

有人可以告诉我如何遍历虚拟机列表并单独显示吗?

-------------已编辑------------

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 输出

【问题讨论】:

    标签: azure powershell terraform


    【解决方案1】:

    对于您的问题,正如 victor 所说,“外部”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
    

    【讨论】:

    • 感谢查尔斯的解释。
    【解决方案2】:

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

    【讨论】:

    • 请检查更新的脚本,我在 foreach 循环中一次发送一个虚拟机名称,但我仍然收到错误“命令“Powershell.exe”生成无效 JSON:无效字符 '{' 之后顶级价值”
    • 当您从命令行运行 powershell 脚本时,它是否会向控制台输出任何其他内容?除了写入 JSON 之外,您必须确保没有其他任何内容。
    • 我在直接运行脚本时添加了powershell输出
    • 那个输出是问题所在 - 它应该是: {"name1": "value", "name2":"value", "name3":"value"} 记住,它是 map,如果键重复,它们将覆盖该值。
    猜你喜欢
    • 2021-04-10
    • 2020-12-27
    • 2022-01-04
    • 2019-03-21
    • 2021-10-05
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多