Как я могу избежать ошибок 16001 при использовании Azure Image Builder? - PullRequest
1 голос
/ 06 августа 2020

Я использую версию PowerShell из Azure Image Builder ( AIB ). Было успешно развернуто несколько образов Windows 10 с помощью встроенного настройщика PowerShell , но при развертывании Windows Server 2019 он кажется действительно нестабильным. Если посмотреть на customization.log во временной учетной записи хранения, связанной с шаблон, PowerShell завершает работу с кодом 16001.

Вот файл успешной настройки из сборки Windows 10:

Start-Transcript -Path "C:\transcript0.txt" -NoClobber -Force
New-Item -Path "C:\Temp" -ItemType Directory -Force
Add-Content -Path C:\Temp\about_this_vm.txt -Value "This VM was built and configured by $([System.Environment]::UserName) on $((Get-Date).ToString())." -Force
$FSLogix = "https://aka.ms/fslogix_download"
$Save = "C:\Temp\FSLogix.zip"
$Install = "C:\Temp\FSLogix\x64\Release\FSLogixAppsSetup.exe"
$null = Invoke-WebRequest -Uri $FSLogix -OutFile $Save
$null = Expand-Archive -Path $Save -DestinationPath "C:\Temp\FSLogix"
$null = & $Install /install /passive /quiet
$GP = "& cmd.exe /c sc privs gpsvc SeManageVolumePrivilege/SeTcbPrivilege/SeTakeOwnershipPrivilege/SeIncreaseQuotaPrivilege/SeAssignPrimaryTokenPrivilege/SeSecurityPrivilege/SeChangeNotifyPrivilege/SeCreatePermanentPrivilege/SeShutdownPrivilege/SeLoadDriverPrivilege/SeRestorePrivilege/SeBackupPrivilege/SeCreatePagefilePrivilege"
Add-Content -Path "C:\Temp\gp_script.ps1" -Value "Start-Transcript -Path C:\transcript1.txt"
Add-Content -Path "C:\Temp\gp_script.ps1" -Value $GP
Add-Content -Path "C:\Temp\gp_script.ps1" -Value "Stop-Transcript"
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-ExecutionPolicy Bypass -File C:\Temp\gp_script.ps1 -NoProfile" -WorkingDirectory "C:\Temp"
Register-ScheduledTask -TaskName "GP_Service_Perms" -Action $Action -RunLevel Highest -User "NT AUTHORITY\SYSTEM" -Force
$null = Start-ScheduledTask -TaskName "GP_Service_Perms"
Start-Sleep -Seconds 10
Get-ChildItem -Path "C:\Temp" -Recurse | Remove-Item -Force
Stop-Transcript

Вот что я делаю для сбоя сборка образа сервера. Ничего слишком сложного:

