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

在 Azure Stack Edge Pro 设备的正在运行的 VM 上部署自定义脚本扩展

适用范围:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro RYes for Mini R SKUAzure Stack Edge Mini R

自定义脚本扩展会将脚本或命令下载到 Azure Stack Edge Pro 设备的正在运行的虚拟机上并运行它们。 本文详细介绍如何使用 Azure 资源管理器模板来安装并运行自定义脚本扩展。

关于自定义脚本扩展

自定义脚本扩展适用于部署后配置、软件安装或任何其他的配置/管理任务。 可以从 Azure 存储或其他可访问的 Internet 位置下载脚本,也可以将脚本或命令提供给扩展运行时。

将自定义脚本扩展与 Azure 资源管理器模板集成。 也可使用 Azure CLI、PowerShell 或 Azure 虚拟机 REST API 来运行它。

适用于自定义脚本扩展的 OS

Windows 上的自定义脚本扩展支持的 OS

适用于 Windows 的自定义脚本扩展会在以下 OS 上运行。 其他版本可能也有效,但尚未在 Azure Stack Edge Pro 设备的正在运行的 VM 上进行内部测试。

分发 版本
Windows Server 2019 核心
Windows Server 2016 核心

Linux 上的自定义脚本扩展支持的 OS

适用于 Linux 的自定义脚本扩展会在以下 OS 上运行。 其他版本可能也有效,但尚未在 Azure Stack Edge Pro 设备的正在运行的 VM 上进行内部测试。

分发 版本
Linux:Ubuntu 18.04 LTS
Linux:Red Hat Enterprise Linux 7.4、7.5、7.7

先决条件

  1. 将 VM 模板和参数文件下载到客户端计算机。 将下载内容解压缩到将用作工作目录的那个目录中。

  2. 你应该已在设备上创建并部署 VM。 若要创建 VM,请按照使用模板在 Azure Stack Edge Pro 上部署 VM 中的所有步骤操作。

    如果需要从外部下载特定位置(例如 GitHub 或 Azure 存储)中的脚本,则请在配置计算网络时启用连接到 Internet 的端口,以便进行计算。 这样就可以下载脚本。

    在以下示例中,端口 2 已连接到 Internet 并用于启用计算网络。 如果你已在前面的步骤中确定不需要 Kubernetes,则可以跳过 Kubernetes 节点 IP 和外部服务 IP 的分配。

    Screenshot of the Compute pane for an Azure Stack Edge device. Compute settings for Port 2 are highlighted.

安装自定义脚本扩展

可以根据 VM 的操作系统安装适用于 Windows 或 Linux 的自定义脚本扩展。

适用于 Windows 的自定义脚本扩展

若要为设备上运行的 VM 部署适用于 Windows 的自定义脚本扩展,请编辑 addCSExtWindowsVM.parameters.json 参数文件,然后部署模板 addCSextensiontoVM.json

编辑参数文件

文件 addCSExtWindowsVM.parameters.json 采用以下参数:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "vmName": {
            "value": "<Name of VM>" 
        },
        "extensionName": {
            "value": "<Name of extension>" 
        },
        "publisher": {
            "value": "Microsoft.Compute" 
        },
        "type": {
            "value": "CustomScriptExtension" 
        },
        "typeHandlerVersion": {
            "value": "1.10" 
        },
        "settings": {
            "value": {
                "commandToExecute" : "<Command to execute>"
            }
        }
    }
}

请提供 VM 名称、扩展名称和要执行的命令。

下面是本文中使用过的参数文件示例。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "vmName": {
            "value": "VM5" 
        },
        "extensionName": {
            "value": "CustomScriptExtension" 
        },
        "publisher": {
            "value": "Microsoft.Compute" 
        },
        "type": {
            "value": "CustomScriptExtension" 
        },
        "typeHandlerVersion": {
            "value": "1.10" 
        },
        "settings": {
            "value": {
                "commandToExecute" : "md C:\\Users\\Public\\Documents\\test"
            }
        }
    }
}

部署模板

部署模板 addCSextensiontoVM.json。 此模板将扩展部署到现有 VM。 运行下面的命令:

$templateFile = "<Path to addCSExtensiontoVM.json file>"
$templateParameterFile = "<Path to addCSExtWindowsVM.parameters.json file>"
$RGName = "<Resource group name>"
New-AzureRmResourceGroupDeployment -ResourceGroupName $RGName -TemplateFile $templateFile -TemplateParameterFile $templateParameterFile -Name "<Deployment name>"

