Как перебрать список объектов в terraform? - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь динамически получить список виртуальных машин из 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: не может распаковать число в значение 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

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

данные «внешние» могут обрабатывать только плоские карты, а документ JSON с вложенными объектами может привести к сбою. Возможно, вы захотите предварительно обработать вывод Powershell.

1 голос
/ 20 марта 2019

Для вашей проблемы, как сказал Виктор, данные Terraform, «внешние», могут обрабатывать только плоские карты модуля JSON.

При вашем обновлении, когда вы выводите их в цикле, они не являются модулем JSON, а просто несколькими модулями JSON, поэтому он также не соответствует вводу данных Terraform "external".

Вы можете создать модуль 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...