Runbook 概念

 

发布时间: 2016年3月

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

中的自动化 Runbook 是以 Windows PowerShell 工作流的形式实现的。 本部分简要概述了自动化 Runbook 的常见工作流的关键功能。 有关工作流的完整详细信息可在 Windows PowerShell 工作流简介中找到。

适用于 Service Management Automation 和 Microsoft Azure Automation 的 Runbook 的结构相同,但这两种 Runbook 通常用于不同的资源。

Windows PowerShell 工作流

工作流是一系列经过编程、连接在一起的步骤,这些步骤执行长时间运行的任务,或者需要协调跨多台设备或多个托管节点的多个步骤。 与标准脚本相比,工作流的优点包括:能够同时针对多台设备执行一项操作,并且能够自动从故障中恢复。 Windows PowerShell 工作流是一种利用 Windows Workflow Foundation 的 Windows PowerShell 脚本。 尽管该工作流使用 Windows PowerShell 语法编写并通过 Windows PowerShell 启动,但它由 Windows Workflow Foundation 处理。

基本结构

Windows PowerShell 工作流以 Workflow 关键字开头,后跟括在大括号中的脚本正文。Workflow 关键字后跟工作流的名称,如下列语法中所示。 工作流的名称与自动化 Runbook 的名称匹配。

Workflow Test-Runbook
{
   <Commands>
}

若要向工作流中添加参数,请使用 Param 关键字,如下列语法中所示。 管理门户将提示用户在启动 Runbook 时提供这些参数的值。 此示例使用可选的 Parameter 属性,该属性指定参数是否为必需。

Workflow Test-Runbook
{
  Param
  (
   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>,

   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>
  )
  <Commands>
}

命名

工作流的名称应遵守“动词-名词”格式,该格式是 Windows PowerShell 的标准。 你可以参阅 Approved Verbs for Windows PowerShell Commands(Windows PowerShell Commands 批准使用的动词)以了解批准使用的动词的列表。 工作流的名称必须与自动化 Runbook 的名称匹配。 如果正在导入 Runbook,则文件名必须与工作流名称匹配,并且必须以 .ps1 结尾。

限制

有关限制以及 Windows PowerShell 工作流和 Windows PowerShell 之间的语法差异的完整列表,请参阅脚本工作流和脚本之间的语法差异

活动

活动是工作流中的特定任务。 就像脚本由一个或多个命令组成一样,工作流由一个或多个按顺序执行的活动组成。 当 Windows PowerShell 工作流运行工作流时,它会自动将许多 Windows PowerShell cmdlet 自动转换为活动。 如果你在 Runbook 中指定这些 cmdlet 其中之一,则对应的活动实际上由 Windows Workflow Foundation 运行。 对于没有对应活动的 cmdlet,Windows PowerShell 工作流将自动在 InlineScript 活动中运行 cmdlet。 有一组 cmdlet 未包括在内并且无法在工作流中使用,除非你在 InlineScript 块中显式包括这些 cmdlet。 有关这些概念的进一步详细信息,请参阅 Using Activities in Script Workflows(在脚本工作流中使用活动)

工作流活动共用一组公用参数来配置其操作。 有关工作流公用参数的详细信息,请参阅 about_WorkflowCommonParameters(关于工作流公用参数)

集成模块

集成模块是包含 Windows PowerShell 模块并能够导入到 自动化 的程序包。 Windows PowerShell 模块包含可在 自动化 Runbook 中使用的 cmdlet。 Operations Manager 和 Azure 等产品和服务具有包含特定于其操作的 cmdlet 模块。

导入 自动化 的集成模块自动对所有 Runbook 可用。 由于自动化基于 Windows PowerShell 4.0,因此它支持自动加载模块,这意味着可以使用已安装模块中的 cmdlet,而无需使用 Import-Module 将它们导入到脚本中。

