使用条件分支创建动态 Automation - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用条件分支创建动态 Automation

默认情况下,在mainSteps部分按先后顺序运行。在一个操作完成后,mainSteps 部分中指定的下一个操作将开始。此外,如果某个操作无法运行,则整个自动化将失败(默认情况下)。您可以使用aws:branch自动化操作和 Runbook 选项,以创建执行条件分支. 也就是说,您可以创建在评估不同选项后跳转到不同步骤或在某个步骤完成时动态响应更改的自动化。以下是可用于创建动态自动化的选项的列表:

  • aws:branch:此 Automation 操作让您能够创建一个动态自动化,该动态自动化在一个步骤中评估多个选项,然后根据评估结果跳转到 Runbook 中的不同步骤。

  • nextStep:此选项指定在成功完成自动化中的哪个步骤后,接下来处理自动化中的哪个步骤。

  • isEnd:此选项在特定步骤结束时停止自动化。该选项的默认值为 false。

  • isCritical:此选项将一个步骤指定为成功完成自动化的关键步骤。如果具有此分派的步骤失败,则 Automation 会将自动化的最终状态报告为Failed. 该选项的默认值为true.

  • onFailure:此选项指示自动化在失败时是应停止、继续还是转到其他步骤。该选项的默认值为“中止”。

下一节介绍aws:branch自动化操作。有关的更多信息nextStepisEndisCritical, 和onFailure选项,请参阅如何使用动态选项的示例.

使用aws:branch操作

这些区域有:aws:branch操作提供适用于 Automation 的条件分支选项。如前所述,此操作让您能够在一个步骤中评估多个条件,然后根据评估结果跳转到新的步骤。aws:branch 操作的功能类似于编程中的 IF-ELIF-ELSE 语句。

下面是一个aws:branch步骤。

- name: ChooseOSforCommands action: aws:branch inputs: Choices: - NextStep: runPowerShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Windows - NextStep: runShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Linux Default: PostProcessing

当您指定aws:branch操作时,您可以指定Choices自动化必须评估。自动化可以评估Choices基于您在Parameters的运行手册。自动化还可以评估Choices基于上一步的输出。

Automation 使用布尔表达式评估每个选择。如果评估确定第一个选择是true,则 Automation 跳转到为此选择指定的步骤。如果评估确定第一个选择是false,则自动化将评估下一个选择。如果您的步骤包括三个或更多Choices,则自动化按顺序评估每个选择,直到某个选择的评估结果为true. 然后,自动化跳转到为true选择。

如果没有Choicestrue时,Automation 检查该步骤是否包含Default值。ADefault值定义当所有选择都为假时,自动化应跳转到的步骤。true. 如果没有Default值,则自动化处理 Runbook 中的下一个步骤。

以下是aws:branch步骤命名为chooseOSfromParameter. 此步骤包含两个 Choices:(NextStep: runWindowsCommand) 和 (NextStep: runLinuxCommand)。自动化评估这些Choices以确定应为适当的操作系统运行哪个命令。这些区域有:Variable对于每个选择使用{{OSName}},这是 Runbook 作者在Parameters的运行手册。

mainSteps: - name: chooseOSfromParameter action: aws:branch inputs: Choices: - NextStep: runWindowsCommand Variable: "{{OSName}}" StringEquals: Windows - NextStep: runLinuxCommand Variable: "{{OSName}}" StringEquals: Linux

以下是aws:branch步骤命名为chooseOSfromOutput. 此步骤包含两个 Choices:(NextStep: runPowerShellCommand) 和 (NextStep: runShellCommand)。自动化评估这些Choices以确定应为适当的操作系统运行哪个命令。这些区域有:Variable对于每个选择使用{{GetInstance.platform}},这是 Runbook 中上一步的输出。此示例还包含一个名为 Default 的选项。如果自动化计算Choices,并且两个选项都不是true,那么自动化将跳转到名为PostProcessing.

mainSteps: - name: chooseOSfromOutput action: aws:branch inputs: Choices: - NextStep: runPowerShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Windows - NextStep: runShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Linux Default: PostProcessing

创建aws:branch运行手册中的步骤

