在 Linux 虚拟机上使用 Azure 自定义脚本扩展

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

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

本文详细介绍如何使用 Azure CLI 中的自定义脚本扩展以及如何使用 Azure 资源管理器模板运行扩展。 本文还提供针对 Linux 系统的疑难解答步骤。

扩展配置

自定义脚本扩展配置指定脚本位置和要运行命令等设置。 可将此配置存储在配置文件中、在命令行中指定,或者在 Azure 资源管理器模板中指定该配置。

可将敏感数据存储在受保护的配置中,此配置经过加密,只能在虚拟机内部解密。 当执行命令包含机密(例如密码)时,受保护的配置相当有用。

公共配置

公共配置的架构如下所示。

Note

这些属性名称区分大小写。 要避免部署问题,请使用如下所示的名称。

  • commandToExecute(必需,字符串):要运行的入口点脚本。
  • fileUris(可选,字符串数组):要下载的文件的 URL。
  • timestamp(可选,整数):脚本的时间戳。 仅当要触发脚本的重新运行操作时才可更改此字段的值。
{
  "fileUris": ["<url>"],
  "commandToExecute": "<command-to-execute>"
}

受保护的配置

受保护的配置的架构如下所示。

Note

这些属性名称区分大小写。 要避免部署问题,请使用如下所示的名称。

  • commandToExecute(可选,字符串):要运行的入口点脚本。 如果命令包含机密(例如密码),请使用此字段。
  • storageAccountName(可选,字符串):存储帐户的名称。 如果指定存储凭据,所有文件 URI 必须是 Azure Blob 的 URL。
  • storageAccountKey(可选,字符串):存储帐户的访问密钥。
{
  "commandToExecute": "<command-to-execute>",
  "storageAccountName": "<storage-account-name>",
  "storageAccountKey": "<storage-account-key>"
}

Azure CLI

在使用 Azure CLI 运行自定义脚本扩展时,请创建一个或多个配置文件。 配置文件至少要包含文件 URI 和脚本执行命令。

Note

在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud 来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud

az vm extension set --resource-group myResourceGroup --vm-name myVM --name customScript --publisher Microsoft.Azure.Extensions --settings ./script-config.json

(可选)可以在命令中以 JSON 格式字符串的形式指定设置。 这样,便可以在执行期间指定配置,而无需使用单独的配置文件。

az vm extension set '
  --resource-group exttest `
  --vm-name exttest `
  --name customScript `
  --publisher Microsoft.Azure.Extensions `
  --settings '{"fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],"commandToExecute": "./config-music.sh"}'

Azure CLI 示例

包含脚本文件的公共配置

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}

Azure CLI 命令:

az vm extension set --resource-group myResourceGroup --vm-name myVM --name customScript --publisher Microsoft.Azure.Extensions --settings ./script-config.json

不包含脚本文件的公共配置

{
  "commandToExecute": "apt-get -y update && apt-get install -y apache2"
}

Azure CLI 命令:

az vm extension set --resource-group myResourceGroup --vm-name myVM --name customScript --publisher Microsoft.Azure.Extensions --settings ./script-config.json

公共和受保护的配置文件

使用公共配置文件来指定脚本文件 URI。 使用受保护的配置文件来指定要运行的命令。

公共配置文件:

{
  "fileUris": ["https://gist.github.com/ahmetalpbalkan/b5d4a856fe15464015ae87d5587a4439/raw/466f5c30507c990a4d5a2f5c79f901fa89a80841/hello.sh"]
}

受保护的配置文件:

{
  "commandToExecute": "./hello.sh <password>"
}

Azure CLI 命令:

az vm extension set --resource-group myResourceGroup --vm-name myVM --name customScript --publisher Microsoft.Azure.Extensions --settings ./script-config.json --protected-settings ./protected-config.json

Resource Manager 模板

可使用资源管理器模板在虚拟机部署时运行 Azure 自定义脚本扩展。 为此,请将格式正确的 JSON 添加到部署模板。

资源管理器示例

公共配置

{
    "name": "scriptextensiondemo",
    "type": "extensions",
    "location": "[resourceGroup().location]",
    "apiVersion": "2015-06-15",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', parameters('scriptextensiondemoName'))]"
    ],
    "tags": {
        "displayName": "scriptextensiondemo"
    },
    "properties": {
        "publisher": "Microsoft.Azure.Extensions",
        "type": "CustomScript",
        "typeHandlerVersion": "2.0",
        "autoUpgradeMinorVersion": true,
      "settings": {
        "fileUris": [
          "https://gist.github.com/ahmetalpbalkan/b5d4a856fe15464015ae87d5587a4439/raw/466f5c30507c990a4d5a2f5c79f901fa89a80841/hello.sh"
        ],
        "commandToExecute": "sh hello.sh"
      }
    }
}

受保护配置中的执行命令

{
  "name": "config-app",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2015-06-15",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.0",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://gist.github.com/ahmetalpbalkan/b5d4a856fe15464015ae87d5587a4439/raw/466f5c30507c990a4d5a2f5c79f901fa89a80841/hello.sh"
      ]              
    },
    "protectedSettings": {
      "commandToExecute": "sh hello.sh <password>"
    }
  }
}

有关完整示例,请参阅 .NET Music 商店演示

故障排除

运行自定义脚本扩展时,会创建脚本,或将脚本下载到类似于以下示例的目录中。 命令输出也会保存到此目录中的 stdoutstderr 文件中。

/var/lib/waagent/custom-script/download/0/

Azure 脚本扩展生成一个日志,位置如下:

/var/log/azure/custom-script/handler.log

也可使用 Azure CLI 来检索自定义脚本扩展的执行状态:

az vm extension list -g myResourceGroup --vm-name myVM

输出类似于以下文本:

info:    Executing command vm extension get
+ Looking up the VM "scripttst001"
data:    Publisher                   Name                                      Version  State
data:    --------------------------  ----------------------------------------  -------  ---------
data:    Microsoft.Azure.Extensions  CustomScript                              2.0      Succeeded
data:    Microsoft.OSTCExtensions    Microsoft.Insights.VMDiagnosticsSettings  2.3      Succeeded
info:    vm extension get command OK

后续步骤

有关其他 VM 脚本扩展的信息,请参阅适用于 Linux 的 Azure 脚本扩展概述