Gyors útmutató: Azure-beli virtuális gép üzembe helyezése sablonból a Góhoz készült Azure SDK-val

Ez a rövid útmutató bemutatja, hogyan helyezhet üzembe erőforrásokat Azure Resource Manager-sablonból a Góhoz készült Azure SDK használatával. A sablonok az összes erőforrás pillanatképei egy Azure-erőforráscsoportban. Menet közben megismerheti az SDK működését és konvencióit.

A rövid útmutató végén olyan futó virtuális gépe lesz, amelybe felhasználónévvel és jelszóval tud bejelentkezni.

Megjegyzés:

Egy virtuális gép a Góban Resource Manager-sablon nélkül való létrehozásának menetét egy imperatív minta ismerteti, amely bemutatja, hogyan állíthatja össze és konfigurálhatja az összes virtuálisgép-erőforrást az SDK használatával. A minta használata ebben a példában lehetővé teszi az SDK konvencióira való koncentrálást az Azure szolgáltatásarchitektúrájának részletekbe menő ismertetése nélkül.

Ha nem rendelkezik Azure-előfizetéssel, első lépésként mindössze néhány perc alatt létrehozhat egy ingyenes fiókot.

Az Azure Cloud Shell elindítása

Az Azure Cloud Shell egy olyan interaktív felület, amely az Azure-on fut. A gyakran használt eszközök már előre telepítve és konfigurálva vannak a fiókjával történő használathoz. A Másolás gombra kattintva másolja a kódot, illessze be a Cloud Shellbe, majd nyomja le az Enter billentyűt a futtatáshoz.

Néhány módszer a Cloud Shell indításához:

A kódblokk jobb felső sarkában válassza a Kipróbálás lehetőséget.

Cloud Shell in this article

Nyissa meg a Cloud Shellt a böngészőben.

https://shell.azure.com/bash

Válassza a Cloud Shell gombot az Azure Portal jobb felső sarkában található menüben.

Cloud Shell in the portal

Ha az Azure CLI helyi telepítését használja, ehhez a rövid útmutatóhoz a CLI 2.0.28-as vagy újabb verziójára van szükség. Futtassa az az --version parancsot annak ellenőrzéséhez, hogy a CLI telepítés megfelel-e ennek a követelménynek. If you need to install or upgrade, see Install the Azure CLI.

A Góhoz készült Azure SDK telepítése

A Góhoz készült Azure SDK a Go 1.8-as és újabb verzióival kompatibilis. Az Azure Stack-profilokat használó környezetekben a Go 1.9-es verziója a minimális követelmény. Ha telepítenie kell a Gót, kövesse a Go telepítési utasításait.

A Góhoz készült Azure SDK-t és annak függőségeit a következőn keresztül töltheti le: go get.

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

Figyelmeztetés

Győződjön meg arról, hogy az Azure nagybetűvel szerepeljen az URL-címben. Ellenkező esetben az írásmóddal kapcsolatos importálási hibák fordulhatnak elő az SDK használatakor. Az Azure szót az importálási utasításokban is nagybetűvel kell megadni.

Egyszerű szolgáltatás létrehozása

Ha nem interaktív módon szeretne bejelentkezni az Azure-ba egy alkalmazással, egy szolgáltatásnévre lesz szüksége. Az egyszerű szolgáltatások a szerepköralapú hozzáférés-vezérlés (RBAC) részei, amely egyedi felhasználói azonosítót hoz létre. Ha új egyszerű szolgáltatást szeretne létrehozni a parancssori felülettel, futtassa a következő parancsot:

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

Az AZURE_AUTH_LOCATION környezeti változónál állítsa be a fájl teljes elérési útját. Az SDK ezután megkeresi és beolvassa a hitelesítő adatokat közvetlenül a fájlból, anélkül, hogy módosítania kellene valamit, vagy rögzítenie kellene a szolgáltatásnév adatait.

A kód letöltése

A rövid útmutató kódját és az összes függőségét letöltheti a következővel: go get.

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

Nem kell módosítania a forráskódot, ha az AZURE_AUTH_LOCATION változó megfelelően van beállítva. Amikor a program fut, ebből a változóból tölti be a szükséges hitelesítési adatokat.

A kód futtatása

Futtassa a rövid útmutatót a go run paranccsal.

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

Ha az üzembe helyezés sikeres, megjelenik egy üzenet a felhasználónévvel, az IP-címmel és a jelszóval, amelyekkel bejelentkezhet az újonnan létrehozott virtuális gépre. Lépjen be SSH-val a gépre annak ellenőrzéséhez, hogy működik-e.

