Vytvoření sady škálování virtuálních počítačů Azure pomocí Terraformu
Azure Virtual Machine Scale Sets vám umožní nakonfigurovat identické virtuální počítače. Počet instancí virtuálních počítačů se může upravovat na základě poptávky nebo plánu. Další informace najdete v tématu Automatické škálování sady škálování virtuálních počítačů v Azure Portal.
V tomto článku získáte informace o těchto tématech:
- Nastavit nasazení Terraformu
- Použít proměnné a výstupy u nasazení Terraformu
- Vytvořit a nasadit síťovou infrastrukturu
- Vytvořit a nasadit škálovací sadu virtuálních počítačů a připojit ji k síti
- Vytvořit a nasadit jumpbox pro připojení k virtuálním počítačům prostřednictvím protokolu SSH
1. konfigurace prostředí
- Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
Konfigurace terraformu: Pokud jste to ještě neudělali, nakonfigurujte Terraformu pomocí jedné z následujících možností:
- Vytvoření páru klíčů ssh: Další informace najdete v tématu jak vytvořit a použít dvojici veřejného a privátního klíče SSH pro virtuální počítače se systémem Linux v Azure.
2. implementace kódu Terraformu
Vytvořte adresář, ve kterém chcete otestovat ukázkový kód Terraformu a nastavte ho jako aktuální adresář.
Vytvořte soubor s názvem
main.tfa vložte následující kód:terraform { required_version = ">=0.12" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } } } provider "azurerm" { features {} } resource "azurerm_resource_group" "vmss" { name = var.resource_group_name location = var.location tags = var.tags } resource "random_string" "fqdn" { length = 6 special = false upper = false number = false } resource "azurerm_virtual_network" "vmss" { name = "vmss-vnet" address_space = ["10.0.0.0/16"] location = var.location resource_group_name = azurerm_resource_group.vmss.name tags = var.tags } resource "azurerm_subnet" "vmss" { name = "vmss-subnet" resource_group_name = azurerm_resource_group.vmss.name virtual_network_name = azurerm_virtual_network.vmss.name address_prefixes = ["10.0.2.0/24"] } resource "azurerm_public_ip" "vmss" { name = "vmss-public-ip" location = var.location resource_group_name = azurerm_resource_group.vmss.name allocation_method = "Static" domain_name_label = random_string.fqdn.result tags = var.tags } resource "azurerm_lb" "vmss" { name = "vmss-lb" location = var.location resource_group_name = azurerm_resource_group.vmss.name frontend_ip_configuration { name = "PublicIPAddress" public_ip_address_id = azurerm_public_ip.vmss.id } tags = var.tags } resource "azurerm_lb_backend_address_pool" "bpepool" { loadbalancer_id = azurerm_lb.vmss.id name = "BackEndAddressPool" } resource "azurerm_lb_probe" "vmss" { resource_group_name = azurerm_resource_group.vmss.name loadbalancer_id = azurerm_lb.vmss.id name = "ssh-running-probe" port = var.application_port } resource "azurerm_lb_rule" "lbnatrule" { resource_group_name = azurerm_resource_group.vmss.name loadbalancer_id = azurerm_lb.vmss.id name = "http" protocol = "Tcp" frontend_port = var.application_port backend_port = var.application_port backend_address_pool_id = azurerm_lb_backend_address_pool.bpepool.id frontend_ip_configuration_name = "PublicIPAddress" probe_id = azurerm_lb_probe.vmss.id } resource "azurerm_virtual_machine_scale_set" "vmss" { name = "vmscaleset" location = var.location resource_group_name = azurerm_resource_group.vmss.name upgrade_policy_mode = "Manual" sku { name = "Standard_DS1_v2" tier = "Standard" capacity = 2 } storage_profile_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "16.04-LTS" version = "latest" } storage_profile_os_disk { name = "" caching = "ReadWrite" create_option = "FromImage" managed_disk_type = "Standard_LRS" } storage_profile_data_disk { lun = 0 caching = "ReadWrite" create_option = "Empty" disk_size_gb = 10 } os_profile { computer_name_prefix = "vmlab" admin_username = var.admin_user admin_password = var.admin_password custom_data = file("web.conf") } os_profile_linux_config { disable_password_authentication = false } network_profile { name = "terraformnetworkprofile" primary = true ip_configuration { name = "IPConfiguration" subnet_id = azurerm_subnet.vmss.id load_balancer_backend_address_pool_ids = [azurerm_lb_backend_address_pool.bpepool.id] primary = true } } tags = var.tags } resource "azurerm_public_ip" "jumpbox" { name = "jumpbox-public-ip" location = var.location resource_group_name = azurerm_resource_group.vmss.name allocation_method = "Static" domain_name_label = "${random_string.fqdn.result}-ssh" tags = var.tags } resource "azurerm_network_interface" "jumpbox" { name = "jumpbox-nic" location = var.location resource_group_name = azurerm_resource_group.vmss.name ip_configuration { name = "IPConfiguration" subnet_id = azurerm_subnet.vmss.id private_ip_address_allocation = "dynamic" public_ip_address_id = azurerm_public_ip.jumpbox.id } tags = var.tags } resource "azurerm_virtual_machine" "jumpbox" { name = "jumpbox" location = var.location resource_group_name = azurerm_resource_group.vmss.name network_interface_ids = [azurerm_network_interface.jumpbox.id] vm_size = "Standard_DS1_v2" storage_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "16.04-LTS" version = "latest" } storage_os_disk { name = "jumpbox-osdisk" caching = "ReadWrite" create_option = "FromImage" managed_disk_type = "Standard_LRS" } os_profile { computer_name = "jumpbox" admin_username = var.admin_user admin_password = var.admin_password } os_profile_linux_config { disable_password_authentication = false } tags = var.tags }Vytvořte soubor s názvem
variables.tf, který obsahuje proměnné projektu, a vložte následující kód:variable "resource_group_name" { description = "Name of the resource group in which the resources will be created" default = "myResourceGroup" } variable "location" { default = "eastus" description = "Location where resources will be created" } variable "tags" { description = "Map of the tags to use for the resources that are deployed" type = map(string) default = { environment = "codelab" } } variable "application_port" { description = "Port that you want to expose to the external load balancer" default = 80 } variable "admin_user" { description = "User name to use as the admin account on the VMs that will be part of the VM scale set" default = "azureuser" } variable "admin_password" { description = "Default password for admin account" }Vytvořte soubor s názvem a
output.tfUrčete, jaké hodnoty terraformu se zobrazí, a vložte následující kód:output "vmss_public_ip_fqdn" { value = azurerm_public_ip.vmss.fqdn } output "jumpbox_public_ip_fqdn" { value = azurerm_public_ip.jumpbox.fqdn } output "jumpbox_public_ip" { value = azurerm_public_ip.jumpbox.ip_address }Vytvořte soubor s názvem
web.confa vložte následující kód:#cloud-config packages: - nginx
3. inicializace Terraformu
Spusťte terraformu init pro inicializaci nasazení terraformu.
terraform init
Klíčové body:
- Tento příkaz stáhne moduly Azure vyžadované k vytvoření skupiny prostředků Azure.
4. vytvoření plánu spuštění Terraformu
Spuštěním plánu terraformu vytvořte plán spuštění.
terraform plan -out main.tfplan
Klíčové body:
terraform planPříkaz vytvoří plán spuštění, ale neprovede ho. Místo toho určuje, jaké akce je potřeba k vytvoření konfigurace zadané v konfiguračních souborech. Tento model vám umožní ověřit, zda plán spuštění odpovídá vašim očekáváním, a teprve potom provádět změny ve skutečných prostředcích.- Volitelný
-outparametr umožňuje zadat výstupní soubor pro daný plán. Použití-outparametru zajistí, že plán, který jste zkontrolovali, je přesně to, co se používá. - Další informace o zachování plánů provádění a zabezpečení najdete v části upozornění zabezpečení.
5. použití plánu spuštění Terraformu
Spuštění terraformu platí pro použití plánu spuštění pro cloudovou infrastrukturu.
terraform apply main.tfplan
Klíčové body:
terraform applyVýše uvedený příkaz předpokládá, že jste dřív spustiliterraform plan -out main.tfplan.- Pokud jste pro parametr určili jiný název souboru
-out, použijte stejný název souboru v volání metodyterraform apply. - Pokud jste parametr nepoužili
-out, jednoduše zavolejteterraform applybez parametrů.
6. Ověřte výsledky
Z výstupu
terraform applypříkazu se zobrazí následující hodnoty:- Plně kvalifikovaný název domény virtuálního počítače
- JumpBox plně kvalifikovaný název domény
- JumpBox IP adresa
Přejděte na adresu URL virtuálního počítače a potvrďte výchozí stránku s textem Vítejte v Nginx!.
Pomocí SSH se připojte k virtuálnímu počítači s JumpBox pomocí uživatelského jména definovaného v souboru proměnných a hesla, které jste zadali při spuštění
terraform apply. Příklad:ssh azureuser@<ip_address>.
7. vyčištění prostředků
Pokud již nepotřebujete prostředky vytvořené prostřednictvím Terraformu, proveďte následující kroky:
Spusťte plán terraformu a zadejte příznak.
terraform plan -destroy -out main.destroy.tfplanKlíčové body:
terraform planPříkaz vytvoří plán spuštění, ale neprovede ho. Místo toho určuje, jaké akce je potřeba k vytvoření konfigurace zadané v konfiguračních souborech. Tento model vám umožní ověřit, zda plán spuštění odpovídá vašim očekáváním, a teprve potom provádět změny ve skutečných prostředcích.- Volitelný
-outparametr umožňuje zadat výstupní soubor pro daný plán. Použití-outparametru zajistí, že plán, který jste zkontrolovali, je přesně to, co se používá. - Další informace o zachování plánů provádění a zabezpečení najdete v části upozornění zabezpečení.
Spusťte terraformu použít pro použití plánu spuštění.
terraform apply main.destroy.tfplan
Řešení potíží s Terraformu v Azure
Řešení běžných problémů při použití Terraformu v Azure