Rychlý start: Nasazení virtuálního počítače Azure ze šablony s využitím sady Azure SDK for Go

V tomto rychlém startu se dozvíte, jak nasadit prostředky z šablony Azure Resource Manageru pomocí sady Azure SDK pro Go. Šablony jsou snímky všech prostředků obsažených ve skupině prostředků Azure. Průběžně se seznámíte s funkcemi a konvencemi této sady SDK.

Na konci tohoto rychlého startu budete mít spuštěný virtuální počítač, ke kterému se přihlásíte pomocí uživatelského jména a hesla.

Poznámka:

Pokud se chcete podívat na vytvoření virtuálního počítače v Go bez použití šablony Resource Manageru, tady je imperativní ukázka, která demonstruje sestavení a konfiguraci všech prostředků virtuálního počítače s využitím sady SDK. Použití šablony v této ukázce umožňuje zaměřit se na konvence SDK a nezacházet příliš do podrobností o architektuře služeb Azure.

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Spuštění služby Azure Cloud Shell

Azure Cloud Shell je interaktivní prostředí, které běží v Azure. Má předinstalované obecné nástroje, které jsou nakonfigurované pro použití s vaším účtem. Vyberte Kopírovat , zkopírujte kód, vložte ho do Cloud Shellu a stisknutím klávesy Enter ho spusťte.

Existuje několik způsobů, jak Cloud Shell spustit:

Vyberte Vyzkoušet v pravém horním rohu bloku kódu.

Cloud Shell in this article

Otevřete Cloud Shell ve vašem prohlížeči.

https://shell.azure.com/bash

V nabídce v pravém horním rohu webu Azure Portal vyberte tlačítko Cloud Shell.

Cloud Shell in the portal

Pokud používáte místní instalaci Azure CLI, bude tento rychlý start vyžadovat CLI verze 2.0.28 nebo novější. Spusťte az --version a zkontrolujte, jestli vaše instalace CLI splňuje tento požadavek. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace rozhraní příkazového řádku Azure CLI.

Instalace Azure SDK for Go

Sada Azure SDK pro Go je kompatibilní s Go verze 1.8 a novější. Pro prostředí využívající profily Azure Stack Profiles se vyžaduje minimálně Go verze 1.9. Pokud potřebujete Go nainstalovat, postupujte podle pokynů pro instalaci Go.

Sadu Azure SDK pro Go a její závislosti můžete stáhnout prostřednictvím go get.

go get -u -d github.com/Azure/azure-sdk-for-go/...

Upozorňující

Nezapomeňte pro Azure v adrese URL použít velká písmena. Pokud to neuděláte, při práci s touto sadou SDK mohou nastat problémy při importu, které souvisejí s použitím velkých a malých písmen. Velká písmena musíte použít také pro Azure v příkazech pro import.

Vytvoření instančního objektu služby

Pokud se chcete přihlásit k Azure neinteraktivně pomocí aplikace, potřebujete instanční objekt. Instanční objekty jsou součástí řízení přístupu na základě role (RBAC), které vytvoří jedinečnou identitu uživatele. Pokud chcete vytvořit nový instanční objekt s využitím CLI, spusťte následující příkaz:

az ad sp create-for-rbac --role Contributor \
    --scopes /subscriptions/<subscription_id> \
    --sdk-auth > quickstart.auth

Nastavte proměnnou prostředí AZURE_AUTH_LOCATION na úplnou cestu k tomuto souboru. Sada SDK pak vyhledá a načte přihlašovací údaje přímo z tohoto souboru bez nutnosti provádět změny nebo zaznamenávat informace z instančního objektu.

Získání kódu

K získání kódu tohoto rychlého startu a všech jeho závislostí použijte go get.

go get -u -d github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm/...

Pokud je proměnná AZURE_AUTH_LOCATION správně nastavená, nemusíte provádět žádné úpravy zdrojového kódu. Když se program spustí, načte všechny potřebné ověřovací údaje z této proměnné.

Spuštění kódu

ke spuštění tohoto rychlého startu použijte příkaz go run.

