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

时间:2016-04-25 15:05:32

标签: json powershell azure azure-resource-manager arm-template

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

我一直试图通过一个JSON自定义脚本扩展通过Azure文件共享来拍摄它们,但也试图通过具有相同结果的blob容器来获取它们。我一直收到“无法找到网络路径”的详细错误消息。我一直在扫描日志,找不到任何有关如何解决这个问题的信息。我正在以正确的方式接近我想要实现的目标吗?有没有更好的方法在使用动态参数部署时自动安装?

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')]"
        }
      }
    }

期待我能得到的任何帮助,我已经坚持了这个步骤大约两个星期了。如果您想要任何其他信息或者我不清楚,请告诉我,我会看到我能做些什么。第一次发帖,长时间读者。

4 个答案:

答案 0 :(得分:0)

“无法找到网络路径。”让我相信这是similar situation here的一种我认为附加azure文件作为带脚本的网络驱动器并不总是可靠的。我已经给出了一个解决方案,直接从Azure文件下载链接主题,我认为也会对你有所帮助。如果它不适合你,请告诉我。

答案 1 :(得分:0)

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

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

然后查看文件夹:

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

文件夹中的示例模板使用自定义脚本扩展来从Azure blob存储(或其他网址)安装文件。

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

  1. 复制文件以从本地计算机(例如构建计算机)安装到Azure存储中,并使用sasToken和
  2. 进行保护。
  3. 部署AzureRM模板并将blob的URI和sasToken传递到部署中。
  4. 另请注意示例中的“forceUpdateTag”(请参阅​​:Issues deploying dscExtension to Azure VMSS)。如果您需要反复部署json模板,则需要在VM已存在时运行扩展(您还可以通过PowerShell删除-AceanRMVMExtension,标签可能更快)。

答案 2 :(得分:0)

如果您的脚本不包含任何机密或知识产权,您可以将其上传到blob存储容器并将访问策略设置为' blob ' (不是' 私人')然后您不必担心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'))]"
    }
  }
}

答案 3 :(得分:0)

本周末我成功破解了它。通过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')]"
        }
      }
    }

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

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模板中的受保护设置可能是不必要的,但目前它完成了工作,我现在有一个单击部署,我可以继续构建。