A felesleges elemek eltávolítása

A rövid útmutató során létrehozott erőforrásokat az erőforráscsoport törlésével, a parancssori felület használatával távolíthatja el.

az group delete -n GoVMQuickstart

Törölje a létrehozott szolgáltatásnevet is. A quickstart.auth fájlban található egy JSON-kulcs a következőhöz: clientId. Másolja ezt az értéket a CLIENT_ID_VALUE-környezet változójához, majd futtassa a következő Azure CLI-parancsot:

az ad sp delete --id ${CLIENT_ID_VALUE}

Ahol megadja a CLIENT_ID_VALUE értékét a következőből: quickstart.auth.

Figyelmeztetés

Ha nem törli az alkalmazáshoz tartozó szolgáltatásnevet, az aktív marad a Microsoft Entra-bérlőben. Bár a szolgáltatásnév neve és jelszava is UUID-ként jön létre, a nem használt szolgáltatásnevek és a Microsoft Entra-alkalmazások törlésével győződjön meg arról, hogy a helyes biztonsági eljárásokat követi.

A kód részletei

A rövid útmutató kódja változócsoportokra és több kis függvényre van felosztva, amelyek leírásait itt találja.

Változók, állandók és típusok

Mivel a rövid útmutató önálló, globális állandókat és változókat használ.

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
)

Meg vannak határozva a létrehozott erőforrások neveit megadó értékek. Itt a hely is meg van adva, amely módosítható, hogy lássa, hogyan működnek az üzemelő példányok más adatközpontokban. Nem minden adatközponton érhető el az összes szükséges erőforrás.

A clientInfo típus magában foglalja az összes, hitelesítési fájlból betöltött információt az ügyfelek SDK-ban való beállításához, valamint a virtuális gép jelszavának beállításához.

A templateFile és parametersFile állandó az üzembe helyezéshez szükséges fájlokra mutat. Az authorizer hitelesítéshez való konfigurálását a Go SDK fogja elvégezni. A ctx változó a hálózati műveletek Go környezete.

Hitelesítés és inicializálás

Az init függvény állítja be a hitelesítést. Mivel a hitelesítés a rövid útmutatóban minden másnak az előfeltétele, logikus, hogy az inicializálás része legyen. A függvény ezen kívül néhány szükséges adatot is betölt a hitelesítési fájlból az ügyfelek és a virtuális gép konfigurálásához.

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)
}

A rendszer először meghívja az auth.NewAuthorizerFromFile függvényt, hogy az betöltse az AZURE_AUTH_LOCATION helyen található fájl hitelesítési adatait. Ezután a readJSON függvény (itt ki van hagyva) manuálisan betölti ezt a fájlt a program többi részének futtatásához szükséges két érték lekéréséhez. Ezek egyike az ügyfél előfizetési azonosítója, a másik pedig a szolgáltatásnév titkos kulcsa, amelyet a virtuális gép jelszavához is használni lehet.

Figyelmeztetés

A rövid útmutató egyszerűsége érdekében a szolgáltatásnév jelszava ugyanaz, mint eddig. Éles környezetben ügyeljen arra, hogy soha ne használja fel többször azt a jelszót, amellyel hozzáférhet az Azure-erőforrásokhoz.

A main() műveletfolyamata

A main függvény egyszerű, csak a műveletek folyamatát jelzi, és hibaellenőrzést végez.

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()
}

A kód által végrehajtott lépések sorrendben a következők:

  • Az üzembe helyezendő erőforráscsoport létrehozása (createGroup)
  • Az üzemelő példány létrehozása ebben a csoportban (createDeployment)
  • Az üzembe helyezett virtuális gép bejelentkezési információinak beszerzése és megjelenítése (getLogin)

Az erőforráscsoport létrehozása

A createGroup függvény létrehozza az erőforráscsoportot. A hívásfolyam és az argumentumok megtekintésekor láthatja, hogyan vannak rendszerezve a szolgáltatásinterakciók az SDK-ban.

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)})
}

Az Azure szolgáltatással való kommunikáció általános folyamata a következő:

  • Hozza létre az ügyfelet a service.New*Client() metódussal, ahol az * a service azon erőforrástípusa, amellyel kommunikálni szeretne. Ez a függvény mindig egy előfizetés-azonosítót vesz fel.
  • Állítsa be az ügyfél engedélyezési metódusát, hogy kommunikálhasson a távoli API-val.
  • Végezze el a metódushívást a távoli API-nak megfelelő ügyfélen. A szolgáltatásügyfél-metódusok általában az erőforrás és egy metaadat-objektum nevét veszik fel.