创建时aws:branch步骤时,您可以定义Choices应对自动化进行评估以确定自动化应跳转到哪个步骤的。如前所述,Choices 使用布尔表达式进行评估。每个选择都必须定义以下选项:

  • NextStep:当指定的选择为时,Runbook 中的下一个要处理的步骤为true.

  • 变量:指定在Parameters部分,或指定来自 Runbook 上一步的输出对象。

    使用以下格式指定参数变量。

    Variable: "{{name_of_parameter}}"

    使用以下格式指定输出对象变量。

    Variable: "{{previousStepName.outputFieldName}}"

    注意

    下一节关于创建输出变量更详细地介绍如何创建输出变量。

  • 运算:用于评估选择的标准,例如StringEquals: Linux. aws:branch 操作支持以下运算:

    字符串运算

    • 字符串等于

    • EqualsIgnoreCase

    • StartsWith

    • EndsWith

    • 包含

    数值运算

    • NumericEquals

    • NumericGreater

    • NumericLesser

    • NumericGreaterOrEquals

    • NumericLesser

    • NumericLesserOrEquals

    布尔运算

    • BooleanEquals

    重要

    创建 Runbook 时,系统将验证 Runbook 中的每个操作。如果某个操作不受支持,系统会返回错误,当您尝试创建 Runbook。

  • 默认值:指定自动化应跳转到的回退步骤,当所有Choicestrue.

    注意

    如果您不希望指定Default值,那么您可以指定isEnd选项。如果没有Choicestrue并且没有Default值,则 Automation 在步骤结束时停止。

使用以下模板可以帮助您构建aws:branch步骤在您的运行手册中。

YAML
mainSteps: - name: a name for the step action: aws:branch inputs: Choices: - NextStep: step to jump to if evaluation for this choice is true Variable: "{{parameter name or output from previous step}}" Operation type: Operation value - NextStep: step to jump to if evaluation = true Variable: "{{parameter name or output from previous step}}" Operation type: Operation value Default: step to jump to if all choices are false
JSON
{ "mainSteps":[ { "name":"a name for the step", "action":"aws:branch", "inputs":{ "Choices":[ { "NextStep":"step to jump to if evaluation for this choice is true", "Variable":"{{parameter name or output from previous step}}", "Operation type":"Operation value" }, { "NextStep":"step to jump to if evaluation = true", "Variable":"{{parameter name or output from previous step}}", "Operation type":"Operation value" } ], "Default":"step to jump to if all choices are false" } } ] }

关于创建输出变量

要创建引用上一步输出的 aws:branch 选择,您需要标识上一步的名称和输出字段的名称。然后,使用以下格式组合步骤和字段的名称。

Variable: "{{previousStepName.outputFieldName}}"

例如,以下示例中的第一个步骤名为GetInstance. 然后,在 outputs 下,有一个名为 platform 的字段。在第二个步骤 (ChooseOSforCommands) 中,作者希望将平台字段的输出引用为变量。要创建变量,只需将步骤名称 (GetInstance) 与输出字段名称 (platform) 组合在一起即可创建 Variable: "{{GetInstance.platform}}"

mainSteps: - Name: GetInstance action: aws:executeAwsApi inputs: Service: ssm Api: DescribeInstanceInformation Filters: - Key: InstanceIds Values: ["{{ InstanceId }}"] outputs: - Name: myInstance Selector: "$.InstanceInformationList[0].InstanceId" Type: String - Name: platform Selector: "$.InstanceInformationList[0].PlatformType" Type: String - name: ChooseOSforCommands action: aws:branch inputs: Choices: - NextStep: runPowerShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Windows - NextStep: runShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Linux Default: Sleep

这是一个 JSON 示例,展示了 “变量”:“{{描述实例。平台}}”是从上一步创建的 (“describeInstance”)和输出字段(“平台”)。

{ "name": "describeInstance", "action": "aws:executeAwsApi", "onFailure": "Abort", "inputs": { "Service": "ec2", "Api": "DescribeInstances", "InstanceIds": [ "{{ InstanceId }}" ] }, "outputs": [ { "Name": "Platform", "Selector": "$.Reservations[0].Instances[0].Platform", "Type": "String" } ], "nextStep": "branchOnInstancePlatform" }, { "name": "branchOnInstancePlatform", "action": "aws:branch", "inputs": { "Choices": [ { "NextStep": "runEC2RescueForWindows", "Variable": "{{ describeInstance.Platform }}", "StringEquals": "windows" } ], "Default": "runEC2RescueForLinux" } }

示例aws:branch运行手册

下面是一些使用的示例运行手册aws:branch.

示例 1:使用aws:branch带有输出变量以基于操作系统类型运行命令

在示例的第一步中 (GetInstance),则运行簿作者使用aws:executeAwsApi操作来调用ssm DescribeInstanceInformationAPI 操作。作者使用此操作确定实例使用的操作系统的类型。aws:executeAwsApi 操作输出实例 ID 和平台类型。

在第二个步骤 (ChooseOSforCommands) 中,作者使用了 aws:branch 操作和两个 Choices:(NextStep: runPowerShellCommand) 和 (NextStep: runShellCommand)。自动化评估实例的操作系统,方法是使用上一步 (Variable: "{{GetInstance.platform}}")。Automation 跳转到指定操作系统的步骤。

--- schemaVersion: '0.3' assumeRole: "{{AutomationAssumeRole}}" parameters: AutomationAssumeRole: default: "" type: String mainSteps: - name: GetInstance action: aws:executeAwsApi inputs: Service: ssm Api: DescribeInstanceInformation outputs: - Name: myInstance Selector: "$.InstanceInformationList[0].InstanceId" Type: String - Name: platform Selector: "$.InstanceInformationList[0].PlatformType" Type: String - name: ChooseOSforCommands action: aws:branch inputs: Choices: - NextStep: runPowerShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Windows - NextStep: runShellCommand Variable: "{{GetInstance.platform}}" StringEquals: Linux Default: Sleep - name: runShellCommand action: aws:runCommand inputs: DocumentName: AWS-RunShellScript InstanceIds: - "{{GetInstance.myInstance}}" Parameters: commands: - ls isEnd: true - name: runPowerShellCommand action: aws:runCommand inputs: DocumentName: AWS-RunPowerShellScript InstanceIds: - "{{GetInstance.myInstance}}" Parameters: commands: - ls isEnd: true - name: Sleep action: aws:sleep inputs: Duration: PT3S

示例 2:使用aws:branch使用参数变量基于操作系统类型运行命令

Runbook 作者在 Runbook 开头定义了几个参数选项,在parameters部分. 一个参数名为 OperatingSystemName。在第一个步骤 (ChooseOS) 中,作者使用了 aws:branch 操作和两个 Choices:(NextStep: runWindowsCommand) 和 (NextStep: runLinuxCommand)。这些 Choices 的变量引用在参数部分 (Variable: "{{OperatingSystemName}}") 中指定的参数选项。当用户运行此 Runbook 时,他们在运行时为指定值。OperatingSystemName. 自动化在Choices评估. Automation 基于为指定操作系统指定的运行时参数跳转到步骤。OperatingSystemName.

--- schemaVersion: '0.3' assumeRole: "{{AutomationAssumeRole}}" parameters: AutomationAssumeRole: default: "" type: String OperatingSystemName: type: String LinuxInstanceId: type: String WindowsInstanceId: type: String mainSteps: - name: ChooseOS action: aws:branch inputs: Choices: - NextStep: runWindowsCommand Variable: "{{OperatingSystemName}}" StringEquals: windows - NextStep: runLinuxCommand Variable: "{{OperatingSystemName}}" StringEquals: linux Default: Sleep - name: runLinuxCommand action: aws:runCommand inputs: DocumentName: "AWS-RunShellScript" InstanceIds: - "{{LinuxInstanceId}}" Parameters: commands: - ls isEnd: true - name: runWindowsCommand action: aws:runCommand inputs: DocumentName: "AWS-RunPowerShellScript" InstanceIds: - "{{WindowsInstanceId}}" Parameters: commands: - date isEnd: true - name: Sleep action: aws:sleep inputs: Duration: PT3S

使用运算符创建复杂的分支自动化

您可以通过使用AndOr, 和Not运算符aws:branch步骤。

“And” 运算符

使用And运算符,如果您希望多个变量为true的选择。在下面的示例中,第一个选择评估实例是否 running 并且使用的是 Windows 操作系统。如果评估二者为真,则自动化跳转到runPowerShellCommand步骤。如果一个或多个变量是false,则 Automation 评估第二个选择的变量。

mainSteps: - name: switch2 action: aws:branch inputs: Choices: - And: - Variable: "{{GetInstance.pingStatus}}" StringEquals: running - Variable: "{{GetInstance.platform}}" StringEquals: Windows NextStep: runPowerShellCommand - And: - Variable: "{{GetInstance.pingStatus}}" StringEquals: running - Variable: "{{GetInstance.platform}}" StringEquals: Linux NextStep: runShellCommand Default: sleep3

“Or” 运算符

使用Or运算符,当你需要任何的多个变量的选择为真。在下面的示例中,第一个选择评估参数字符串是不是 Windows 和 Amazon Lambda 步骤的输出是不是真。如果评估确定或者为真,则自动化跳转到RunPowerShellCommand步骤。如果两个变量都为假,则自动化评估第二个选择的变量。

- Or: - Variable: "{{parameter1}}" StringEquals: Windows - Variable: "{{BooleanParam1}}" BooleanEquals: true NextStep: RunPowershellCommand - Or: - Variable: "{{parameter2}}" StringEquals: Linux - Variable: "{{BooleanParam2}}" BooleanEquals: true NextStep: RunShellScript

