Sysprep Azure VM с помощью задачи PowerShell в конвейере - PullRequest
2 голосов
/ 25 января 2020

Мое (do tNET) приложение создается (используя Windows размещенный агент) из конвейера сборки, и в последующем конвейере выпуска я предоставляю виртуальную машину 16GB-Win2016 (с поддержкой RDP, HTTP, HTTPS, WinRM и S SH), в которые я вручную запускаю RDP (здесь есть задача «Вмешательство вручную») и настраиваю WinRM (следуя этой статье: https://docs.microsoft.com/en-us/azure/marketplace/cloud-partner-portal/virtual-machine/cpp-configure-winrm-after-vm-creation#configure -vm-to-enable-winrm ). Все хорошо, пока здесь. Следующая задача - это задача Azure File Copy, которая по существу копирует артефакты сборки (из $(System.DefaultWorkingDirectory)) и вставляет в указанный мной каталог. Работает как шарм. Следующая задача, которую я имею, состоит в том, чтобы создать виртуальный жесткий диск всей этой виртуальной машины (по существу, после того, как копирование завершено).

Я знаю, что могу вручную RDP в виртуальную машину (снова) и sysprep (с oobe / generalize). / shutdown), затем, возможно, go обратно на Azure Portal and Disk Export OS Disk (с указанием срока действия URL-адреса SAS в любое время (36000 на статью)), НО все это можно автоматизировать?

Итак, короче говоря, я хотел бы знать, можно ли выполнить sysprep oobe/generalize/shutdown удаленно, предпочтительно с помощью задачи PS. Я понимаю, что другая часть (экспорт диска и все) может быть, но если sysprep можно сделать удаленно, ничего подобного.

Ответы [ 4 ]

1 голос
/ 04 февраля 2020

Я попробовал это и получил то, что хотел:

$sysprep= 'C:\Windows\System32\Sysprep\Sysprep.exe'
$arg1 = '/generalize'
$arg2 = '/oobe'
$arg3 = '/shutdown'
$arg4 = '/quiet'

& $sysprep $arg1 $arg2 $arg3 $arg4 -Wait
0 голосов
/ 03 марта 2020

Убедитесь, что вы НЕ используете Azure расширение собственного сценария для запуска sysprep.

Azure сценарии, запускаемые в контексте пользователя LocalSystem: source

Расширение пользовательских сценариев будет работать под учетной записью LocalSystem

Это проблематично c, поскольку sysprep НЕ поддерживает запуск в контексте системного пользователя: source

Sysprep не может быть запущен в контексте системной учетной записи. Например, запуск Sysprep в контексте системной учетной записи с использованием планировщика заданий или PSExe c не поддерживается.

Предоставление этой возможности, чтобы люди избежали моей ошибки:)

0 голосов
/ 25 января 2020

Вы можете реализовать это, используя Azure расширение собственного скрипта. Существует проект github: https://github.com/jlongo62/AzureVMToImage, содержащий сценарии powershell для создания образа виртуальной машины. Эти сценарии были созданы для сохранения виртуальной машины при создании образа вместо уничтожения исходной виртуальной машины. Сценарии могут быть вызваны из Azure Devops. Нет необходимости проходить проверку подлинности на виртуальной машине.

Основная информация о том, что вам нужно:

1 - создать большой двоичный объект хранилища, содержащий следующий сценарий (-Wait очень важен):

Start-Process -FilePath C:\Windows\System32\Sysprep\Sysprep.exe -ArgumentList '/generalize /oobe /quiet /quit'  -Wait 

2 - вызвать его на виртуальной машине:

$response = Set-AzureRmVMCustomScriptExtension  `
                -ResourceGroupName  $vm.ResourceGroupName `
                -VMName $vm.Name `
                -Location $vm.Location `
                -Name $ExtensionName  `
                -FileUri $blobUri  `
                -Run $FileName 
0 голосов
/ 25 января 2020

Итак, вам не нужно настраивать winrm вручную, вы можете настроить его \ настроить его при подготовке vm. и если \ когда работает winrm, вы можете просто использовать удаленное взаимодействие powershell, чтобы выдать команду для vm с:

Invoke-Command -ComputerName dnsname\ipaddress_goes_hehe
    -ScriptBlock { sysprep /shutdown /generalise}

https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-winrm-windows

...