如何在使用Azure资源管理器时获取CustomScriptExtenstion的输出?

时间:2016-07-01 19:38:27

标签: powershell azure azure-resource-manager resourcemanager

我使用Azure PowerShell Runbook在Azure虚拟机上执行PowerShell脚本。当我使用Azure资源管理器功能时,我找不到获取远程脚本输出的方法,我必须将其用于部署。有很多使用“非资源管理器”方式的例子,如下所示:

# Execute remote script
$Vm = Get-AzureVM -ServiceName "DSCDemo" -Name "DSCPull"
Set-AzureVMCustomScriptExtension -ContainerName scripts -StorageAccountName psmag -FileName user.ps1 -Run user.ps1 -VM $vm | Update-AzureVM -Verbose
# Get output
$vm = Get-AzureVM -ServiceName DSCDemo -Name DSCPull
$output = $Vm.ResourceExtensionStatusList.ExtensionSettingStatus

$ output变量然后包含已执行的脚本的标准和错误输出。对于我的资源管理器版本,相同的代码看起来非常相似:

# Execute remote script
$vm = Get-AzureRmVM -Name "DSCPull" -ResourceGroupName $ResourceGroupName
$result = Set-AzureRmVMCustomScriptExtension -ResourceGroupName $ResourceGroupName `
                                                -VMName "DSCPull"  `
                                                -Name 'user' `
                                                -Location $vm.Location  `
                                                -StorageAccountName psmag  `
                                                -StorageAccountKey '<key>' `
                                                -FileName "user.ps1"  `
                                                -ContainerName "scripts"  `
                                                -RunFile "user.ps1"
$output = Get-AzureRmVM -Name $VMName -ResourceGroupName $ResourceGroupName -Status

但输出完全不同,我发现任何包含标准输出或错误输出的内容。

如何借助Azure资源管理器功能检索输出?

2 个答案:

答案 0 :(得分:3)

好的,我找到了答案!您始终可以借助Get-AzureRmVmDiagnosticExtension命令查询结果:

$output = Get-AzureRmVMDiagnosticsExtension -ResourceGroupName $ResourceGroupName -VMName 'DSCPull' -Name 'user' -Status
$output.SubStatuses[0]
$output.SubStatuses[1]

将返回类似

的内容
Code          : ComponentStatus/StdOut/succeeded
Level         : Info
DisplayStatus : Provisioning succeeded
Message       : my output on remote
Time          :


Code          : ComponentStatus/StdErr/succeeded
Level         : Info
DisplayStatus : Provisioning succeeded
Message       :
Time          :

答案 1 :(得分:1)

在我的测试中,也可以使用Get-AzureRmVMExtension来检索它,这可能是更合乎逻辑的使用。您必须包含-Status参数,否则您将无法获取状态和子状态值。

此外,如果在资源管理器模板的输出部分中检索它,这样的工作(虽然我不喜欢硬编码的零索引):

&#13;
&#13;
"outputs": {
    "foo": {
        "type": "string",
        "value": "[reference('Microsoft.Compute/virtualMachines/my-vm/extensions/my-script').instanceView.substatuses[0].message)]"
    }
}
&#13;
&#13;
&#13;