【问题标题】:How to run a remote command (powershell/bash) against an existing Azure VM in Azure Data Factory V2?如何在 Azure 数据工厂 V2 中针对现有 Azure VM 运行远程命令(powershell/bash)?
【发布时间】:2019-05-09 10:48:26
【问题描述】:

我一直在尝试找到一种方法,使用 Azure Data Factory V2 对我现有的 Azure VM 运行一个简单的命令。

目前的选择:

  • 自定义活动/Azure Batch 不允许我将现有 VM 添加到池中
  • Azure Functions - 我没有玩过这个,但我没有找到任何使用 AZ Functions 的文档。
  • Azure Cloud Shell - 我已经尝试使用浏览器 UI 的 this 并且它可以工作,但是我找不到通过 ADF V2 执行此操作的方法

用例如下:

有一些任务在本地运行(Azure VM),我想使用 ADF 进行编排,因为其他所有任务都在 ADF 中,这些任务通常是 python 应用程序,用于恢复 SQL 备份和/或清除一些文件夹。

sqdb-restore -r myDatabase

其中sqldb-restore 是安装本地python 库后在本地识别的命令。不幸的是,python 应用程序需要本地存在于 VM 中。

有什么建议吗?谢谢。

【问题讨论】:

    标签: azure powershell azure-data-factory-2 azure-automation


    【解决方案1】:

    感谢@martin-esteban-zurita,他的回答帮助我找到了我需要的东西,这是一个美丽而有趣的实验。

    了解Azure Automation 用于许多与 Azure 中的资源编排(VM、服务、DevOps)有关的事情很重要,这种自动化可以通过 Powershell 和/或 Python 完成。

    在这种特殊情况下,我不需要修改/维护/编排任何 Azure 资源,我需要将 Bash/Powershell 命令远程实际运行到我现有的一个虚拟机中,其中我有多个 Powershell/Bash 命令在“任务计划程序”。 “任务计划程序”给我的数据管道增加了不必要的开销,因为它无法与 ADF 通信。

    此外,Azure 自动化仅在 Azure Cloud Shell 中本机运行 Powershell/Python 命令,这对于编排资源非常有用,例如打开/关闭 Azure VM、添加/删除其他 Azure 服务的权限、运行维护或清除进程等,但我仍然无法在现有 VM 中本地运行命令。这就是Hybrid Runbook Worker 出现的地方。混合工作组

    这些是完成此用例的步骤。

    1.创建 Azure 自动化帐户

    2。 Install 我现有 VM 中的 Windows Hybrid Worker。就我而言,这很棘手,因为我的代理给了我一些错误。我最终下载了 Nuget 包并手动安装它。

    .\New-OnPremiseHybridWorker.ps1 -AutomationAccountName <NameofAutomationAccount> -AAResourceGroupName <NameofResourceGroup>
    -OMSResourceGroupName <NameofOResourceGroup> -HybridGroupName <NameofHRWGroup>
    -SubscriptionId <AzureSubscriptionId> -WorkspaceName <NameOfLogAnalyticsWorkspace>
    

    请记住,在上面的代码中,您需要找到自己的参数值,唯一不必找到并创建的参数是HybridGroupName,这将定义混合组的名称

    3.创建 PowerShell 运行手册

    [CmdletBinding()]
    Param
    ([object]$WebhookData) #this parameter name needs to be called WebHookData otherwise the webhook does not work as expected.
    $VerbosePreference = 'continue'
    
    #region Verify if Runbook is started from Webhook.
    
    # If runbook was called from Webhook, WebhookData will not be null.
    if ($WebHookData){
    
        # Collect properties of WebhookData
        $WebhookName     =     $WebHookData.WebhookName
        # $WebhookHeaders  =     $WebHookData.RequestHeader
        $WebhookBody     =     $WebHookData.RequestBody
    
        # Collect individual headers. Input converted from JSON.
        $Input = (ConvertFrom-Json -InputObject $WebhookBody)
        # Write-Verbose "WebhookBody: $Input"
        #Write-Output -InputObject ('Runbook started from webhook {0} by {1}.' -f $WebhookName, $From)
    }
    else
    {
       Write-Error -Message 'Runbook was not started from Webhook' -ErrorAction stop
    }
    #endregion
    
    # This is where I run the commands that were in task scheduler
    
    $callBackUri = $Input.callBackUri
    
     # This is extremely important for ADF
     Invoke-WebRequest -Uri $callBackUri -Method POST
    

    4.创建一个指向 Hybrid Worker 的 VM 的 Runbook Webhook

    4.在 ADF 中创建一个webhook activity,其中将通过 POST 方法调用上述 PowerShell Runbook 脚本

    重要提示:当我创建 webhook 活动时,它在 10 分钟后超时(默认),所以我注意到在 Azure 自动化帐户中,我实际上正在获取包含 JSON 结构的 INPUT 数据 (WEBHOOKDATA),其中包含以下元素:

    • Webhook 名称
    • RequestBody(这个包含你在 Body 中添加的任何内容以及一个名为 callBackUri 的默认元素)

    我所要做的就是从 Azure 自动化调用 callBackUri。这就是我在 PowerShell Runbook 代码中添加Invoke-WebRequest -Uri $callBackUri -Method POST 的原因。这样,ADF 就会成功/失败,而不是超时。

    在我的虚拟机中安装混合工作器时,我还遇到了许多其他细节问题,但这些细节更具体到您的环境/公司。

    【讨论】:

    • 真棒教程扫罗!
    【解决方案2】:

    这看起来像是一个 Azure 自动化支持的用例,使用混合工作器。试试看这里:https://docs.microsoft.com/en-us/azure/automation/automation-hybrid-runbook-worker

    您可以使用 Web Activity 在 ADFv2 中通过 webhook 调用运行手册。

    希望这有帮助!

    【讨论】:

    • 谢谢 Martin,会试一试,我以前读过,但我不知道 ADF V2 中的 webhook,会尝试回复您。
    • 我只在 PowerShell 中使用过,但是您应该能够创建一个使用 powershell 调用 python 的 runbook 脚本,为这个 runbook 创建一个 webhook,并使用 ADF 调用它。不要害怕询问您是否需要更多帮助:)
    • 非常感谢,在了解了如何使用混合工作器和运行手册几个小时后,我终于能够重现该用例。我将在此问题的单独答案中提供完整答案,但是您的建议值得得到答案。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多