可以将任何 Windows PowerShell 模块导入到自动化中,只要可在单一文件夹中找到该模块的所有依赖项。 如果模块依赖于注册表设置或不在默认路径中的文件,则该模块可导入但很有可能无法工作,原因是自动化将无法找到其依赖项。 具有外部依赖项的模块可用于 Runbook 中,方法是将它们安装到使用的另一台主机上,然后使用 a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_InlineScript 脚本块访问它们。

通过 Service Management Automation,你可将具有外部依赖项的模块安装在每个 Worker 服务器上进行使用。 尽管这些模块中的 cmdlet 可在 Runbook 中使用,但自动化将不会发现它们以支持诸如“插入活动”向导等功能。 为了使用此功能,你可以使用 New-SmaPortableModule cmdlet 创建一个便携模块。 此 cmdlet 创建一个模块,该模块为其每个 cmdlet 包括一个存根,并可导入到自动化中。 当 Runbook 使用其中一个 cmdlet 时,存根会将调用重定向到外部模块中的实际 cmdlet。 该模块必须安装在每个 Worker 服务器上,否则调用将失败。

并行执行

Windows PowerShell 工作流的一项优势是能够并行执行一组命令,则不是像典型脚本一样按顺序执行。 这一点在 Runbook 中特别有用,因为它们可能会执行要花很长时间才能完成的多个操作。 例如,Runbook 可能会设置一组虚拟机。 操作可同时执行,而不是彼此按顺序执行每个设置过程,从而提高整体效率。 只有当所有操作都完成后,Runbook 才会继续。

你可以使用 Parallel 关键字创建一个包含将并发运行的多个命令的脚本块。 此脚本块使用如下所示的语法。 在此例中,Activity1 和 Activity2 将同时启动。 只有在 Activity1 和 Activity2 均已完成后,Activity3 才会启动。

Parallel
{
  <Activity1>
  <Activity2>
}
<Activity3>

你可以使用 ForEach -Parallel 构造为集合中的每一项并发处理命令。 将并行处理集合中的各项,同时脚本块中的命令将按顺序运行。 此脚本块使用如下所示的语法。 在此例中,集合中所有项的 Activity1 将同时启动。 对于每一项,Activity2 将在 Activity1 完成后启动。 只有在所有项 Activity1 和 Activity2 均已完成后,Activity3 才会启动。

ForEach -Parallel ($<item> in $<collection>)
{
  <Activity1>
  <Activity2>
}
<Activity3>

Sequence 关键字用于在 Parallel 脚本块内按顺序运行命令。Sequence 脚本块与其他命令并行运行,但该脚本块内的命令将按顺序运行。 此脚本块使用如下所示的语法。 在此例中,Activity1、Activity2 和 Activity3 将同时启动。 只有在 Activity3 完成后,Activity4 才会启动。 Activity5 将在所有其他活动完成后启动

Parallel
{
  <Activity1>
  <Activity2>

  Sequence 
  {
   <Activity3>
   <Activity4>
  }
}
<Activity5>

检查点

检查点是工作流的当前状态的快照,其中包括变量的当前值以及到该点为止生成的任何输出。 Runbook 中要完成的最后一个检查点保存到 自动化 数据库,以便即使出现故障,工作流也可继续。 Runbook 作业完成后,将删除检查点数据。

你可以使用 Checkpoint-Workflow 活动在工作流中设置检查点。 如果将此活动包括在 Runbook 中,则会立即获取检查点。 如果 Runbook 由于错误而挂起,则在作业恢复后,它将从设置的最后一个检查点的位置处恢复。

在下面的示例代码中,Activity2 后面发生一个导致 Runbook 挂起的错误。 作业恢复后,它将从运行 Activity2 开始,因为这正在设置的最后一个检查点后。

<Activity1>
Checkpoint-Workflow
<Activity2>
<Error>
<Activity3>

