azure - 如何循环遍历 terraform 中的对象列表?

标签 azure powershell terraform

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

enter image description here

最佳答案

对于您的问题,正如胜利者所说,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/

相关文章:

azure - 我可以在本地服务器中部署的控制台应用程序中使用 Azure 托管标识吗?

powershell - 将虚拟文件夹添加到 Azure Web App

powershell - 如何防止主机退出并返回退出代码?

amazon-web-services - 使用 kms 数据资源的 terraform 代码的无效 arn 错误

bash - 无法在 AWS Codebuild 中运行 `source`

amazon-web-services - 使用具有多个资源的 tag_secifications 设置启动模板

Azure 日志查询显示空值

azure - AcquireTokenAsync 返回 "invalid_grant"、 "AADSTS65001"

powershell - 调用 powershell cmdlet 时参数顺序有多重要?

powershell - Powershell:动态收集数据类型以进行IIS配置元素验证