0

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

我一直在尝试通过 Azure 文件共享通过 JSON 自定义脚本扩展来拍摄它们,但也无济于事,也一直在尝试通过 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

4 回答 4

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

于 2016-05-02T12:24:05.360 回答
0

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

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

然后查看文件夹:

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

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

存储库的根目录包含一个 PowerShell 脚本,它执行 2 件事:

  1. 将要安装的文件从本地机器(例如构建机器)复制到 Azure 存储并使用 sasToken 和
  2. 部署 AzureRM 模板并将 blob 的 URI 和 sasToken 传递到部署中。

另请注意示例中的“forceUpdateTag”(请参阅​​:将 dscExtension 部署到 Azure VMSS 的问题)。如果您需要反复部署 json 模板,则需要在 VM 已经存在时才能运行扩展(您也可以通过 PowerShell Remove-AzureRMVMExtension,标记可能更快)。

于 2016-04-27T14:18:52.773 回答
0

“找不到网络路径。” 让我相信这是一种类似的情况,我认为将 azure 文件附加为带有脚本的网络驱动器并不总是可靠的。我在链接的主题中给出了一个直接从 Azure 文件下载的解决方案,我认为这也会对您有所帮助。让我知道它是否不适合你。

于 2016-04-25T15:35:09.313 回答
0

如果您的脚本不包含任何机密或知识产权,您可以将其上传到 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'))]"
    }
  }
}
于 2016-04-28T18:27:18.263 回答