你应在 Runbook 中可能易于出错并且在 Runbook 恢复的情况下不应重复的活动后设置检查点。 例如,你的 Runbook 可能创建虚拟机。 你可以在用于创建虚拟机的命令之前和之后都设置检查点。 如果创建失败,则命令会在 Runbook 恢复后重复。 如果创建成功但 Runbook 稍后失败,则在 Runbook 恢复后将不会再次创建虚拟机。

有关检查点的详细信息,请参阅 Adding Checkpoints to a Script Workflow(向脚本工作流中添加检查点)

挂起 Runbook

你可以使用 Suspend-Workflow 活动强制 Runbook 将自身挂起。 此活动将设置一个检查点,并使工作流立即挂起。 对于可能需要在运行另一组活动运行之前执行手动步骤的 Runbook,挂起工作流十分有用。

有关挂起工作流的详细信息,请参阅 Making a Workflow Suspend Itself(让工作流挂起自身)

InlineScript

InlineScript 活动在单独的非工作流会话中运行命令块,并将其输出返回到工作流。 尽管工作流的命令会发送到 Windows Workflow Foundation 进行处理,但 InlineScript 块中的命令由 Windows PowerShell 处理。 活动使用包括 PSComputerNamePSCredential 在内的标准工作流公用参数,这些参数允许你指定代码块在另一台计算机上或使用替换凭据运行。

InlineScript 使用如下所示的语法。

InlineScript
{
  <Script Block>
} <Common Parameters>

InlineScript 在 Runbook 中的最常见用途是在另一台计算机上运行代码块。 当 Runbook 中的 cmdlet 未安装在 自动化 中时或者如果该操作只有在目标计算机上以本地方式执行的权限,则需要这样做。 下面的图表中阐释了这一点。

InlineScript

若要在另一台计算机上运行的代码块 PSComputerPSCredential 不使用参数 InlineScript 活动。 通常在 Runbook 中使用 a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_Credentials 或 a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_Connections 等全局资源为这些参数提供值。 下面的示例代码在由名为 MyConnection 的连接表示的计算机上运行一组命令。

$con = Get-AutomationConnection -Name 'MyConnection'
$securepassword = ConvertTo-SecureString -AsPlainText -String $con.Password -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $con.Username, $securepassword
InlineScript
{
  <Commands>
} –PSComputer $con.ComputerName –PSCredential $cred

尽管 InlineScript 活动在某些 Runbook 中可能很关键,但出于以下原因,只有在必要时才应使用它们:

  • 你无法从 InlineScript 块内使用检查点。 如果块内出现故障,则必须从头开始恢复块。

  • InlineScript 影响 Runbook 的扩展性,因为它将 Windows PowerShell 会话全部容纳在 InlineScript 块中。

  • 诸如 Get-AutomationVariableGet-AutomationPSCredential 等活动在 InlineScript 块中不可用。

如果的确需要使用 InlineScript,你应最大程度地减小其作用域。 例如,你的 Runbook 遍历一个集合,同时将相同操作应用于每一项,则循环应在 InlineScript 外部进行。 这将提供下列优势:

  • 你可在每个迭代后检查工作流。 如果作业挂起或中断并进行恢复,则循环将能够恢复。

  • 你可以使用 ForEach –Parallel 来并发处理集合项。

如果你要在 Runbook 中使用 InlineScript,请记住以下建议:

  • 你可以使用 $Using 作用域修饰符将值传入脚本。 例如,在 InlineScript 外设置的名为 $abc 的变量在 InlineScript 中变成 $using:abc。

  • 若要从 InlineScript 返回输出,将输出分配到变量,并输出要返回到输出流的任何数据。 下面的示例将字符串“hi”分配给名为 $output 的变量。

    $output = InlineScript { Write-Output "hi" }
    
  • 避免在 InlineScript 范围中定义工作流。 虽然一些工作流可能看似正常运行,但这不是测试的场景。 因此,你可能会遇到令人困惑的错误消息或意外的行为。

有关使用 InlineScript 的更多详细信息,请参阅在工作流中运行 Windows PowerShell 命令about_InlineScript