cd $GOPATH/src/github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm
go run main.go

Pokud je nasazení úspěšné, zobrazí se zpráva s uvedením uživatelského jména, IP adresy a hesla pro přihlášení na nově vytvořený virtuální počítač. Připojte se k tomuto počítači přes SSH a podívejte se, jestli je v provozu.

Vyčištění

Prostředky vytvořené v rámci tohoto rychlého startu můžete vyčistit odstraněním skupiny prostředků pomocí CLI.

az group delete -n GoVMQuickstart

Odstraňte také instanční objekt, který se vytvořil. Soubor quickstart.auth obsahuje klíč JSON pro clientId. Zkopírujte tuto hodnotu do proměnné prostředí CLIENT_ID_VALUE a spusťte následující příkaz rozhraní příkazového řádku Azure:

az ad sp delete --id ${CLIENT_ID_VALUE}

kde zadáte hodnotu pro CLIENT_ID_VALUE z quickstart.auth.

Upozorňující

Při odstranění instančního objektu pro tuto aplikaci zůstane aktivní ve vašem tenantovi Microsoft Entra. I když se název i heslo instančního objektu generují jako identifikátory UUID, ujistěte se, že dodržujete osvědčené postupy zabezpečení odstraněním nepoužívaných instančních objektů a aplikací Microsoft Entra.

Kód podrobněji

To, co kód tohoto rychlého startu dělá, je rozdělené do bloku proměnných a několika malých funkcí, které tady probereme.

Proměnné, konstanty a typy

Vzhledem k tomu, že je tento rychlý start samostatný, využívá globální konstanty a proměnné.

const (
    resourceGroupName     = "GoVMQuickstart"
    resourceGroupLocation = "eastus"

    deploymentName = "VMDeployQuickstart"
    templateFile   = "vm-quickstart-template.json"
    parametersFile = "vm-quickstart-params.json"
)

// Information loaded from the authorization file to identify the client
type clientInfo struct {
    SubscriptionID string
    VMPassword     string
}

var (
    ctx        = context.Background()
    clientData clientInfo
    authorizer autorest.Authorizer
)

Jsou deklarované hodnoty, které poskytují názvy vytvořených prostředků. Je tady také zadané umístění, které můžete změnit, abyste viděli, jak se nasazení chovají v jiných datových centrech. Ne každé datové centrum má k dispozici všechny požadované prostředky.

Typ clientInfo obsahuje informace načtené z ověřovacího souboru kvůli nastavení klientů v sadě SDK a nastavení hesla virtuálního počítače.

Konstanty templateFile a parametersFile odkazují na soubory potřebné pro nasazení. Objekt authorizer nakonfiguruje sada Go SDK pro ověřování a proměnná ctx představuje kontext Go pro síťové operace.

Ověřování a inicializace

Funkce init nastaví ověřování. Vzhledem k tomu, že ověřování je předpokladem pro všechno, co je v rychlém startu, má smysl, aby bylo součástí inicializace. Z ověřovacího souboru se také načtou některé informace potřebné ke konfiguraci klientů a virtuálního počítače.

func init() {
    var err error
    authorizer, err = auth.NewAuthorizerFromFile(azure.PublicCloud.ResourceManagerEndpoint)
    if err != nil {
        log.Fatalf("Failed to get OAuth config: %v", err)
    }

    authInfo, err := readJSON(os.Getenv("AZURE_AUTH_LOCATION"))
    clientData.SubscriptionID = (*authInfo)["subscriptionId"].(string)
    clientData.VMPassword = (*authInfo)["clientSecret"].(string)
}

Nejprve se zavolá metoda auth.NewAuthorizerFromFile, která načte ověřovací údaje ze souboru v umístění AZURE_AUTH_LOCATION. Tento soubor se pak ručně načte funkcí readJSON (tady jsme ji vynechali) a přetáhnou se dvě hodnoty potřebné ke spuštění zbytku programu: ID předplatného klienta a tajný klíč instančního objektu, který se použije také jako heslo virtuálního počítače.

