0

我正在重新创建 Azure Runbook 以配合逻辑应用功能。长话短说,我希望 Logic App 启动 Runbook,从 Runbook 中获取结果并将它们用于 Logic App 中的后续步骤。

最初我想获取启动一些虚拟机的 JSON 输出,我最终得到的输出是这样的:

{
    "MyVM2":  true
}

{
    "MyVM1":  true
}

然后我打算解析要在 Runbook 中使用的 JSON,但很快意识到我不会有一致数量的结果(可能是 2 个 VM,或 20 个)我发现 Parse JSON 模式只能解析我设置的内容架构为(在我的情况下为 2,因此会遗漏更多内容)。

现在我想我可以将我的输出放到一个表中,然后使用它来允许逻辑应用程序查看该表的内部,以从中提取我的 VM 名称和成功结果。所以,这是我一直在破坏的 Runbook:

workflow ShutDownStartByTagasdf
{
        Param(
        [Parameter(Mandatory=$true)]
        [String]
        $TagName,
        [Parameter(Mandatory=$true)]
        [String]
        $TagValue,
        [Parameter(Mandatory=$true)]
        [Boolean]
        $Shutdown
        )

    $connectionName = "AzureRunAsConnection";

    try
    {
        # Get the connection "AzureRunAsConnection "
        $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName        

        # Logging in to Azure
        $null = Add-AzureRmAccount `
            -ServicePrincipal `
            -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
    }
    catch {

        if (!$servicePrincipalConnection)
        {
            $ErrorMessage = "Connection $connectionName not found."
            throw $ErrorMessage
        } else{
            Write-Error -Message $_.Exception
            throw $_.Exception
        }
    }


    $vms = Find-AzureRmResource -TagName $TagName -TagValue $TagValue | where {$_.ResourceType -like "Microsoft.Compute/virtualMachines"}

    Foreach -Parallel ($vm in $vms){
        if($Shutdown){
            $StopRtn = Stop-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force;
            $objOut = [PSCustomObject]@{
                VM = $vm.Name
                Success = $StartRtn.IsSuccessStatusCode
            }
        }
        else {
            $StartRtn = Start-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName;
            $objOut = New-Object psobject -Property @{
                VM = $vm.Name
                Success = $StartRtn.IsSuccessStatusCode
                }
        }
        $outPut = InlineScript {
            $Using:objOut | Format-Table Vm,Success
        }
    }
}

忽略$objOut = [PSCustomObject]@{部分,这只是我的 JSON 搞砸的历史,我现在把它留在那里,因为我没有使用$Shutdwon = $True, only $False,这是之后的最后一部分else {

这一点:

else {
    $StartRtn = Start-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName;
    $objOut = New-Object psobject -Property @{
        VM = $vm.Name
        Success = $StartRtn.IsSuccessStatusCode
        }
}
$outPut = InlineScript {
    $Using:objOut | Format-Table Vm,Success
}

}

我试图按照这里已经描述的内容来实现一些东西:在 PowerShell 中使用变量创建表

但是 Azure Runbook 控制台中没有输出,但它确实启动了 VM。

一个非常冗长的解释,但有谁知道我如何输出到工作流(运行手册)中的格式化表,它将在一个表中产生我的所有结果?

4

1 回答 1

1

我最终使用一个数组来捕获信息:

workflow ShutDownStartByTagasdf
{
        Param(
        [Parameter(Mandatory=$true)]
        [String]
        $TagName,
        [Parameter(Mandatory=$true)]
        [String]
        $TagValue,
        [Parameter(Mandatory=$true)]
        [Boolean]
        $Shutdown
        )

    $connectionName = "AzureRunAsConnection";

    try
    {
        # Get the connection "AzureRunAsConnection "
        $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName        

        # "Logging in to Azure..."
        $null = Add-AzureRmAccount `
            -ServicePrincipal `
            -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
    }
    catch {

        if (!$servicePrincipalConnection)
        {
            $ErrorMessage = "Connection $connectionName not found."
            throw $ErrorMessage
        } else{
            Write-Error -Message $_.Exception
            throw $_.Exception
        }
    }

    $result_array = @()

    $vms = Find-AzureRmResource -TagName $TagName -TagValue $TagValue | where {$_.ResourceType -like "Microsoft.Compute/virtualMachines"}

    Foreach -Parallel ($vm in $vms) {
        if($Shutdown){
            # Write-Output "Stopping $($vm.Name)";
            $StopRtn = Stop-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force;
            $objOut = New-Object -TypeName psobject -Property @{
                VM = $vm.Name
                Success = $StopRtn.IsSuccessStatusCode
            }
        }
        else {
            # Write-Output "Starting $($vm.Name)"; 
            $StartRtn = Start-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName;
            $objOut = New-Object -TypeName psobject -Property @{
                VM = $vm.Name
                Success = $StartRtn.IsSuccessStatusCode
                }
        }

        $workflow:result_array += $objOut
    }

    $result_array | ConvertTo-Json
}

最后一点$result_array | ConvertTo-Json让我获得了更好的输出,我希望在 Logic App 中使用它。输出:

[
    {
        "VM":  "MyVM2",
        "Success":  true,
        "PSComputerName":  "localhost",
        "PSShowComputerName":  true,
        "PSSourceJobInstanceId":  "dadd87ad-1de1-432c-92b1-4c501c9a7ce8"
    },
    {
        "VM":  "MyVM1",
        "Success":  true,
        "PSComputerName":  "localhost",
        "PSShowComputerName":  true,
        "PSSourceJobInstanceId":  "dadd87ad-1de1-432c-92b1-4c501c9a7ce8"
    }
]

我不喜欢它是一个对象数组,因为现在我必须弄清楚如何{ }在 Logic App 中使用一些大括号来更好地利用它。

于 2018-02-21T18:34:19.893 回答