Runbook 输出和消息

 

发布时间: 2016年3月

适用对象:Windows Azure Pack for Windows Server, System Center 2012 R2 Orchestrator

大多数自动化 runbook 具有某种形式的输出,如发送给用户的错误消息或是旨在由另一个工作流使用的复杂对象。 Windows PowerShell 提供多个流,从工作流发送输出。Service Management Automation 以不同方式使用其中每个流,你应遵循有关如何在创建 Runbook 时使用每个流的最佳做法。

下表提供每个流的简短说明,以及当运行已发布 runbook 时和测试 runbook 时它们在管理门户中的行为。 后续部分中提供了有关每个流的进一步详细信息。

描述

已发布

测试

输出

旨在由其他 runbook 使用的对象。

写入作业历史记录。

在测试输出窗格中显示。

警告

面向用户的警告消息。

写入作业历史记录。

在测试输出窗格中显示。

错误

面向用户的错误消息。 与异常不同,runbook 在默认情况下会在显示错误消息之后继续运行。

写入作业历史记录。

在测试输出窗格中显示。

详细

提供常规或故障排除信息的消息。

仅当为 runbook 启用了详细日志记录时才写入作业历史记录。

仅当 $VerbosePreference 在 runbook 中设置为 Continue 时才在测试输出窗格中显示。

进度

在 runbook 中的每个活动之前和之后自动生成的记录。 Runbook 不应尝试创建自己的进度记录,因为它们旨在供交互用户使用。

仅当为 runbook 启用了进度日志记录时才写入作业历史记录。

不在测试输出窗格中显示。

调试

旨在供交互用户使用的消息。 不应在 runbook 中使用。

不写入作业历史记录。

不写入测试输出窗格。

输出流

输出流旨在用于工作流在正常运行时创建的对象的输出。 在 自动化 中,此流主要用于旨在由调用当前 runbook 的父 runbook 使用的对象。 从父 runbook 内联调用 runbook 时,它会将数据从输出流返回给父级。 仅当知道 runbook 绝不会由另一个 runbook 调用时,才应使用输出流将常规信息返回给用户。 但是作为最佳做法,通常应使用详细流将常规信息传递给用户。

可以通过使用 Write-Output 或是在 runbook 中将对象置于自己的行上,将数据写入输出流。

#The following lines both write an object to the output stream.
Write-Object –InputObject $object
$object

从函数输出

在包含在 runbook 中的函数中写入输出流时,输出会传递回 runbook。 如果 runbook 将该输出分配给变量,则它不会写入输出流。 从函数中写入任何其他流会写入 runbook 的对应流。

请考虑下面的示例 runbook。

Workflow Test-Runbook
{
   Write-Verbose "Verbose outside of function"
   Write-Output "Output outside of function"
   $functionOutput = Test-Function

   Function Test-Function
   {
      Write-Verbose "Verbose inside of function"
      Write-Output "Output inside of function"
   }
}

Runbook 作业的输出流是:

Output outside of function

Runbook 作业的详细流是:

Verbose outside of function
Verbose inside of function

$functionOutput 变量会具有值:

Output inside of function

声明输出数据类型

工作流可以使用 OutputType 特性指定其输出的数据类型。 此特性在运行时期间没有任何影响,但是它在设计时向 runbook 作者提供了 runbook 的预期输出的指示。 随着 runbook 的工具集继续发展,在设计时声明输出数据类型的重要性的也会提高。 因此,在创建的任何 runbook 中都包含此声明是最佳做法。

下面的示例 runbook 输出一个字符串对象,并包含其输出类型的声明。 如果 runbook 输出特定类型的数组,则应仍指定类型而不是该类型的数组。

Workflow Test-Runbook
{
   [OutputType([string])]

   $output = "This is some string output."
   Write-Output $output
}

消息流

与输出流不同,消息流旨在将信息传递给用户。 有多个消息流可用于不同种类的信息,每个消息流由 自动化 以不同方式处理。

警告和错误流

警告和错误流旨在记录 runbook 中出现的问题。 它们会在执行 runbook 时写入作业历史记录,并且在测试 runbook 时包含在管理门户的测试输出窗格中。 默认情况下,runbook 会在出现警告或错误之后继续执行。 可以通过在创建消息之前在 runbook 中设置首选项变量,指定应在出现警告或错误时挂起 runbook。 例如,要使 runbook 如同异常一样在出现错误时挂起,请将 $ErrorActionPreference 设置为 Stop

使用 Write-WarningWrite-Error cmdlet 创建警告或错误消息。 活动也可能会写入这些流。

