Azure: деинициализация экземпляра Linux с помощью расширения настраиваемого сценария
Я пытаюсь деинициализировать экземпляр Azure Linux с помощью расширения пользовательского сценария.
Мой сценарий хранится в большом двоичном объекте анонимного доступа:
sudo waagent -deprovision+user -verbose -force
exit
Моя команда для применения расширения:
az vm extension set --resource-group rg01--vm-name vm01--name CustomScript --publisher Microsoft.Azure.Extensions --version 2.0 --settings "{'fileUris': [ 'https://mystorageaccount.blob.core.windows.net/scripts/Deprovision.sh' ], 'commandToExecute': 'sh Deprovision.sh'}"
Когда я запускаю команду az, все подкаталоги и журналы /var/log/azure исчезают!. Я могу сказать из окна бастиона, что-то пытались удалить мою учетную запись пользователя, поэтому я уверен, что расширение подготовлено и запущено.
К сожалению, расширение показывает всю информацию о статусе как недоступную, и моя команда z просто сидит там. Элемент "Создать или обновить расширение виртуальной машины" в журнале активности виртуальной машины также не показывает активности после начала деинициализации. Журнал активности Azure предполагает, что произошел перезапуск, и моя учетная запись больше не действительна.
Надеюсь, у Linux/Azure есть рецепт для этого...
-
Я видел подобное поведение в Windows и в конечном итоге использовал этот сценарий для Sysprep (-Wait был критическим, поскольку он заставлял процесс Powershell ждать завершения, не позволяя агенту возвращать успех / сбой до завершения процесса.), Это предотвращает перезапуск. Затем я могу выполнить сценарий освобождения памяти, когда расширение завершится. Я подозреваю, что здесь происходит нечто подобное.
Start-Process -FilePath C:\Windows\System32\Sysprep\Sysprep.exe -ArgumentList '/generalize /oobe /quiet /quit' -Wait
1 ответ
Пока команда:
sudo waagent -deprovision+user -verbose -force
работает через SSH, при запуске через расширение CustomScript эта команда в основном убивает все на машине. Расширение CustomScript не может подтвердить завершение.
Используя этот скрипт:
sudo shutdown +3
sudo waagent -deprovision+user -verbose -force -start
- Строка 1, выключает виртуальную машину за 3 минуты (команда удаления кажется очень быстрой)
- Строка 2 с добавлением "-start" запускает waagent как фоновый процесс. Это позволяет расширению CustomScript подтверждать завершение.
Теперь эта команда завершается (а не зависает):
var cmd = "sh Deprovision.sh";
var result = vm.Update()
.DefineNewExtension("deprovision")
.WithPublisher("Microsoft.Azure.Extensions")
.WithType("CustomScript")
.WithVersion("2.1")
.WithMinorVersionAutoUpgrade()
.WithPublicSetting("fileUris", new string[] { blobUri })
.WithPublicSetting("commandToExecute", cmd)
.Attach()
.Apply();
После завершения мы должны опросить Azure, когда виртуальная машина остановлена.
WaitForVMToStop(vm);
private void WaitForVMToStop(IVirtualMachine newVM)
{
Context.Logger.LogInformation($"WaitForVMToStop...");
bool stopped = false;
int cnt = 0;
do
{
var stoppedVM = Context.AzureInstance.VirtualMachines.GetById(newVM.Id);
stopped = (stoppedVM.PowerState == PowerState.Stopped);
if (!stopped)
{
cnt++;
Context.Logger.LogInformation($"\tPolling 60 seconds for 'PowerState = Stopped on [{newVM.Name}]...");
System.Threading.Thread.Sleep(60000);
if (cnt > 20)
{
Context.Logger.LogInformation($"\tSysPrep Extension exceeded 20 minutes. Aborting...");
throw new Exception($"SysPrep Extension exceeded 20 minutes on [{newVM.Name}]");
}
}
} while (!stopped);
Context.Logger.LogInformation($"\tWaited {cnt} minutes for 'PowerState = Stopped...");
}
Мне это кажется слишком сложным, но работает. Мне особенно не нравится предполагать, что деинициализация произойдет через 3 минуты или меньше. Если у кого-то есть способ получше, поделитесь, пожалуйста.