Upozorňující

Pro zjednodušení tohoto rychlého startu se znovu použije heslo instančního objektu. V produkčním prostředí dbejte na to, abyste nikdy znovu nepoužívali heslo poskytující přístup k vašim prostředkům Azure.

Tok operací v main()

Funkce main je jednoduchá – jenom ukazuje tok operací a provádí kontrolu chyb.

func main() {
    group, err := createGroup()
    if err != nil {
        log.Fatalf("failed to create group: %v", err)
    }
    log.Printf("Created group: %v", *group.Name)

    log.Printf("Starting deployment: %s", deploymentName)
    result, err := createDeployment()
    if err != nil {
        log.Fatalf("Failed to deploy: %v", err)
    }
    if result.Name != nil {
        log.Printf("Completed deployment %v: %v", deploymentName, *result.Properties.ProvisioningState)
    } else {
        log.Printf("Completed deployment %v (no data returned to SDK)", deploymentName)
    }
    getLogin()
}

Kód prochází těmito kroky (v uvedeném pořadí):

  • Vytvoření skupiny prostředků pro nasazení do (createGroup)
  • Vytvoření nasazení v této skupině (createDeployment)
  • Získání a zobrazení přihlašovacích informací pro nasazený virtuální počítač (getLogin)

Vytvoření skupiny prostředků

Funkce createGroup vytvoří skupinu prostředků. Pohled na tok volání a argumenty ukazuje způsob, jakým jsou interakce služeb v sadě SDK strukturované.

func createGroup() (group resources.Group, err error) {
    groupsClient := resources.NewGroupsClient(clientData.SubscriptionID)
    groupsClient.Authorizer = authorizer

        return groupsClient.CreateOrUpdate(
                ctx,
                resourceGroupName,
                resources.Group{
                        Location: to.StringPtr(resourceGroupLocation)})
}

Obecný tok interakcí se službou Azure vypadá takto:

  • Vytvořte klienta pomocí metody service.New*Client(), kde * je typ prostředku pro service, se kterým chcete interagovat. Tato funkce vždycky použije ID předplatného.
  • Pro tohoto klienta nastavte metodu autorizace a umožněte mu interagovat se vzdáleným rozhraním API.
  • Použijte volání metody v klientovi odpovídající vzdálenému rozhraní API. Metody klientů služby obvykle používají název prostředku a objekt metadat.

Funkce to.StringPtr se tady používá k převodu typů. Parametry pro metody sady SDK téměř výhradně přebírají ukazatele, takže jsou pro usnadnění převodu typů k dispozici pomocné metody. Úplný seznam a chování pomocných převaděčů najdete v dokumentaci k modulu autorest/to.

Metoda groupsClient.CreateOrUpdate vrací ukazatel na datový typ představující skupinu prostředků. Přímá návratová hodnota tohoto druhu indikuje krátce běžící operaci, která je zamýšlená jako synchronní. V další části uvidíte příklad dlouhotrvající operace a způsob práce s ní.

Realizace nasazení

Jakmile se vytvoří skupina prostředků, je čas spustit nasazení. Tento kód je rozdělený do menších oddílů, aby se zdůraznily různé části jeho logiky.

