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 минуты или меньше. Если у кого-то есть способ получше, поделитесь, пожалуйста.

Другие вопросы по тегам