Start-Transcript -Path "C:\transcript_$(Get-Date -Format 'yyyyMMddHHmmss').txt" -NoClobber -Force
Write-Host "Creating Temp Directory"
New-Item -Path "C:\Temp" -ItemType Directory -Force
Write-Host "Uninstalling Windows Defender"
$null = Uninstall-WindowsFeature Windows-Defender
Write-Host "Installing Telnet-Client"
$null = Install-WindowsFeature -Name Telnet-Client
Write-Host "Setting Firewall"
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False
Get-NetFirewallProfile | Select-Object Name,Enabled
Write-Host "Downloading SCCM Client"
$SCCMSave = 'C:\Temp\ccmsetup.exe'
$SCCMPackage = "https://storage-account.blob.core.windows.net/some-container/some-blob?redacted" # Read-only SAS token
Write-Host "Downloading AZCopy"
$null = Invoke-WebRequest -Uri 'https://aka.ms/downloadazcopy-v10-windows' -OutFile C:\Temp\azcopy.zip
$null = Expand-Archive C:\Temp\azcopy.zip C:\Temp
$AzCopyExe = Get-ChildItem -Path C:\Temp -Recurse -Name azcopy.exe
$null = Copy-Item -Path (Join-Path -Path "C:\Temp" -ChildPath $AzCopyExe) -Destination "C:\Temp"
$null = & C:\Temp\azcopy.exe copy $SCCMPackage $SCCMSave
Write-Host "Downloading PowerShell Core"
$PwshClient = "https://github.com/PowerShell/PowerShell/releases/download/v7.0.3/PowerShell-7.0.3-win-x64.msi"
$PwshSave = "C:\Temp\PowerShell-7.0.3-win-x64.msi"
$null = Invoke-WebRequest -Uri $PwshClient -OutFile $PwshSave
Write-Host "Installing PowerShell Core"
Start-Process -FilePath msiexec.exe -ArgumentList "/package C:\Temp\PowerShell-7.0.3-win-x64.msi /quiet /passive ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1" -PassThru
Write-Host "Waiting for PowerShell Core to install"
$count = 1
while ($ProcessQuit -ne $true) { $Installer = Get-Process -Id $PwshInstall.Id -ErrorAction SilentlyContinue; if ($null -eq $Installer) { $ProcessQuit = $true } else { "ProcessRunning$Count"; $count++; Start-Sleep -Seconds 5 } }
Write-Host "Adding about_this_vm.txt to C:\Temp"
New-Item -Path "C:\Temp\about_this_vm.txt" -ItemType File -Force
Write-Host "Adding about_this_vm.txt to C:\Temp"
Add-Content -Path C:\Temp\about_this_vm.txt -Value "This VM was built and configured by $([System.Environment]::UserName) on $((Get-Date).ToString())." -Force
Write-Host "Closing script."
Stop-Transcript

Вот соответствующая часть журнала Packer:

[some-guid] PACKER ERR 2020/08/06 11:06:24 packer: <Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><Obj S="progress" RefId="0"><TN RefId="0"><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><I64 N="SourceId">1</I64><PR N="Record"><AV>Preparing modules for first use.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS></Obj></Objs>2020/08/06 11:06:24 [INFO] starting remote command: powershell -executionpolicy bypass -file "C:/Windows/Temp/packer-elevated-shell-5f2be428-8c55-71c2-eb40-eb2999597f29.ps1"
[some-guid] PACKER OUT     azure-arm: Transcript started, output file is C:\transcript_20200806110629.txt
[some-guid] PACKER OUT     azure-arm: Creating Temp Directory
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm:     Directory: C:\
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm: Mode                LastWriteTime         Length Name
[some-guid] PACKER OUT     azure-arm: ----                -------------         ------ ----
[some-guid] PACKER OUT     azure-arm: d-----         8/6/2020  11:06 AM                Temp
[some-guid] PACKER OUT     azure-arm: Uninstalling Windows Defender
[some-guid] PACKER OUT     azure-arm: WARNING: You must restart this server to finish the removal process.
[some-guid] PACKER OUT     azure-arm: Installing Telnet-Client
[some-guid] PACKER OUT     azure-arm: WARNING: You must restart this server to finish the installation process.
[some-guid] PACKER OUT     azure-arm: Setting Firewall
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm: Name    : Domain
[some-guid] PACKER OUT     azure-arm: Enabled : False
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm: Name    : Private
[some-guid] PACKER OUT     azure-arm: Enabled : False
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm: Name    : Public
[some-guid] PACKER OUT     azure-arm: Enabled : False
[some-guid] PACKER OUT     azure-arm:
[some-guid] PACKER OUT     azure-arm: Downloading SCCM Client
[some-guid] PACKER OUT     azure-arm: Downloading AZCopy
[some-guid] PACKER OUT     azure-arm: Downloading PowerShell Core
[some-guid] PACKER OUT     azure-arm: Installing PowerShell Core
[some-guid] PACKER OUT     azure-arm: Waiting for PowerShell Core to install
[some-guid] PACKER OUT     azure-arm: ProcessRunning1
[some-guid] PACKER OUT     azure-arm: ProcessRunning2
[some-guid] PACKER OUT     azure-arm: ProcessRunning3
[some-guid] PACKER OUT     azure-arm: ProcessRunning4
[some-guid] PACKER OUT     azure-arm: ProcessRunning5
[some-guid] PACKER ERR 2020/08/06 11:09:11 packer: 2020/08/06 11:09:11 [INFO] command 'powershell -executionpolicy bypass -file "C:/Windows/Temp/packer-elevated-shell-5f2be428-8c55-71c2-eb40-eb2999597f29.ps1"' exited with code: 16001

