尝试通过 JSON 模板自定义扩展将 powershell 命令注入到 Azure RM VM

Trying to inject powershell commands in to Azure RM VMs via JSON template Custom Extension

这两行代码在我的 Azure RM VM 上本地下载、解压缩和执行我的所有 .bat 和 .msi 文件时都非常完美,我一直在通过我修改过的 ARM 模板进行部署太疯狂了,它可能充满了漏洞,因为我对这一切都很陌生。

我一直在尝试通过 Azure 文件共享通过 JSON 自定义脚本扩展来启动它们,但无济于事,我也一直在尝试通过 blob 容器启动它们,结果相同。我不断收到 "The network path can not be found." 的详细错误消息,我一直在扫描日志,但找不到有关如何解决此问题的任何信息。我是否正在以正确的方式接近我想要实现的目标?有没有更好的方法让我的安装在部署时使用动态参数自动启动?

cmdkey /add:$ArtifactsStorageAccountName.file.core.windows.net /u:$ArtifactsStorageAccountName /pass:$StorageAccountKey
Copy-Item -Path $InstallCustomScriptExtensionScriptFilePath -Destination C:\
Copy-Item -Path $InstallCustomScriptExtensionZIPFilePath -Destination C:\
Unblock-File -Path C:\UnzipMetaforceInstall.ps1
powershell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1
PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\InstallMetaforce /u:artifactsstoaccastst $StorageAccountKey
PowerShell Copy-Item -Path Z:\UnzipMetaforceInstall.ps1 -Destination C:\
PowerShell Copy-Item -Path Z:\InstallMetaforce.zip -Destination C:\
PowerShell Unblock-File -Path C:\UnzipMetaforceInstall.ps1
PowerShell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1

    {
      "name": "InstallCustomScriptExtension",
      "type": "extensions",
      "location": "[variables('location')]",
      "apiVersion": "2015-06-15",
      "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
        "DSCConfig"
      ],
      "tags": {
        "displayName": "InstallCustomScriptExtension"
      },
      "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.4",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "fileUris": [
            "[parameters('InstallCustomScriptExtensionScriptFilePath')]"
          ],
          "commandToExecute": "[parameters('CommandToExecuteCustomScript')]"
        },
        "protectedSettings": {
          "storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
          "storageAccountKey": "[parameters('StorageAccountKey')]"
        }
      }
    }

期待能得到任何帮助,我已经在这一步停留了大约两周了。如果您需要任何其他信息,或者如果我有任何不清楚的地方,请告诉我,我会看看我能做些什么。第一次发帖,好久reader.

"The network path can not be found." 让我相信这是一种 我认为将 azure 文件附加为带有脚本的网络驱动器并不总是可靠的。我在链接主题中提供了直接从 Azure 文件下载的解决方案,我认为这对您也有帮助。如果它不适合你,请告诉我。

您也可以在此处查看示例:

https://github.com/bmoore-msft/AzureRM-Samples

然后查看文件夹:

https://github.com/bmoore-msft/AzureRM-Samples/tree/master/VMCSEInstallFilePS

文件夹中的示例模板使用自定义脚本扩展从 Azure blob 存储(或另一个 url)安装文件。

repo 的根包含一个 PowerShell 脚本,它可以做两件事:

  1. 将要安装的文件从本地计算机(例如构建计算机)复制到 Azure 存储中,并使用 sasToken 和
  2. 对其进行保护
  3. 部署 AzureRM 模板并将 blob 的 URI 和 sasToken 传递到部署中。

还要注意示例中的 "forceUpdateTag"(参见:)。如果您需要一遍又一遍地部署 json 模板,这需要在 VM 已经存在时获得 运行 的扩展(您也可以通过 PowerShell Remove-AzureRMVMExtension,标签可能更快).

如果您的脚本不包含任何机密或知识 属性,您可以将其上传到 blob 存储容器并将访问策略设置为“blob” (不是'private')然后你就不用担心 SAS 令牌了。

此模板适用于我(今天是 2016 年 4 月 28 日),具有 blob 存储和 powershell。

{
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "name": "[concat(variables('vmName'),'/CustomScriptExtension')]",
  "apiVersion": "2015-06-15",
  "location": "[resourceGroup().location]",
  "tags": {
    "displayName": "CustomScriptExtension"
  },
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
  ],
  "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.8",
    "settings": {
      "fileUris": [ "[parameters('launchScriptBlobUri')]" ],
      "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -file ',parameters('scriptFileName'))]"
    }
  }
}

我本周末早些时候成功破解了它。通过 powershell / JSON 参数也使我的脚本动态化,它就像一个魅力。

        {
      "name": "InstallCustomScriptExtension",
      "type": "extensions",
      "location": "[variables('location')]",
      "apiVersion": "2015-06-15",
      "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
        "DSCConfig"
      ],
      "tags": {
        "displayName": "InstallCustomScriptExtension"
      },
      "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.4",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "fileUris": [
            "[concat(parameters('_artifactsLocation'), '/', parameters('InstallCustomScriptExtensionScriptFilePath'))]"
          ],
          "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ', parameters('InstallCustomScriptExtensionScriptFilePath'), ' -ArtifactsStorageAccountName ', parameters('ArtifactsStorageAccountName'), ' -FileShareName ', parameters('FileShareName'), ' -StorageAccountKey ', parameters('StorageAccountKey'))]"
        },
        "protectedSettings": {
          "storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
          "storageAccountKey": "[parameters('StorageAccountKey')]"
        }
      }
    }

我的解压脚本内部现在看起来像这样:

param(
[string]$ArtifactsStorageAccountName,
[string]$FileShareName,
[string]$StorageAccountKey
)

PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\Install /u:$ArtifactsStorageAccountName $StorageAccountKey; PowerShell Copy-Item -Path Z:\Install.zip -Destination C:\;
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\Install.zip")
MkDir("C:\Install")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\Install").CopyHere($item)
}

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

cd "C:\Install"
Unblock-File -Path "C:\Install\Install.ps1"
"C:\Install\Install.ps1" | Invoke-Expression

它可能需要做更多的工作,我的 JSON 模板中的受保护设置可能是不必要的,但目前它完成了工作,我现在有了一个可以继续构建的一键式部署。