func createDeployment() (deployment resources.DeploymentExtended, err error) {
    template, err := readJSON(templateFile)
    if err != nil {
        return
    }
    params, err := readJSON(parametersFile)
    if err != nil {
        return
    }
    (*params)["vm_password"] = map[string]string{
        "value": clientData.VMPassword,
    }
        // ...

Soubory nasazení načte readJSON, podrobnosti tady neuvádíme. Tato funkce vrátí *map[string]interface{}. Tento typ se používá při konstrukci metadat pro volání nasazení prostředků. Také se ručně nastaví heslo virtuálního počítače pro parametry nasazení.

        // ...

    deploymentsClient := resources.NewDeploymentsClient(clientData.SubscriptionID)
    deploymentsClient.Authorizer = authorizer

    deploymentFuture, err := deploymentsClient.CreateOrUpdate(
        ctx,
        resourceGroupName,
        deploymentName,
        resources.Deployment{
            Properties: &resources.DeploymentProperties{
                Template:   template,
                Parameters: params,
                Mode:       resources.Incremental,
            },
        },
    )
    if err != nil {
        return
    }

Tento kód používá stejný vzor jako vytváření skupiny prostředků. Vytvoří se nový klient, získá možnost ověřovat pomocí Azure a potom se volá metoda. Tato metoda má dokonce stejný název (CreateOrUpdate) jako odpovídající metoda pro skupiny prostředků. Tento vzor se používá v celé sadě SDK. Metody, které provádějí podobné úkoly, mají obvykle stejný název.

Největší rozdíl spočívá v návratové hodnotě metody deploymentsClient.CreateOrUpdate. Tato hodnota je typu Future, který využívá vzor návrhu konstruktů future. Konstrukty future představují dlouhotrvající operace v Azure, které můžete po dokončení dotazovat, zrušit nebo zablokovat.

        //...
    err = deploymentFuture.Future.WaitForCompletion(ctx, deploymentsClient.BaseClient.Client)
    if err != nil {
        return
    }
    return deploymentFuture.Result(deploymentsClient)
}

V tomto příkladu je nejlepší počkat na dokončení operace. Čekání v konstruktu future vyžaduje kontextový objekt a klienta, který vytvořil objekt Future. Z toho vyplývají dva možné zdroje chyb: chyba způsobená na straně klienta při pokusu o volání metody a reakce na chybu ze serveru. Ta druhá se vrací jako součást volání deploymentFuture.Result.

Získání přiřazené IP adresy

Abyste mohli s nově vytvořeným virtuálním počítačem něco udělat, potřebujete přiřazenou IP adresu. IP adresy jsou vlastní samostatné prostředky Azure, které jsou vázané na prostředky NIC (Network Interface Controller).

func getLogin() {
    params, err := readJSON(parametersFile)
    if err != nil {
        log.Fatalf("Unable to read parameters. Get login information with `az network public-ip list -g %s", resourceGroupName)
    }

    addressClient := network.NewPublicIPAddressesClient(clientData.SubscriptionID)
    addressClient.Authorizer = authorizer
    ipName := (*params)["publicIPAddresses_QuickstartVM_ip_name"].(map[string]interface{})
    ipAddress, err := addressClient.Get(ctx, resourceGroupName, ipName["value"].(string), "")
    if err != nil {
        log.Fatalf("Unable to get IP information. Try using `az network public-ip list -g %s", resourceGroupName)
    }

    vmUser := (*params)["vm_user"].(map[string]interface{})

    log.Printf("Log in with ssh: %s@%s, password: %s",
        vmUser["value"].(string),
        *ipAddress.PublicIPAddressPropertiesFormat.IPAddress,
        clientData.VMPassword)
}

Tato metoda využívá informace uložené v souboru parametrů. Kód by mohl pro zjištění NIC zadat dotaz přímo virtuálnímu počítači, potom zadat dotaz NIC k získání prostředku IP adresy a nakonec zadat dotaz přímo prostředku IP adresy. To je ale dlouhý řetězec závislostí a operací, které je potřeba vyřešit, a proto je nákladný. Vzhledem k tomu, že informace JSON jsou místní, dají se načíst místo toho.

Z JSON se také načte hodnota pro uživatele virtuálního počítače. Heslo virtuálního počítače se načetlo dříve z ověřovacího souboru.

Další kroky

V tomto rychlém startu jste vzali existující šablonu a nasadili ji prostřednictvím Go. Potom jste se přes SSH připojili k nově vytvořenému virtuálnímu počítači.

Pokud se chcete dál seznamovat s použitím virtuálních počítačů v prostředí Azure s Go, prohlédněte si témata s ukázkami výpočetních funkcí Azure pro Go a ukázkami správy prostředků Azure pro Go.

Další informace o dostupných metodách ověřování v sadě SDK a typech ověřování, které podporují, najdete v tématu Ověřování pomocí sady Azure SDK for Go.