注意

扩展部署是一个长时间运行的作业,大约需要 10 分钟才能完成。

下面是示例输出:

PS C:\WINDOWS\system32> $templateFile = "C:\12-09-2020\ExtensionTemplates\addCSExtensiontoVM.json"
PS C:\WINDOWS\system32> $templateParameterFile = "C:\12-09-2020\ExtensionTemplates\addCSExtWindowsVM.parameters.json"
PS C:\WINDOWS\system32> $RGName = "myasegpuvm1"
PS C:\WINDOWS\system32> New-AzureRmResourceGroupDeployment -ResourceGroupName $RGName -TemplateFile $templateFile -TemplateParameterFile $templateParameterFile -Name "deployment7"

DeploymentName          : deployment7
ResourceGroupName       : myasegpuvm1
ProvisioningState       : Succeeded
Timestamp               : 12/17/2020 10:07:44 PM
Mode                    : Incremental
TemplateLink            :
Parameters              :
                          Name             Type                       Value
                          ===============  =========================  ==========
                          vmName           String                     VM5
                          extensionName    String                     CustomScriptExtension
                          publisher        String                     Microsoft.Compute
                          type             String                     CustomScriptExtension
                          typeHandlerVersion  String                     1.10
                          settings         Object                     {
                            "commandToExecute": "md C:\\Users\\Public\\Documents\\test"
                          }

Outputs                 :
DeploymentDebugLogLevel :

PS C:\WINDOWS\system32>

跟踪部署

要查看给定 VM 扩展的部署状态,请运行以下命令:

Get-AzureRmVMExtension -ResourceGroupName <Name of resource group> -VMName <Name of VM> -Name <Name of the extension>

下面是示例输出:

PS C:\WINDOWS\system32> Get-AzureRmVMExtension -ResourceGroupName myasegpuvm1 -VMName VM5 -Name CustomScriptExtension

ResourceGroupName       : myasegpuvm1
VMName                  : VM5
Name                    : CustomScriptExtension
Location                : dbelocal
Etag                    : null
Publisher               : Microsoft.Compute
ExtensionType           : CustomScriptExtension
TypeHandlerVersion      : 1.10
Id                      : /subscriptions/947b3cfd-7a1b-4a90-7cc5-e52caf221332/resourceGroups/myasegpuvm1/providers/Microsoft.Compute/virtualMachines/VM5/extensions/CustomScriptExtension
PublicSettings          : {
                            "commandToExecute": "md C:\\Users\\Public\\Documents\\test"
                          }
ProtectedSettings       :
ProvisioningState       : Creating
Statuses                :
SubStatuses             :
AutoUpgradeMinorVersion : True
ForceUpdateTag          :

PS C:\WINDOWS\system32>

注意

部署完成后,ProvisioningState 将变为 Succeeded

扩展输出将记录到可在目标虚拟机上的以下目录中找到的文件中。

C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension

指定的文件将下载到目标虚拟机上的以下文件夹中。

C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.*\Downloads\<n>

其中,n 是一个十进制整数,可以在不同的扩展执行之间更改。 1\.* 值与扩展的 typeHandlerVersion 的当前实际值匹配。 例如,此实例中的实际目录为 C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.9\Downloads\0

在此实例中,为自定义扩展执行的命令为 md C:\\Users\\Public\\Documents\\test。 成功安装扩展后,可以在命令中的指定路径验证是否已在 VM 中创建了目录。

适用于 Linux 的自定义脚本扩展

若要为设备上运行的 VM 部署适用于 Windows 的自定义脚本扩展,请编辑 addCSExtLinuxVM.parameters.json 参数文件,然后部署模板 addCSExtensiontoVM.json

编辑参数文件

文件 addCSExtLinuxVM.parameters.json 采用以下参数:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "vmName": {
            "value": "<Name of your VM>" 
        },
        "extensionName": {
            "value": "<Name of your extension>" 
        },
        "publisher": {
            "value": "Microsoft.Azure.Extensions" 
        },
        "type": {
            "value": "CustomScript" 
        },
        "typeHandlerVersion": {
            "value": "2.0" 
        },
        "settings": {
            "value": {
                "commandToExecute" : "<Command to execute>"
            }
        }
    }
}

请提供 VM 名称、扩展名称和要执行的命令。

