我正在尝试使用外部数据源从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输出
答案 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