Azure Metadata Service: Scheduled Events pro virtuální počítače s Linuxem

Platí pro: ✔️ Flexibilní škálovací sady virtuálních ✔️ počítačů s Linuxem – Jednotné škálovací sady ✔️

Služba Scheduled Events je službou Azure Metadata Service, která vaší aplikaci dává čas na přípravu na údržbu virtuálního počítače. Poskytuje informace o nadcházejících událostech údržby (například restartování), aby se vaše aplikace na ně mohla připravit a omezit přerušení fungování. Je k dispozici pro všechny typy virtuálních počítačů Azure, včetně PaaS a IaaS ve Windows i Linuxu.

Informace o plánovaných událostech ve Windows naleznete v tématu Naplánované události pro virtuální počítače s Windows.

Naplánované události poskytují proaktivní oznámení o nadcházejících událostech, kde najdete reaktivní informace o událostech, ke kterým už došlo, informace o dostupnosti virtuálních počítačů v Azure Resource Graphu a vytvoření pravidla upozornění dostupnosti pro virtuální počítač Azure.

Poznámka:

Naplánované události jsou obecně dostupné ve všech oblastech Azure. Informace o nejnovější verzi najdete v tématu Dostupnost verzí a oblastí.

Proč používat plánované události?

Mnoho aplikací může využít čas na přípravu údržby virtuálního počítače. Tento čas lze využít k provedení úkolů specifických pro aplikaci, které zlepšují dostupnost, spolehlivost a použitelnost, včetně následujících možností:

  • Kontrolní bod a obnovení
  • Vyprázdnění připojení
  • Převzetí služeb při selhání primární repliky
  • Odebrání z fondu nástroje pro vyrovnávání zatížení
  • Protokolování událostí
  • Řádné vypnutí

Se službou Scheduled Events může vaše aplikace zjistit, kdy dojde k údržbě, a aktivovat úlohy, aby omezila její dopad.

Služba Scheduled Events poskytuje události v následujících případech použití:

Základy

Služba metadat zveřejňuje informace o spouštění virtuálních počítačů pomocí koncového bodu REST, který je přístupný z virtuálního počítače. Informace jsou dostupné prostřednictvím nesměrovatelné IP adresy a nejsou vystavené mimo virtuální počítač.

Obor

Naplánované události se doručují a mohou být potvrzeny:

  • Samostatné virtuální počítače.
  • Všechny virtuální počítače v cloudové službě Azure (Classic)
  • Všechny virtuální počítače ve skupině dostupnosti.
  • Všechny virtuální počítače ve skupině umístění škálovací sady

Poznámka:

Plánované události pro všechny virtuální počítače v celé skupině dostupnosti nebo skupině umístění pro škálovací sadu virtuálních počítačů se doručí do všech ostatních virtuálních počítačů ve stejné skupině nebo sadě bez ohledu na využití zóny dostupnosti.

V důsledku toho zkontrolujte Resources pole v události a zjistěte, které virtuální počítače jsou ovlivněné.

Zjišťování koncových bodů

Pro virtuální počítače s povolenou virtuální sítí je služba metadat dostupná ze statické nesměrovatelné IP 169.254.169.254adresy. Úplný koncový bod pro nejnovější verzi naplánovaných událostí je:

http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01

Pokud se virtuální počítač nevytvořil v rámci virtuální sítě, výchozí případy cloudových služeb a klasických virtuálních počítačů vyžadují další logiku ke zjištění IP adresy, která se má použít. Informace o tom, jak zjistit koncový bod hostitele, najdete v této ukázce.

Dostupnost verzí a oblastí

Služba Naplánované události je verze. Verze jsou povinné; aktuální verze je 2020-07-01.