下面是本文中使用过的一个参数文件示例:

$templateFile = "<Path to addCSExtensionToVM.json file>"
$templateParameterFile = "<Path to addCSExtLinuxVM.parameters.json file>"
$RGName = "<Resource group name>"
New-AzureRmResourceGroupDeployment -ResourceGroupName $RGName -TemplateFile $templateFile -TemplateParameterFile $templateParameterFile -Name "<Deployment name>"

注意

扩展部署是一个长时间运行的作业,大约需要 10 分钟才能完成。

下面是示例输出:

PS C:\WINDOWS\system32> $templateFile = "C:\12-09-2020\ExtensionTemplates\addCSExtensionToVM.json"
PS C:\WINDOWS\system32> $templateParameterFile = "C:\12-09-2020\ExtensionTemplates\addCSExtLinuxVM.parameters.json"
PS C:\WINDOWS\system32> $RGName = "myasegpuvm1"
PS C:\WINDOWS\system32> New-AzureRmResourceGroupDeployment -ResourceGroupName $RGName -TemplateFile $templateFile -TemplateParameterFile $templateParameterFile -Name "deployment99"

DeploymentName          : deployment99
ResourceGroupName       : myasegpuvm1
ProvisioningState       : Succeeded
Timestamp               : 12/18/2020 1:55:23 AM
Mode                    : Incremental
TemplateLink            :
Parameters              :
                          Name             Type                       Value
                          ===============  =========================  ==========
                          vmName           String                     VM6
                          extensionName    String                     LinuxCustomScriptExtension
                          publisher        String                     Microsoft.Azure.Extensions
                          type             String                     CustomScript
                          typeHandlerVersion  String                     2.0
                          settings         Object                     {
                            "commandToExecute": "sudo echo 'some text' >> /home/Administrator/file2.txt"
                          }

Outputs                 :
DeploymentDebugLogLevel :

PS C:\WINDOWS\system32>

commandToExecute 已设置为在 /home/Administrator 目录中创建文件 file2.txt,该文件的内容是 some text。 在这种情况下,你可以验证是否已在指定的路径中创建了该文件。

Administrator@VM6:~$ dir
file2.txt
Administrator@VM6:~$ cat file2.txt
some text
Administrator@VM6:

跟踪部署状态

模板部署是一个长时间运行的作业。 要检查给定 VM 扩展的部署状态,请打开另一个 PowerShell 会话(以管理员身份运行)。 运行下面的命令:

Get-AzureRmVMExtension -ResourceGroupName myResourceGroup -VMName <VM Name> -Name <Extension Name>

下面是示例输出:

PS C:\WINDOWS\system32> Get-AzureRmVMExtension -ResourceGroupName myasegpuvm1 -VMName VM5 -Name CustomScriptExtension

ResourceGroupName       : myasegpuvm1
VMName                  : VM5
Name                    : CustomScriptExtension
Location                : dbelocal
Etag                    : null
Publisher               : Microsoft.Compute
ExtensionType           : CustomScriptExtension
TypeHandlerVersion      : 1.10
Id                      : /subscriptions/947b3cfd-7a1b-4a90-7cc5-e52caf221332/resourceGroups/myasegpuvm1/providers/Microsoft.Compute/virtualMachines/VM5/extensions/CustomScriptExtension
PublicSettings          : {
                            "commandToExecute": "md C:\\Users\\Public\\Documents\\test"
                          }
ProtectedSettings       :
ProvisioningState       : Creating
Statuses                :
SubStatuses             :
AutoUpgradeMinorVersion : True
ForceUpdateTag          :

PS C:\WINDOWS\system32>

注意

部署完成后,ProvisioningState 将变为 Succeeded

扩展执行输出将记录到以下文件:/var/lib/waagent/custom-script/download/0/

删除自定义脚本扩展

若要删除自定义脚本扩展,请使用以下命令:

Remove-AzureRmVMExtension -ResourceGroupName <Resource group name> -VMName <VM name> -Name <Extension name>

下面是示例输出:

PS C:\WINDOWS\system32> Remove-AzureRmVMExtension -ResourceGroupName myasegpuvm1 -VMName VM6 -Name LinuxCustomScriptExtension
Virtual machine extension removal operation
This cmdlet will remove the specified virtual machine extension. Do you want to continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Yes
RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

后续步骤

Azure 资源管理器 cmdlets