Packer - не отвечает после перезагрузки виртуальной машины Windows через средство подготовки сценариев Powershell
Проблема: я не могу заставить Packer работать при запуске сценария PowerShell, который завершает перезагрузку виртуальной машины Windows после установки программного обеспечения.
По завершении сценария (scripts/watchMaker_stigVM.ps1) машина перезагрузится, и Packer перейдет к следующему Provisioner. Следующим инициатором в этом случае является встроенный провайдер Powershell для sysprep.
Упаковщик зависает, затем выдает ошибку и удаляет ресурсы для очистки
Вещи, которые я пробовал: "
1) Использование "Windows-Restart" Packer Provisioner после Powershell script Provisioner, которое вызывает перезагрузку виртуальной машины (scripts/watchMaker_stigVM.ps1).
2) Добавление команды "restart_check_command" для проверки раздела реестра "RebootPending".
3) Добавление "Pause_before" после Powershell Script Provisioner и перед Windows-Restart Provisioner, чтобы дать машине время вернуться в оперативный режим и позволить WinRM повторно подключиться.
Провайдер с вышеуказанными попытками:
"provisioners": [
{
"type": "powershell",
"scripts": [
"scripts/watchMaker_stigVM.ps1"
]
},
{
"type": "powershell",
"pause_before": "240s",
"inline": ["dir c:\\"]
},
{
"type": "windows-restart",
"timeout": "2h",
"restart_check_command": "HKLM:SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending"
},
{
"type": "powershell",
"pause_before": "120s",
"inline": ["dir c:\\"]
},
{
"type": "powershell",
"inline": [
"if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\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 | Select ImageState; if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { Write-Output $imageState.ImageState; Start-Sleep -s 10 } else { break } }"
]
}
]}
Сценарий сборки, используемый в приведенном выше сценарии, без каких-либо средств подготовки Windows-Restart или Pause:
{
"variables": {
"client_id": "",
"client_secret": "",
"object_id": "",
"tenant_id": "",
"subscription_id": "",
"managed_image_name": "",
"managed_image_resource_group_name": "",
"location": "",
"os_type": "",
"image_publisher": "",
"image_offer": "",
"image_sku": "",
"dept": "",
"task": ""
},
"builders": [
{
"type": "azure-arm",
"client_id": "{{user `client_id`}}",
"client_secret": "{{user `client_secret`}}",
"tenant_id": "{{user `tenant_id`}}",
"subscription_id": "{{user `subscription_id`}}",
"managed_image_resource_group_name": "{{user `managed_image_resource_group_name`}}",
"managed_image_name": "{{user `managed_image_name`}}",
"os_type": "{{user `os_type`}}",
"image_publisher": "{{user `image_publisher`}}",
"image_offer": "{{user `image_offer`}}",
"image_sku": "{{user `image_sku`}}",
"communicator": "winrm",
"winrm_use_ssl": true,
"winrm_insecure": true,
"winrm_timeout": "2h",
"winrm_username": "packer",
"azure_tags": {
"dept": "{{user `dept`}}",
"task": "{{user `task`}}"
},
"location": "{{user `location`}}",
"vm_size": "Standard_B4ms"
}
],
"provisioners": [
{
"type": "powershell",
"timeout": "2h",
"script":
"scripts/watchMaker_stigVM.ps1"
},
{
"type": "powershell",
"inline": [
"if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\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 | Select ImageState; if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { Write-Output $imageState.ImageState; Start-Sleep -s 10 } else { break } }"
]
}
]
}
Журнал упаковщика, показывающий успешное завершение сценария Powershell "scripts/watchMaker_stigVM.ps1", попытки запуска следующего встроенного средства подготовки Powershell, зависание, затем сбой упаковщика и удаление ресурсов.
==> azure-arm: 2019-11-08 17:36:51,030 [watchmaker.workers.base.SaltWindows][INFO ][3392]: Applying the salt "highstate", states=highstate
==> azure-arm: 2019-11-08 17:36:51,030 [watchmaker.workers.base.SaltWindows][DEBUG][3392]: Command: C:\Salt\salt-call.bat --local --retcode-passthrough --no-color --config-dir C:\Watchmaker\Salt\conf --log-file C:\Watchmaker\Logs\salt_call.debug.log --log-file-level debug --log-level error --out quiet --return local state.highstate
==> azure-arm: 2019-11-08 17:38:04,492 [watchmaker.workers.base.SaltWindows][DEBUG][3392]: Command retcode: 0
==> azure-arm: 2019-11-08 17:38:04,492 [watchmaker.workers.base.SaltWindows][INFO ][3392]: Salt states all applied successfully!
==> azure-arm: 2019-11-08 17:38:04,492 [watchmaker.workers.base.SaltWindows][INFO ][3392]: Cleanup Time...
==> azure-arm: 2019-11-08 17:38:04,492 [watchmaker.workers.base.SaltWindows][DEBUG][3392]: working_dir=C:\Watchmaker\WorkingFiles\Salt-1_5kqmta
==> azure-arm: 2019-11-08 17:38:04,508 [watchmaker.workers.base.SaltWindows][INFO ][3392]: Deleted working directory...
==> azure-arm: 2019-11-08 17:38:04,508 [watchmaker.workers.base.SaltWindows][INFO ][3392]: Exiting cleanup routine...
==> azure-arm: 2019-11-08 17:38:04,508 [watchmaker.Client][INFO ][3392]: Reboot scheduled. System will reboot after the script exits.
==> azure-arm: 2019-11-08 17:38:04,648 [watchmaker.Client][INFO ][3392]: Stop time: 2019-11-08 17:38:04.648938
==> azure-arm: Provisioning with Powershell...
==> azure-arm: Provisioning with powershell script: C:\Users\Giann\AppData\Local\Temp\powershell-provisioner582533063
==> azure-arm: Provisioning step had errors: Running the cleanup provisioner, if present...
==> azure-arm:
==> azure-arm: Cleanup requested, deleting resource group ...
Как видите, сценарий Powershell завершает перезагрузку виртуальной машины, которая не инициируется самим Packer.
==> azure-arm: 2019-11-08 17:38:04,508 [watchmaker.Client][INFO][3392]: запланирована перезагрузка. Система перезагрузится после выхода из скрипта.
Предыдущий успех упаковщика для контекста:
Я успешно создал виртуальную машину Windows с помощью Packer, установил программное обеспечение с помощью средства подготовки сценариев Powershell, а затем добавил встроенную программу подготовки Powershell для sysprep образа.
Спасибо за любую помощь по этому поводу.