我正在尝试使用外部数据源从 azure 动态获取虚拟机列表并单独显示虚拟机。
下面是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 值”
有人可以告诉我如何循环遍历虚拟机列表并单独显示它吗?
-------------已编辑------------
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 输出
最佳答案
对于您的问题,正如胜利者所说,Terraform 数据“外部”只能处理 JSON 模块的平面 map 。
通过您的更新,当您在循环中输出它们时,它们不是 JSON 模块,只是多个 JSON 模块,因此它也不匹配 Terraform 数据“外部”的输入。
您可以创建 JSON 模块并向其中添加虚拟机名称。像这样更改您的 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
关于azure - 如何循环遍历 terraform 中的对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55209943/