如何对Azure Data Factory V2中的现有Azure VM运行远程命令(PowerShell / Bash)?

时间:2019-05-07 17:31:06

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

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

到目前为止的选项:

  • 自定义活动/ Azure批处理不允许我将现有VM添加到池中
  • Azure函数-我还没有玩过,但是我没有使用AZ函数找到关于此的任何文档。
  • Azure Cloud Shell-我已经尝试使用浏览器用户界面this并成功运行,但是我找不到通过ADF V2做到这一点的方法

用例如下:

我想使用ADF协调任务计划程序中本地运行的一些任务(Azure VM),因为其他所有内容都在ADF中,这些任务通常是可恢复SQL备份和/或清除某些任务的python应用程序文件夹。

sqdb-restore -r myDatabase

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

有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

在这种特殊情况下,我不需要修改/维护/编排任何Azure资源,我实际上需要在我现有的其中一个VM中远程运行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,这将定义Hybrid的名称。组

3。创建PowerShell Runbook

[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

enter image description here

enter image description here

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

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

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

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

在VM中安装混合工作程序时,我还有很多其他细节需要解决,但这些细节更特定于您的环境/公司。

答案 1 :(得分:1)

这看起来像使用混合工作程序的Azure自动化支持的用例。尝试在这里阅读:https://docs.microsoft.com/en-us/azure/automation/automation-hybrid-runbook-worker

您可以使用网络活动在ADFv2中调用带有网络钩子的Runbook。

希望这对您有帮助!