Azure: удаление экземпляра linux с использованием расширения пользовательских сценариев - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь отменить удаление экземпляра Azure Linux, используя расширение собственного сценария.

Мой сценарий хранится в BLOB-объекте анонимного доступа:

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 исчезают !. Я могу сказать из окна бастиона, что-то пыталось удалить мою учетную запись пользователя, поэтому я уверен, что расширение подготовлено и запущено.

К сожалению, расширение показывает всю информацию о статусе как недоступную, и моя команда az просто сидит там. Элемент «Создать или обновить расширение виртуальной машины» в журнале активности виртуальной машины также не показывает активности после запуска удаления. В журнале активности Azure предполагается, что произошел перезапуск, и моя учетная запись больше не действительна.

Надеюсь, у пользователей Linux / Azure есть рецепт для этого ...

-

Я видел подобное поведение в Windows и в итоге использовал этот сценарий для Sysprep (-Wait был критически важным, поскольку заставлял процесс Powershell ждать завершения, не давая агенту вернуть успех / сбой до завершения процесса.) , это предотвращает перезапуск. Затем я могу написать сценарий освобождения, когда расширение завершится. Я подозреваю, что здесь происходит нечто подобное.

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

1 Ответ

0 голосов
/ 27 февраля 2020

Пока команда:

sudo waagent -deprovision+user -verbose -force

работает через S SH, при запуске через расширение 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 когда VM остановлена.

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

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