Verze Typ vydání Oblasti Poznámky k verzi
2020-07-01 Všeobecná dostupnost Všechny
  • Přidání podpory pro dobu trvání události
  • 2019-08-01 Všeobecná dostupnost Všechny
  • Přidání podpory pro EventSource
  • 1. 4. 2019 Všeobecná dostupnost Všechny
  • Přidání podpory pro popis události
  • 1. 1. 2019 Všeobecná dostupnost Všechny
  • Přidání podpory pro virtual machine Scale Sets EventType Terminate
  • 2017-11-01 Všeobecná dostupnost Všechny
  • Přidání podpory pro vyřazování spotových virtuálních počítačů – Typ události Preempt
  • 2017-08-01 Všeobecná dostupnost Všechny
  • Odebrání předpřipraveného podtržítka z názvů prostředků pro virtuální počítače IaaS
  • Požadavek na hlavičku metadat vynucený pro všechny požadavky
  • 2017-03-01 Náhled Všechny
  • Původní vydaná verze
  • Poznámka:

    Předchozí verze Preview plánovaných událostí podporovaly {latest} jako verzi api. Tento formát už není podporovaný a v budoucnu bude zastaralý.

    Povolení a zakázání plánovaných událostí

    Naplánované události jsou pro vaši službu povoleny při prvním provedení požadavku na události. V prvním volání až o dvě minuty byste měli očekávat zpožděnou odpověď. Naplánované události jsou pro vaši službu zakázané, pokud do koncového bodu neprovádí požadavek po dobu 24 hodin.

    Údržba iniciovaná uživatelem

    Údržba virtuálních počítačů iniciovaná uživatelem prostřednictvím webu Azure Portal, rozhraní API, rozhraní příkazového řádku nebo PowerShellu způsobí naplánovanou událost. Pak můžete otestovat logiku přípravy údržby ve vaší aplikaci a vaše aplikace se může připravit na údržbu iniciovanou uživatelem.

    Pokud virtuální počítač restartujete, naplánuje se událost s typem Reboot . Pokud virtuální počítač nasadíte znovu, naplánuje se událost s typem Redeploy . Události se zdrojem událostí uživatele se obvykle dají okamžitě schválit, aby nedocházelo ke zpoždění akcí iniciovaných uživatelem. Pro případ, že primární a sekundární virtuální počítač přestane reagovat, doporučujeme, aby primární a sekundární virtuální počítač komunikoval a schválil naplánované události vygenerované uživatelem. Okamžité schválení událostí zabraňuje zpožděním při obnovení aplikace zpět do dobrého stavu.

    Naplánované události pro upgrady hostovaného operačního systému VMSS nebo opětovné sestavení jsou podporovány pro velikosti virtuálních počítačů pro obecné účely, které podporují pouze aktualizace pro zachování paměti. Nefunguje pro řadu G, M, N a H. Naplánované události pro upgrady hostovaného operačního systému VMSS a opětovné sestavení jsou ve výchozím nastavení zakázané. Pokud chcete pro tyto operace povolit plánované události na podporovaných velikostech virtuálních počítačů, nejprve je povolte pomocí souboru OSImageNotificationProfile.

    Použití rozhraní API

    Základní přehled

    Existují dvě hlavní komponenty pro zpracování plánovaných událostí, přípravu a obnovení. Všechny aktuální naplánované události, které mají vliv na virtuální počítač, jsou k dispozici ke čtení prostřednictvím koncového bodu naplánovaných událostí IMDS. Když událost dosáhla stavu terminálu, odebere se ze seznamu událostí. Následující diagram znázorňuje různé přechody stavu, které může zaznamenat jedna naplánovaná událost:

    State diagram showing the various transitions a scheduled event can take.

    U událostí ve stavu EventStatus:"Scheduled" budete muset provést kroky k přípravě úlohy. Po dokončení přípravy byste měli událost schválit pomocí rozhraní API naplánované události. V opačném případě se událost automaticky schválí při dosažení času NotBefore. Pokud je virtuální počítač ve sdílené infrastruktuře, systém pak počká na schválení úlohy nebo časového limitu u všech ostatních tenantů na stejném hardwaru. Jakmile se shromáždí schválení ze všech ovlivněných virtuálních počítačů nebo je dosaženo času NotBefore, Azure vygeneruje novou naplánovanou datovou část události s událostí EventStatus:"Started" a aktivuje začátek události údržby. Když událost dosáhla stavu terminálu, odebere se ze seznamu událostí. Slouží jako signál pro zákazníka k obnovení virtuálních počítačů.

    Níže je kód psudeo, který demonstruje proces čtení a správy plánovaných událostí ve vaší aplikaci:

    current_list_of_scheduled_events = get_latest_from_se_endpoint()
    #prepare for new events
    for each event in current_list_of_scheduled_events:
      if event not in previous_list_of_scheduled_events:
        prepare_for_event(event)
    #recover from completed events
    for each event in previous_list_of_scheduled_events:
      if event not in current_list_of_scheduled_events:
        receover_from_event(event)
    #prepare for future jobs
    previous_list_of_scheduled_events = current_list_of_scheduled_events
    

    Vzhledem k tomu, že naplánované události se často používají pro aplikace s vysokými požadavky na dostupnost, existuje několik výjimečných případů, které by se měly zvážit:

    1. Po dokončení a odebrání naplánované události z pole nedojde k žádným dalším dopadům bez nové události včetně jiné události EventStatus:"Scheduled"
    2. Azure monitoruje operace údržby v celém vozovém parku a ve výjimečných případech určuje, že operace údržby je příliš vysoká, aby se použila. V takovém případě bude naplánovaná událost přímo z pole událostí odebrána z pole událostí.
    3. V případě selhání hardwaru Azure obchází stav Scheduled a okamžitě přejde do stavu EventStatus:"Started".
    4. I když je událost stále ve stavu EventStatus:"Started", může dojít k dalšímu dopadu kratší doby trvání, než jaká byla inzerována v naplánované události.

    V rámci záruky dostupnosti Azure nebudou virtuální počítače v různých doménách selhání ovlivněny rutinními operacemi údržby současně. Mohou však mít operace serializované jeden po druhém. Virtuální počítače v jedné doméně selhání můžou přijímat plánované události s událostí EventStatus:"Scheduled" krátce po dokončení údržby jiné domény selhání. Bez ohledu na to, jakou architekturu jste zvolili, vždy kontrolujte nové události čekající na virtuální počítače.

    I když se přesné časování událostí liší, následující diagram poskytuje přibližné vodítko, jak probíhá typická operace údržby:

    • EventStatus:"Scheduled" to Approval Timeout: 15 minutes
    • Doba trvání dopadu: 7 sekund
    • EventStatus:"Started" to Completed (událost odebrána z pole Události): 10 minut

    Diagram of a timeline showing the flow of a scheduled event.

    Hlavičky

    Při dotazování služby Metadata Service musíte zadat hlavičku Metadata:true , abyste zajistili, že požadavek nebyl neúmyslně přesměrován. Hlavička Metadata:true se vyžaduje pro všechny naplánované žádosti o události. Pokud do požadavku zahrnete hlavičku, výsledkem je odpověď Chybný požadavek ze služby Metadata Service.

    Dotaz na události

    Naplánované události můžete dotazovat provedením následujícího volání:

    Ukázka bashe

    curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    Ukázka PowerShellu

    Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01" | ConvertTo-Json -Depth 64
    

    Ukázka Pythonu

    import json
    import requests
    
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    header = {'Metadata' : 'true'}
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    

    Odpověď obsahuje pole naplánovaných událostí. Prázdné pole znamená, že aktuálně nejsou naplánované žádné události. V případě plánovaných událostí obsahuje odpověď pole událostí.

    {
        "DocumentIncarnation": {IncarnationID},
        "Events": [
            {
                "EventId": {eventID},
                "EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
                "ResourceType": "VirtualMachine",
                "Resources": [{resourceName}],
                "EventStatus": "Scheduled" | "Started",
                "NotBefore": {timeInUTC},       
                "Description": {eventDescription},
                "EventSource" : "Platform" | "User",
                "DurationInSeconds" : {timeInSeconds},
            }
        ]
    }
    

    Vlastnosti události

    Vlastnost Popis
    Dokument inkarnace Celé číslo, které se zvýší, když se pole událostí změní. Dokumenty se stejnou inkarnací obsahují stejné informace o události a inkarnace se zvýší při změně události.
    EventId Globálně jedinečný identifikátor této události.

    Příklad:
    • 602d9444-d2cd-49c7-8624-8643e7171297
    Typ události Ovlivnění této události

    Hodnoty:
    • Freeze: Virtuální počítač se plánuje pozastavit na několik sekund. Může dojít k pozastavení procesoru a síťového připojení, ale nemá to žádný vliv na paměť nebo otevřené soubory.
    • Reboot: Virtuální počítač je naplánovaný na restartování (dojde ke ztrátě trvalé paměti). Ve výjimečných případech může dojít k zablokování virtuálního počítače naplánovaného pro EventType:"Reboot" místo restartování. Postupujte podle výše uvedených pokynů, abyste věděli, jestli je událost dokončená, a je bezpečné ji obnovit.
    • Redeploy: Virtuální počítač se plánuje přesunout do jiného uzlu (dočasné disky se ztratí).
    • Preempt: Spotový virtuální počítač se odstraňuje (dočasné disky se ztratí). Tato událost je zpřístupněna na základě maximálního úsilí.
    • Terminate: Virtuální počítač se plánuje odstranit.
    ResourceType Typ prostředku, který tato událost ovlivňuje.

    Hodnoty:
    • VirtualMachine
    Zdroje informací Seznam prostředků, které tato událost ovlivňuje

    Příklad:
    • ["FrontEnd_IN_0", "BackEnd_IN_0"]
    EventStatus Stav této události

    Hodnoty:
    • Scheduled: Tato událost je naplánována tak, aby se spustila po čase zadaném NotBefore ve vlastnosti.
    • Started: Tato událost byla zahájena.
    Nikdy není k dispozici žádný Completed nebo podobný stav. Událost se už po dokončení události nevrátí.
    NotBefore Čas, po kterém může tato událost začít. Událost se zaručuje, že se nespustí před touto dobou. Pokud se událost už spustila, bude prázdná.

    Příklad:
    • Po, 19. zář 2016 18:29:47 GMT
    Popis Popis této události

    Příklad:
    • U hostitelského serveru probíhá údržba.
    EventSource Iniciátor události.

    Příklad:
    • Platform: Tato událost je inicializována platformou.
    • User: Tuto událost inicializoval uživatel.
    DurationInSeconds Očekávaná doba přerušení způsobená událostí.

    Příklad:
    • 9: Přerušení způsobené událostí bude trvat 9 sekund.
    • 0: Událost nepřeruší virtuální počítač ani nebude mít vliv na její dostupnost (např. aktualizace sítě).
    • -1: Výchozí hodnota použitá, pokud je doba trvání dopadu neznámá nebo není použitelná.

    Plánování událostí

    Každá událost je naplánována minimální dobu v budoucnu na základě typu události. Tentokrát se projeví ve vlastnosti události NotBefore .

    Typ události Minimální oznámení
    Zablokovat 15 minut
    Restartujte. 15 minut
    Opětovné nasazení 10 minut
    Ukončit Konfigurovatelné uživatelem: 5 až 15 minut

    To znamená, že můžete zjistit budoucí plán události alespoň minimálním časem oznámení, než dojde k události. Jakmile je událost naplánovaná, přesune se do Started stavu po schválení nebo NotBefore uplynutí času. Ve výjimečných případech ale azure zruší operaci před jejím spuštěním. V takovém případě se událost odebere z pole Události a dopad nebude probíhat podle předchozího plánu.

    Poznámka:

    V některých případech dokáže Azure předpovědět selhání hostitele kvůli sníženému hardwaru a pokusí se zmírnit přerušení vaší služby naplánováním migrace. Ovlivněné virtuální počítače obdrží naplánovanou událost s událostí NotBefore , která je obvykle v budoucnu několik dní. Skutečný čas se liší v závislosti na předpokládaném posouzení rizik selhání. Azure se pokusí o 7denní předstih, pokud je to možné, ale skutečný čas se liší a může být menší, pokud je predikce, že existuje vysoká pravděpodobnost, že hardware selhává bezprostředně. Pokud chcete minimalizovat riziko pro vaši službu v případě selhání hardwaru před migrací zahájenou systémem, doporučujeme virtuální počítač co nejdříve nasadit sami.

    Poznámka:

    V případě, že u hostitelského uzlu dojde k selhání hardwaru, Azure obejití minimální dobu oznámení a okamžitě zahájí proces obnovení ovlivněných virtuálních počítačů. Tím se zkracuje doba obnovení v případě, že ovlivněné virtuální počítače nemůžou reagovat. Během procesu obnovení se vytvoří událost pro všechny ovlivněné virtuální počítače s EventType = Reboot a EventStatus = Started.

    Frekvence dotazování

    Koncový bod můžete dotazovat na aktualizace tak často nebo zřídka, jak se vám líbí. Čím delší je však doba mezi požadavky, tím více času můžete přijít o reakci na nadcházející událost. Většina událostí má 5 až 15 minut předchozího oznámení, i když v některých případech může být předběžné oznámení o 30 sekundách až 30 sekund. Pokud chcete zajistit, abyste měli co nejvíce času na zmírnění opatření, doporučujeme službu dotazovat jednou za sekundu.

    Zahájení události

    Jakmile se seznámíte s nadcházející událostí a dokončíte logiku pro řádné vypnutí, můžete schvalovat nevyrovnanou událost tím, že zavoláte POST službu Metadata Service.EventId Toto volání označuje Azure, že může zkrátit minimální dobu oznámení (pokud je to možné). Událost se nemusí spustit okamžitě po schválení, v některých případech Azure před pokračováním v události vyžaduje schválení všech virtuálních počítačů hostovaných na uzlu.

    V textu požadavku se očekává POST následující ukázka JSON. Požadavek by měl obsahovat seznam .StartRequests Každá StartRequest obsahuje EventId událost, kterou chcete urychlit:

    {
    	"StartRequests" : [
    		{
    			"EventId": {EventId}
    		}
    	]
    }
    

    Služba vždy vrátí kód úspěchu 200, pokud se předá platné ID události, i když již událost schválil jiný virtuální počítač. Kód chyby 400 označuje, že hlavička požadavku nebo datová část byla poškozena.

    Poznámka:

    Události nepokračují, pokud nejsou schváleny prostřednictvím zprávy POST nebo uplynulého času NotBefore. To zahrnuje události aktivované uživatelem, jako jsou restartování virtuálního počítače z webu Azure Portal.

    Ukázka bashe

    curl -H Metadata:true -X POST -d '{"StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    Ukázka PowerShellu

    Invoke-RestMethod -Headers @{"Metadata" = "true"} -Method POST -body '{"StartRequests": [{"EventId": "5DD55B64-45AD-49D3-BBC9-F57D4EA97BD7"}]}' -Uri http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01 | ConvertTo-Json -Depth 64
    

    Ukázka Pythonu

    import json
    import requests
    
    def confirm_scheduled_event(event_id):  
       # This payload confirms a single event with id event_id
       payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
       response = requests.post("http://169.254.169.254/metadata/scheduledevents", 
                                headers =  {'Metadata' : 'true'}, 
                                params = {'api-version':'2020-07-01'}, 
                                data = payload)    
       return response.status_code
    

    Poznámka:

    Potvrzení události umožňuje, aby událost pokračovala pro všechny Resources události, nejen pro virtuální počítač, který tuto událost uznává. Proto můžete zvolit vodicí znak, který bude koordinovat potvrzení, což může být jednoduché jako první stroj v terénu Resources .

    Ukázkové odpovědi

    Následující události jsou příkladem, který viděli dva virtuální počítače, které byly migrovány za provozu do jiného uzlu.

    Mění se DocumentIncarnation pokaždé, když jsou v Eventsní nové informace . Schválení události by umožnilo ukotvení pokračovat pro WestNO_0 i WestNO_1. Hodnota DurationInSeconds -1 značí, že platforma neví, jak dlouho bude operace trvat.

    {
        "DocumentIncarnation":  1,
        "Events":  [
                   ]
    }
    
    {
        "DocumentIncarnation":  2,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Scheduled",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "Mon, 11 Apr 2022 22:26:58 GMT",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  3,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Started",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  4,
        "Events":  [
                   ]
    }
    
    

    Ukázka Pythonu

    Následující ukázková služba dotazuje službu Metadata Service na naplánované události a schválí každou nevyřízených událostí:

    #!/usr/bin/python
    import json
    import requests
    from time import sleep
    
    # The URL to access the metadata service
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    # This must be sent otherwise the request will be ignored
    header = {'Metadata' : 'true'}
    # Current version of the API
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    def confirm_scheduled_event(event_id):  
        # This payload confirms a single event with id event_id
        # You can confirm multiple events in a single request if needed      
        payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
        response = requests.post(metadata_url, 
                                headers= header,
                                params = query_params, 
                                data = payload)    
        return response.status_code
    
    def log(event): 
        # This is an optional placeholder for logging events to your system 
        print(event["Description"])
        return
    
    def advanced_sample(last_document_incarnation): 
        # Poll every second to see if there are new scheduled events to process
        # Since some events may have necessarily short warning periods, it is 
        # recommended to poll frequently
        found_document_incarnation = last_document_incarnation
        while (last_document_incarnation == found_document_incarnation):
            sleep(1)
            payload = get_scheduled_events()    
            found_document_incarnation = payload["DocumentIncarnation"]        
            
        # We recommend processing all events in a document together, 
        # even if you won't be actioning on them right away
        for event in payload["Events"]:
    
            # Events that have already started, logged for tracking
            if (event["EventStatus"] == "Started"):
                log(event)
                
            # Approve all user initiated events. These are typically created by an 
            # administrator and approving them immediately can help to avoid delays 
            # in admin actions
            elif (event["EventSource"] == "User"):
                confirm_scheduled_event(event["EventId"])            
                
            # For this application, freeze events less that 9 seconds are considered
            # no impact. This will immediately approve them
            elif (event["EventType"] == "Freeze" and 
                int(event["DurationInSeconds"]) >= 0  and 
                int(event["DurationInSeconds"]) < 9):
                confirm_scheduled_event(event["EventId"])
                
            # Events that may be impactful (for example, reboot or redeploy) may need custom 
            # handling for your application
            else: 
                #TODO Custom handling for impactful events
                log(event)
        print("Processed events from document: " + str(found_document_incarnation))
        return found_document_incarnation
    
    def main():
        # This will track the last set of events seen 
        last_document_incarnation = "-1"
    
        input_text = "\
            Press 1 to poll for new events \n\
            Press 2 to exit \n "
        program_exit = False 
    
        while program_exit == False:
            user_input = input(input_text)    
            if (user_input == "1"):                        
                last_document_incarnation = advanced_sample(last_document_incarnation)
            elif (user_input == "2"):
                program_exit = True       
    
    if __name__ == '__main__':
        main()
    

    Další kroky