Попытка внедрить команды powershell в виртуальные машины Azure RM через пользовательское расширение шаблона JSON.

Обе эти строки кода отлично работают при загрузке, распаковке и выполнении всех моих файлов .bat и .msi локально на моих виртуальных машинах Azure RM. отверстий, так как я очень новичок во всем этом.

Я безуспешно пытался запустить их через расширение пользовательского сценария JSON через общий файловый ресурс Azure, а также пытался получить их через контейнеры больших двоичных объектов с теми же результатами. Я продолжаю получать подробное сообщение об ошибке «Не удается найти сетевой путь». и я сканировал журналы и не могу найти информацию о том, как обойти это. Правильно ли я подхожу к тому, чего пытаюсь достичь? Есть ли лучший способ автоматически устанавливать мои установки при развертывании с динамическими параметрами?

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

С нетерпением жду любой помощи, которую я могу получить, я застрял на этом шаге уже около двух недель. Если вам нужна дополнительная информация или если я что-то неясно, пожалуйста, скажите мне, и я посмотрю, что я могу сделать. Пишу первый раз, читал давно.


person Stefan    schedule 25.04.2016    source источник


Ответы (4)


"Сетевой путь не найден." заставьте меня поверить, что это что-то вроде > аналогичная ситуация здесь, где я думаю, что прикрепить файл azure в качестве сетевого диска со сценарием не всегда надежно. Я дал решение для прямой загрузки из файла Azure в связанной теме, которая, я думаю, также поможет вам. Дайте мне знать, если это не сработает для вас.

person Kai Zhao    schedule 25.04.2016
comment
Большое спасибо, Кай Чжао, посмотрю как можно скорее! :) - person Stefan; 26.04.2016

Вы также можете ознакомиться с образцом здесь:

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

А потом посмотрите на папку:

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

Образец шаблона в папке использует расширение настраиваемого скрипта для установки файла из хранилища BLOB-объектов Azure (или другого URL-адреса).

Корень репозитория содержит скрипт PowerShell, который выполняет две функции:

  1. копирует файл для установки с локального компьютера (например, компьютера сборки) в хранилище Azure и защищает его с помощью sasToken и
  2. Развертывает шаблон AzureRM и передает в развертывание URI и sasToken для большого двоичного объекта.

Также обратите внимание на «forceUpdateTag» в образце (см.: Проблемы с развертыванием dscExtension в Azure VMSS). Если вам нужно развернуть шаблон json снова и снова, это необходимо для запуска расширения, когда виртуальная машина уже существует (вы также можете Remove-AzureRMVMExtension через PowerShell, тег может быть быстрее).

person bmoore-msft    schedule 27.04.2016

Если ваш сценарий не содержит никаких секретов или интеллектуальной собственности, вы можете загрузить его в контейнер хранилища BLOB-объектов и установить для политики доступа значение «blob» (а не «private»). ), и тогда вам не придется беспокоиться о токенах SAS.

Этот шаблон работал у меня (сегодня, 28 апреля 2016 г.) с хранилищем 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'))]"
    }
  }
}
person Mark Arnott    schedule 28.04.2016
comment
Возможно, Microsoft может объяснить, почему другие мои расширения имеют type='extensions', но это имеет type='Microsoft.Compute/virtualMachines/extensions', но сегодня оно работает. - person Mark Arnott; 28.04.2016
comment
Я думаю, что они изменили его несколько месяцев назад, он действительно выглядит так, когда вы просматриваете миллиарды руководств. :) - person Stefan; 02.05.2016

Мне удалось взломать его в начале этих выходных. Сделал мои сценарии динамическими с помощью параметров 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, вероятно, не нужны, но на данный момент они выполняют свою работу, и теперь у меня есть развертывание одним щелчком мыши, которое я могу продолжать развивать.

person Stefan    schedule 02.05.2016