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.
Otevřete Cloud Shell ve vašem prohlížeči.
V nabídce v pravém horním rohu webu Azure Portal vyberte tlačítko Cloud Shell.
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 proservice
, 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.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro