你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 逻辑应用的标准工作流中添加并运行 PowerShell 脚本代码(预览版)

适用于:Azure 逻辑应用(标准)

注意

此功能为预览版,受 Microsoft Azure 预览版补充使用条款限制。

若要在 Azure 逻辑应用中使用标准工作流内联执行自定义集成任务,可以直接从你的工作流中添加并运行 PowerShell 代码。 对于此任务,请使用名为“执行 PowerShell 代码”的“内联代码”操作。 此操作返回 PowerShell 代码的结果,以便你可以在工作流的后续操作中使用此输出。

此功能提供以下优势:

  • 在工作流设计器中编写你自己的脚本,以便解决复杂的集成难题。 不需要其他服务计划。

    这一优势简化了工作流开发,并降低了管理更多服务的复杂性和成本。

  • 生成一个专用代码文件,该文件在你的工作流中提供个性化的脚本编写空间。

  • Azure Functions PowerShell Functions集成,为高级任务执行提供强大的功能和继承。

  • 与工作流一起部署脚本。

本指南介绍如何在工作流中添加操作并添加要运行的 PowerShell 代码。

先决条件

  • Azure 帐户和订阅。 如果没有订阅,可以注册免费的 Azure 帐户

  • 要在其中添加 PowerShell 脚本的标准逻辑应用工作流。 工作流须以触发器开头。 有关详细信息,请参阅创建示例标准逻辑应用工作流

    你可以根据自己的情况使用任何触发器,作为示例,本指南使用名为“收到 HTTP 请求时”的请求触发器以及“响应”操作。 当另一个应用程序或工作流向触发器的终结点 URL 发送请求时,工作流就会运行。 示例脚本将代码执行的结果作为输出返回,你可以在后续操作中使用该输出。

注意事项

  • Azure 门户将脚本作为 PowerShell 脚本文件 (.ps1) 保存在与 workflow.json 文件相同的文件夹中,该文件存储了工作流的 JSON 定义,并将该文件与工作流定义一起部署到逻辑应用资源中

    使用 .ps1 文件格式可以减少“样板”编写工作量,你只需专注于编写 PowerShell 代码。 如果重命名操作,则文件也会重命名,但反之亦然。 如果直接重命名文件,则重命名的版本将覆盖以前的版本。 如果操作名称和文件名不匹配,操作会找不到该文件并尝试创建新的空文件。

  • 脚本在工作流的本地。 若要在其他工作流中使用同一脚本,请在 KuduPlus 控制台中查看脚本文件,然后复制该脚本以便在其他工作流中重用

限制

名称 限制 备注
脚本运行持续时间 10 分钟 如果你的方案需要更长的持续时间,请使用产品反馈选项提供有关需求的详细信息。
输出大小 100 MB 输出大小取决于操作的输出大小限制,通常为 100 MB。

添加“执行 PowerShell 代码”操作

  1. Azure 门户的设计器中,打开标准逻辑应用资源和工作流。

  2. 在设计器中,按照以下常规步骤将名为“执行 PowerShell 代码”的“内联代码操作”操作添加到工作流

  3. 操作信息窗格打开后,在“参数”选项卡上的“代码文件”框中,使用自己的代码更新预先填充的示例代码

    以下示例演示操作的“参数”选项卡以及示例脚本代码

    屏幕截图显示了 Azure 门户、标准工作流设计器、请求触发器、打开的信息窗格中的“执行 PowerShell 代码”操作和“响应”操作。信息窗格显示示例 PowerShell 脚本。

    以下示例演示示例脚本代码:

    # Use the following cmdlets to retrieve outputs from prior steps.
    # $triggerOutput = Get-TriggerOutput
    # $ActionOutput = Get-ActionOutput -ActionName <action-name>
    
    $customResponse =  [PSCustomObject]@{
       Message = "Hello world!"
    }
    
    # Use Write-Debug/Write-Host/Write-Output/ to log messages to Application Insights.
    # Write-Host/Write-Output/Write-Debug and 'return' won't return an output to the workflow.
    # Write-Host "Sending to Application Insight logs"
    
    # Use Push-WorkflowOutput to push outputs into subsequent actions.
    Push-WorkflowOutput -Output $customResponse
    

    以下示例演示自定义示例脚本:

    $action = Get-TriggerOutput
    $results = "Hello from PowerShell!"
    Push-WorkflowOutput -Output $results
    
  4. 完成后,保存工作流。

运行工作流后,可以在 Application Insights(如果已启用)中查看工作流输出。 有关详细信息,请参阅在 Application Insights 中查看輸出

访问脚本中的工作流触发器和操作输出

使用具有多个参数的自定义对象返回触发器和前面的操作的输出值。 若要访问这些输出并确保返回所需的值,请使用 Get-TriggerOutputGet-ActionOutput,以及 Push-WorkflowOutput cmdlet 以及下表中所述的任何适当参数,例如

$trigger = Get-TriggerOutput
$statusCode = $trigger.status.ToString();
$action = Get-ActionOutput -ActionName Compose
$actionOutput = $action.outputs['actionOutput'].ToString();
$populatedString = "Send the $statusCode for the trigger status and $actionOutputName."

Push-WorkflowOutput -Output $populatedString

注意

在 PowerShell 中,如果引用在复杂对象中具有 JValue 类型的对象,并将该对象添加到字符串,则会出现格式异常。 若要避免此错误,请使用 ToString()

触发器和操作响应输出

下表列出了调用 Get-ActionOutput 或 Get-TriggerOutput 时生成的输出。 返回值是一个名为 PowershellWorkflowOperationResult 的复杂对象,其中包含以下输出

名称 Type 说明
名称 字符串 触发器或操作的名称。
输入 JToken 传入触发器或操作的输入值。
输出 JToken 所执行的触发器或操作的输出。
StartTime DateTime 触发器或操作的开始时间。
EndTime DateTime 触发器或操作的结束时间。
ScheduledTime DateTime 运行触发器或操作或触发器的计划时间。
OriginHistoryName 字符串 启用了“拆分”选项的触发器的源历史记录名称
SourceHistoryName 字符串 重新提交的触发器的源历史记录名称。
TrackingId 字符串 操作跟踪 ID。
代码 字符串 结果的状态代码。
Status 字符串 触发器或操作的运行状态,例如,“成功”或“失败”
错误 JToken HTTP 错误代码。
TrackedProperties JToken 设置的任何跟踪属性。

将输出返回到工作流

若要将任何输出返回到工作流,必须使用 Push-WorkflowOutput cmdlet

自定义 PowerShell 命令

“执行 PowerShell 代码”操作包含以下自定义 PowerShell 命令 (cmdlet),用于与工作流和工作流中的其他操作进行交互

Get-TriggerOutput

获取工作流触发器的输出。

语法

Get-TriggerOutput

参数设置

无。

Get-ActionOutput

获取工作流中另一个操作的输出,并返回名为 PowershellWorkflowOperationResult 的对象

语法

Get-ActionOutput [ -ActionName <String> ]

参数

参数 类型 说明
ActionName 字符串 工作流中包含你要引用的输出的操作的名称。

Push-WorkflowOutput

将“执行 PowerShell 代码”操作的输出推送到工作流,这样可以传递回任何对象类型。 如果返回值为 null,则会从 cmdlet 获得空对象错误。

注意

Write-Debug、Write-Host 和 Write-Output cmdlet 不会将值返回到工作流。 return 语句也不会将值返回到工作流。 但可以使用这些 cmdlet 编写出现在 Application Insights 中的跟踪消息。 有关详细信息,请参阅 Microsoft.PowerShell.Utility

语法

Push-WorkflowOutput [-Output <Object>] [-Clobber]

参数

参数 类型 说明
输出 多种多样。 要返回到工作流的输出。 此输出可以具有任何类型。
Clobber 多种多样。 一个可选开关参数,可用于替代以前推送的输出。

通过 PowerShell 使用托管标识对访问进行身份验证和授权

使用托管标识,逻辑应用资源和工作流可以对支持 Microsoft Entra 身份验证的任何 Azure 服务和资源的访问进行身份验证和授权,而无需在代码中包含凭据。

在“执行 PowerShell 代码”操作中,可以使用托管标识对访问进行身份验证和授权,以便你可以对启用访问的其他 Azure 资源执行操作。 例如,可以重启虚拟机或获取另一个逻辑应用工作流的运行详细信息。

若要从“执行 PowerShell 代码”操作中使用托管标识,必须执行以下步骤

  1. 按照以下步骤在逻辑应用上设置托管标识,并向目标 Azure 资源授予托管标识访问权限

    在目标 Azure 资源上,查看以下注意事项:

    • 在“角色”选项卡上,“参与者”角色通常就足矣

    • 在“添加角色分配”页中的“成员”选项卡上,对于“将访问权限分配到”,请确保选择 “托管标识”

    • 选择“选择成员”后,在“选择托管标识”窗格中,选择要使用的托管标识

  2. 在“执行 PowerShell 代码”操作中,包含以下代码作为第一个语句

    Connect-AzAccount -Identity
    
  3. 现在,可以使用 cmdlet 和模块来处理 Azure 资源了。

查看脚本文件

  1. Azure 门户中,打开具有所需工作流的标准逻辑应用资源。

  2. 在逻辑应用资源菜单中的“开发工具”下,选择“高级工具”

  3. 在“高级工具”页面上,选择“转到”,这会打开 KuduPlus 控制台

  4. 打开“调试控制台”菜单,然后选择“CMD”

  5. 转到逻辑应用的根位置:site/wwwroot

  6. 按照以下路径转到包含 .ps1 文件的工作流文件夹:site/wwwroot/{workflow-name}

  7. 在文件名旁边,选择“编辑”打开并查看该文件

在 Application Insights 中查看日志

  1. Azure 门户中,在逻辑应用资源菜单的“设置”下,选择“Application Insights”,然后选择你的逻辑应用。

  2. 在“Application Insights”菜单上,在“监视”下,选择“日志”。

  3. 创建查询以从工作流执行中查找任何跟踪或错误,例如:

    union traces, errors
    | project TIMESTAMP, message
    

模块

PowerShell 模块是包含各种组件的自包含可重用单元,例如:

  • Cmdlet:执行特定任务的单个命令。
  • 提供程序:允许访问数据存储,例如注册表或文件系统,就如同它们是驱动器一样。
  • 函数:执行特定操作的可重用代码块。
  • 变量:存储在模块中以供使用的数据。
  • 其他类型的资源。

模块会整理 PowerShell 代码,使其更易于分发。 例如,可以创建自己的模块来打包相关功能,使其更易于管理和共享。 通过“执行 PowerShell 代码”操作,可以导入公共和专用 PowerShell 模块

公共模块

若要查找公开可用的模块,请访问 PowerShell 库。 标准逻辑应用资源最多可支持 10 个公共模块。 若要使用任何公共模块,必须按照以下步骤启用此功能:

  1. Azure 门户的逻辑应用资源菜单中,在“开发工具”下,选择“高级工具”

  2. 在“高级工具”页中,选择“Go”。

  3. 在 Kudu Plus 工具栏上,从“调试控制台”菜单中,选择“CMD”

  4. 使用目录结构或命令行浏览到逻辑应用的根级别 (C:\home\site\wwwroot)

  5. 打开工作流的 host.json 文件,并将“托管依赖项”属性设置为 true(默认已设置)

    "managedDependency": {
        "enabled": true
    }
    
  6. 打开名为 requirements.psd1 的文件。 使用以下语法包括所需模块的名称和版本:MajorNumber.* 或确切的模块版本,例如

    @{
        Az = '1.*'
        SqlServer = '21.1.18147'
    } 
    

公共模块注意事项

如果使用依赖项管理,则需注意以下事项:

  • 若要下载模块,公共模块需要 PowerShell 库的访问权限。

  • 托管依赖项当前不支持要求你接受许可证的模块,无论是通过交互方式接受许可证,还是通过在运行 Install-Module 时提供 -AcceptLicense 选项

专用模块

可以生成自己的专用 PowerShell 模块。 若要创建你的第一个 PowerShell 模块,请参阅编写 PowerShell 脚本模块

  1. Azure 门户的逻辑应用资源菜单中,在“开发工具”下,选择“高级工具”

  2. 在“高级工具”页中,选择“Go”。

  3. 在 Kudu Plus 工具栏上,从“调试控制台”菜单中,选择“CMD”

  4. 使用目录结构或命令行浏览到逻辑应用的根级别 (C:\home\site\wwwroot)

  5. 创建名为“模块”的文件夹

  6. 在“模块”文件夹中,创建与专用模块同名的子文件夹

  7. 在专用模块文件夹中,使用 psm1 文件扩展名添加专用 PowerShell 模块文件。 还可以包含具有 psd1 文件扩展名的可选 PowerShell 清单文件

完成后,完整的逻辑应用文件结构与以下示例类似:

MyLogicApp
-- execute_powershell_script.ps1
-- mytestworkflow.json
Modules
-- MyPrivateModule
--- MyPrivateModule.psd1
--- MyPrivateModule.psm1
-- MyPrivateModule2
--- MyPrivateModule2.psd1
--- MyPrivateModule2.psm1
requirements.psd1
host.json

编译错误

在此版本中,基于 Web 的编辑器包含有限的 IntelliSense 支持,目前仍在改进中。 保存工作流时会检测任何编译错误,并且 Azure 逻辑应用运行时会编译脚本。 这些错误通过 Application Insights 显示在逻辑应用的错误日志中。

运行时错误

工作流操作不返回任何输出。

请确保使用 Push-WorkflowOutput cmdlet

“执行 PowerShell 代码”操作失败:“无法识别‘{some-text}’一词…”

如果在 requirements.psd1 文件中错误地引用公共模块,或者 C:\home\site\wwwroot\Modules{module-name} 路径中不存在专用模块,则会出现以下错误

无法将“{some-text}”一词识别为 cmdlet、函数、脚本文件或可执行程序的名称。 检查名称的拼写,如果包含路径,请验证该路径是否正确,并重试。

注意

默认情况下,Az* 模块显示在 requirements.psd1 文件中,但在创建文件时会注释掉它们。 从模块引用 cmdlet 时,请确保取消注释模块。

“执行 PowerShell 代码”操作失败:“无法将实参绑定到形参‘Output’,因为它为 null”。

尝试将 null 对象推送到工作流时,会发生此错误。 确认要使用 Push-WorkflowOutput 发送的对象是否不为 null