“Not” 运算符

使用Not运算符,当你想跳转到变量为true。在下面的示例中,第一个选择评估参数字符串是不是 Not Linux。如果评估结果确定变量不为 Linux,则自动化跳转到sleep2步骤。如果第一个选择的评估结果为Linux,然后自动化评估下一个选择。

mainSteps: - name: switch action: aws:branch inputs: Choices: - NextStep: sleep2 Not: Variable: "{{testParam}}" StringEquals: Linux - NextStep: sleep1 Variable: "{{testParam}}" StringEquals: Windows Default: sleep3

如何使用动态选项的示例

本部分包括有关如何使用 Runbook 中的动态选项的不同示例。本部分中的每个示例都扩展以下 Runbook。此运行手册包含两个操作。第一个操作名为 InstallMsiPackage。它使用 aws:runCommand 操作将应用程序安装到 Windows Server 实例上。第二个操作名为 TestInstall。它使用 aws:invokeLambdaFunction 操作在成功安装应用程序后测试该应用程序。步骤 1 指定 onFailure: Abort。这意味着,如果应用程序未成功安装,则自动化会在步骤 2 前停止。

示例 1:带有两个线性动作的运行手册

--- schemaVersion: '0.3' description: Install MSI package and run validation. assumeRole: "{{automationAssumeRole}}" parameters: automationAssumeRole: type: String description: "(Required) Assume role." packageName: type: String description: "(Required) MSI package to be installed." instanceIds: type: String description: "(Required) Comma separated list of instances." mainSteps: - name: InstallMsiPackage action: aws:runCommand maxAttempts: 2 onFailure: Abort inputs: InstanceIds: - "{{instanceIds}}" DocumentName: AWS-RunPowerShellScript Parameters: commands: - msiexec /i {{packageName}} - name: TestInstall action: aws:invokeLambdaFunction maxAttempts: 1 timeoutSeconds: 500 inputs: FunctionName: TestLambdaFunction ...

创建跳转到不同步骤的动态自动化,通过使用onFailureoption

以下示例使用onFailure: step:step_namenextStep, 和isEnd选项来创建动态自动化。使用此示例时,如果InstallMsiPackage操作失败,则自动化将跳转到名为PostFailure(onFailure: step:PostFailure)运行Amazon Lambda函数在安装失败时执行某些操作。如果安装成功,则 Automation 将跳转到 TestInstall 操作 (nextStep: TestInstall)。这两种TestInstallPostFailure步骤使用isEnd选项 (isEnd: true),以便当任一步骤完成时自动化完成。

注意

可以选择在 mainSteps 部分的最后一步中使用 isEnd 选项。如果最后一个步骤未跳转到其他步骤,则自动化会在最后一步中运行操作后停止。

示例 2:跳转到不同步骤的动态自动化

mainSteps - name: InstallMsiPackage action: aws:runCommand onFailure: step:PostFailure maxAttempts: 2 inputs: InstanceIds: - "{{instanceIds}}" DocumentName: AWS-RunPowerShellScript Parameters: commands: - msiexec /i {{packageName}} nextStep: TestInstall - name: TestInstall action: aws:invokeLambdaFunction maxAttempts: 1 timeoutSeconds: 500 inputs: FunctionName: TestLambdaFunction isEnd: true - name: PostFailure action: aws:invokeLambdaFunction maxAttempts: 1 timeoutSeconds: 500 inputs: FunctionName: PostFailureRecoveryLambdaFunction isEnd: true ...
注意

在处理 Runbook 之前,系统将确认 Runbook 不会创建无限循环。如果检测到无限循环,则自动化将返回一个错误和一个显示哪些步骤创建循环的循环跟踪。

创建定义关键步骤的动态自动化

您可以指定某个步骤对于整体自动化成功很重要。如果关键步骤失败,则 Automation 会将自动化的状态报告为Failed,即使一个或多个步骤成功运行。在以下示例中,用户标识VerifyDependencies步骤,如果InstallMsiPackage步骤失败 (onFailure: step:VerifyDependencies)。用户指定InstallMsiPackage步骤不重要(isCritical: false)。在此示例中,如果应用程序安装失败,Automation 处理 VerifyDependencies 步骤以确定是否因一个或多个依赖项缺失而导致应用程序安装失败。

示例 3:定义自动化的关键步骤

--- name: InstallMsiPackage action: aws:runCommand onFailure: step:VerifyDependencies isCritical: false maxAttempts: 2 inputs: InstanceIds: - "{{instanceIds}}" DocumentName: AWS-RunPowerShellScript Parameters: commands: - msiexec /i {{packageName}} nextStep: TestPackage ...