Я пробовал следующие вещи вместо текущих while l oop и одновременно происходит сбой сценария:

  • Start-Process с -Wait
  • Wait-Process с идентификатором Start-Process

Попытка Чтобы определить, был ли это какой-то тайм-аут из-за бездействия, я также попробовал следующее.

  • 60-секундный сон
  • Три 20-секундных сна (сбой после запуска второго 20-секундного sleep)

Кажется, что скрипт всегда терпит неудачу примерно через 30 секунд простоя, о чем свидетельствует отсутствие нажатия ProcessRunning6 или завершения в журнале выше. Я перепробовал почти все, что только мог придумать, в плане ожидания, а это действительно короткое время. Мой код работает в интерактивном режиме, поэтому я считаю, что это ограничение Packer / Azure Image Builder. Хотя я видел, как Microsoft использует подобные примеры, особенно в их сценарии обобщения ОС .

Write-Output '>>> Waiting for GA Service (RdAgent) to start ...'
while ((Get-Service RdAgent).Status -ne 'Running') { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureTelemetryService) to start ...'
while ((Get-Service WindowsAzureTelemetryService) -and ((Get-Service WindowsAzureTelemetryService).Status -ne 'Running')) { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureGuestAgent) to start ...'
while ((Get-Service WindowsAzureGuestAgent).Status -ne 'Running') { Start-Sleep -s 5 }
Write-Output '>>> Sysprepping VM ...'
if( Test-Path $Env:SystemRoot\system32\Sysprep\unattend.xml ) {
  Remove-Item $Env:SystemRoot\system32\Sysprep\unattend.xml -Force
}
& $Env:SystemRoot\System32\Sysprep\Sysprep.exe /oobe /generalize /quiet /quit
while($true) {
  $imageState = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State).ImageState
  Write-Output $imageState
  if ($imageState -eq 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { break }
  Start-Sleep -s 5
}
Write-Output '>>> Sysprep complete ...'

Исследуя это вчера, я где-то видел, что либо Packer, либо AIB странно реагирует на параметр -Wait в Start-Process и Wait-Process, но не может найти ссылку снова. Попытка проявить немного больше творчества и проверка идентификатора процесса и спящего режима, как и в случае с Microsoft выше, похоже, создает ту же проблему.

Я, вероятно, пробовал 16 различных комбинаций очень допустимого PowerShell сейчас, и только один успех. Это недостаточно надежно. Больше всего сбивает с толку то, что когда он работал, у меня было две дополнительные строки Start-Process и Wait-Process для установки клиента SCCM. Повторный запуск этой конфигурации снова привел к возврату ошибки 16001.

Я хотел бы услышать от кого-то, кто может сказать мне, что я сделал что-то действительно глупое, от любого, у кого были подобные проблемы, или от команды Microsoft о том, как я могу избежать этого кода выхода и дать приложениям время для установки.

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

Обновление

Использование только одного двадцатисекундного сна привело к завершению сценария PowerShell с код 0, но при этом все равно произошел сбой Packer во время настройки Restart Customiser. вздох

Я все еще ищу какой-либо совет, помощь или аналогичный опыт в ответ.

Дополнительные мысли

Хотя он успешно завершился один раз, раньше мне приходило в голову, что установка PowerShell Core с помощью этого процесса может мешать процессам PowerShell, которые использует Packer / AIB. Есть ли у кого-нибудь идеи по этому поводу или похожие проблемы? Извините, по этому поводу много вопросов, хотя я знаю, что проблема слишком конкретная c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...