#The following lines create a warning message and then an error message that will suspend the runbook.

$ErrorActionPreference = "Stop"
Write-Warning –Message "This is a warning message."
Write-Error –Message "This is an error message that will stop the runbook because of the preference variable."

详细流

详细消息流用于有关 runbook 操作的常规信息。 由于调试流在 runbook 中不可用,因此应将详细消息用于故障排除信息。 默认情况下,来自已发布 runbook 的详细消息不会存储在作业历史记录中。 要存储详细消息,请在管理门户中的 runbook 的“配置”选项卡上将已发布 runbook 配置为“记录详细记录”。 在大多数情况下,出于性能原因,应对 runbook 保留不记录详细记录的默认设置。 启用此选项仅仅是为了对 runbook 进行故障排除或调试。

$VerbosePreference 变量的默认值为 SilentlyContinue。 无需在已发布 runbook 中更改此变量来存储详细消息。 不过,如果此值在已发布 runbook 中显式设置为 SilentlyContinue,则不会存储详细消息(即使 runbook 配置为记录详细记录)。

测试 runbook 时,不会显示详细消息(即使 runbook 配置为记录详细记录)。 要在测试 runbook 时显示详细消息,必须将 $VerbosePreference 变量设置为 Continue。 设置该变量后,会在管理门户的测试输出窗格中显示详细消息。

可使用 Write-Verbose cmdlet 创建详细消息。

#The following line creates a verbose message.

Write-Verbose –Message "This is a verbose message."

调试流

调试流旨在用于交互用户,不应在 runbook 中使用。

进度记录

如果将 runbook 配置为记录进度记录(在管理门户中的 runbook 的“配置”选项卡上),则会在运行每个活动之前和之后向作业历史记录写入记录。 在大多数情况下,应对 runbook 保留不记录进度记录的默认设置,以便实现最高性能。 启用此选项仅仅是为了对 runbook 进行故障排除或调试。 测试 runbook 时,不会显示进度消息(即使 runbook 配置为记录进度记录)。

Write-Progress cmdlet 在 runbook 中无效,因为这旨在用于交互用户。

首选项变量

Windows PowerShell 使用首选项变量确定如何响应发送到不同输出流的数据。 可以在 runbook 设置这些变量来控制如何响应发送到不同流中的数据。

下表列出可以在 runbook 中使用的首选项变量及其有效值和默认值。 请注意,此表仅包含在 runbook 中有效的值。 其他值在 Service Management Automation 外部的 Windows PowerShell 中使用时对于首选项变量有效。

变量

默认值

有效值

WarningPreference

Continue

Stop
Continue
SilentlyContinue

ErrorActionPreference

Continue

Stop
Continue
SilentlyContinue

VerbosePreference

SilentlyContinue

Stop
Continue
SilentlyContinue

下表列出在 runbook 中有效的首选项变量值的行为。

行为

Continue

记录消息并继续执行 runbook。

SilentlyContinue

继续执行 runbook 而不记录消息。 这具有忽略消息的效果。

Stop

记录消息并挂起 runbook。

检索 Runbook 输出和消息

管理门户

可以从管理门户中的 runbook 的“作业”选项卡查看 runbook 作业的详细信息。 除了有关作业以及任何异常(如发生)的常规信息,作业的“摘要”还显示输入参数和 输出流。 如果将 Runbook 配置为记录详细记录和进度记录,则除了 详细流 和 进度记录,”历史记录”还将包括来自输出流和 警告和错误流 的消息。

Windows PowerShell

在 Windows PowerShell 中,可以使用Get-SmaJobOutput cmdlet 从 runbook 检索输出和消息。 此 cmdlet 需要作业 ID,并具有一个名为“Stream”的参数(在其中指定要返回的流)。 可以指定“Any”以返回作业的所有流。

下面的示例启动一个示例 runbook,然后等待它完成。 完成之后,便从作业收集其输出流。

$webServer = 'https://MyServer'
$port = 9090
$runbookName = "Test-Runbook"
$job = Start-SmaRunbook –WebServiceEndpoint $webServer –Port $port –Name $runbookName

$doLoop = $true
While ($doLoop) {
   $job = Get-SmaJob –WebServiceEndpoint $webServer –Port $port -Id $job.Id
   $status = $job.Status
   $doLoop = (($status -ne "Completed") -and ($status -ne "Failed") -and ($status -ne "Suspended") -and ($status -ne "Stopped") 
}

Get-SmaJobOutput –WebServiceEndpoint $webServer –Port $port -Id $job.Id –Stream Output