A to.StringPtr függvénnyel típusátalakítás végezhető. Az SDK metódusainak paraméterei szinte kizárólag mutatókat vesznek, ezért az egyszerűsített metódusok a típusátalakítás megkönnyítése miatt vannak megadva. A dokumentációban lévő autorest/to modulban találja az átalakítók teljes listáját és viselkedését.

A groupsClient.CreateOrUpdate metódus egy mutatót ad vissza az erőforráscsoportot jelölő adattípusnak. Az ilyen típusú közvetlen visszatérési érték olyan rövid futásidejű műveletet jelez, amelynek szinkronban kell lennie. A következő szakasz a hosszú futásidejű műveletek egy példáját, illetve annak a kezelési módját mutatja be.

Az üzembe helyezés végrehajtása

Amikor létrejött az erőforráscsoport, itt az idő az üzembe helyezéshez. Ez a kód a logika különböző részeinek kihangsúlyozása érdekében kisebb szakaszokra van osztva.

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,
    }
        // ...

A readJSON betölti az üzembe helyezési fájlokat, amelyek részletei itt kimaradnak. Ez a függvény visszaad egy *map[string]interface{} elemet, amely az erőforrás üzembe helyezési hívása metaadatainak felépítéséhez használt típus. A virtuális gép jelszavát is manuálisan kell beállítani az üzembehelyezési paramétereknél.

        // ...

    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
    }

Ez a kód ugyanazt a mintát követi, mint az erőforráscsoport létrehozásakor. Létrejön egy új ügyfél, amely hitelesíteni tud az Azure-ral, majd a rendszer meghív egy metódust. A metódusnak ugyanaz a neve is (CreateOrUpdate), mint az erőforráscsoportok megfelelő metódusának. Ez a minta több helyen is látható az SDK-ban. A hasonló munkát végző metódusoknak általában ugyanaz a neve.

A legnagyobb különbség a deploymentsClient.CreateOrUpdate metódus visszaadott értéke. Az érték típusa Jövőbeli, amely a jövőbeli kialakítási mintát követi. A jövő az Azure-ban egy hosszú futásidejű műveletet jelez, amelyet a művelet befejezésekor lekérdezhet, megszakíthat vagy letilthat.

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

Ebben a példában a legjobb, ha megvárja a művelet befejezését. Ha a jövőre vár, szüksége van egy környezeti objektumra és a Future létrehozó ügyfelére. Itt két lehetséges hibaforrás van: Az ügyfél oldalán okozott hiba, amikor megpróbálja meghívni a metódust, illetve egy hibaválasz a kiszolgálóról. Az utóbbit a rendszer a deploymentFuture.Result hívás részeként adja vissza.

A hozzárendelt IP-cím beszerzése

Ha bármit szeretne tenni az újonnan létrehozott virtuális géppel, szüksége van a hozzárendelt IP-címre. Az IP-címek önmaguk saját külön Azure-erőforrásai, amelyek NIC-erőforrásokhoz kötődnek.

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)
}

Ez a metódus a paraméterfájlban tárolt adatokra támaszkodik. A kód közvetlenül le tudta kérdezni a virtuális gépről az NIC-t, lekérdezte az NIC-ről az IP-erőforrást, majd közvetlenül lekérdezte az IP-erőforrást. Ez egy hosszú függőség- és műveletlánc, ezért költséges. Mivel a JSON-adat helyiek, ehelyett betölthetők.

A virtuális gép felhasználójának értéke szintén betölthető a JSON-ból. A virtuális gép jelszava korábban már be lett töltve a hitelesítési fájlból.

További lépések

Ebben a rövid útmutatóban egy meglévő sablont helyezett üzembe a Gón keresztül. Ezután az újonnan létrehozott virtuális gépet SSH-n keresztül csatlakoztatta.

Ha többet szeretne megtudni a virtuális gépek Góval való használatáról az Azure-környezetben, lásd: Azure számítási minták a Góhoz vagy Azure erőforrás-felügyeleti példák a Góhoz.

Ha többet szeretne megtudni az SDK-ban elérhető hitelesítési módszerekről, és az általuk támogatott hitelesítési típusokról, lásd: Hitelesítés a Góhoz készült Azure SDK-val.