Azure-beli virtuálisgép-méretezési csoport létrehozása Egyéni Packer-rendszerképből a Terraform használatával
A Terraform lehetővé teszi a felhőinfrastruktúra definícióját, előzetes verzióját és üzembe helyezését. A Terraform használatával konfigurációs fájlokat hozhat létre HCL-szintaxissal. A HCL szintaxissal megadhatja a felhőszolgáltatót – például az Azure-t – és a felhőinfrastruktúra elemeit. A konfigurációs fájlok létrehozása után létrehoz egy végrehajtási tervet , amely lehetővé teszi az infrastruktúra változásainak előzetes megtekintését az üzembe helyezés előtt. A módosítások ellenőrzése után alkalmazza a végrehajtási tervet az infrastruktúra üzembe helyezésére.
Az Azure-beli virtuálisgép-méretezési csoportok lehetővé teszik azonos virtuális gépek konfigurálását. A virtuálisgép-példányok száma igény vagy ütemezés alapján módosítható. További információ: Virtuálisgép-méretezési csoport automatikus méretezése az Azure Portalon.
Ebben a cikkben az alábbiakkal ismerkedhet meg:
- A Terraform-környezet beállítása
- Változók és kimenetek használata egy Terraform-környezethez
- Hálózati infrastruktúra létrehozása és üzembe helyezése
- Egyéni virtuálisgép-rendszerkép létrehozása a Packer használatával
- Virtuálisgép-méretezési csoport létrehozása és üzembe helyezése az egyéni rendszerkép használatával
- Jumpbox létrehozása és üzembe helyezése
1. A környezet konfigurálása
- Azure-előfizetés: 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.
A Terraform konfigurálása: Ha még nem tette meg, konfigurálja a Terraformot az alábbi lehetőségek egyikével:
2. Packer-rendszerkép létrehozása
-
Főbb pontok:
- Annak ellenőrzéséhez, hogy rendelkezik-e hozzáféréssel a Packer végrehajtható fájljához, futtassa a következő parancsot:
packer -v
. - A környezettől függően előfordulhat, hogy be kell állítania az elérési utat, és újra meg kell nyitnia a parancssort.
- Annak ellenőrzéséhez, hogy rendelkezik-e hozzáféréssel a Packer végrehajtható fájljához, futtassa a következő parancsot:
Futtassa az az group create parancsot egy erőforráscsoport létrehozásához a Packer-rendszerkép tárolásához.
az group create -n myPackerImages -l eastus
Futtassa az az ad sp create-for-rbac parancsot, hogy a Packer hitelesítést végezzen az Azure-ban egy szolgáltatásnév használatával.
az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription_id> --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
Főbb pontok:
- Jegyezze fel a kimeneti értékeket (
appId
,client_secret
,tenant_id
).
- Jegyezze fel a kimeneti értékeket (
Futtassa az az account show-t az aktuális Azure-előfizetés megjelenítéséhez.
az account show --query "{ subscription_id: id }"
Hozzon létre egy Packer-sablonváltozók nevű fájlt
ubuntu.pkr.hcl
, és szúrja be a következő kódot. Frissítse a kiemelt sorokat a szolgáltatásnévvel és az Azure-előfizetés adataival.packer { required_plugins { azure = { source = "github.com/hashicorp/azure" version = "~> 2" } } } variable client_id { type = string default = null } variable client_secret { type = string default = null } variable subscription_id { type = string default = null } variable tenant_id { type = string default = null } variable location { default = "eastus" } variable "image_resource_group_name" { description = "Name of the resource group in which the Packer image will be created" default = "myPackerImages" } source "azure-arm" "builder" { client_id = var.client_id client_secret = var.client_secret image_offer = "UbuntuServer" image_publisher = "canonical" image_sku = "16.04-LTS" location = var.location managed_image_name = "myPackerImage" managed_image_resource_group_name = var.image_resource_group_name os_type = "Linux" subscription_id = var.subscription_id tenant_id = var.tenant_id vm_size = "Standard_DS2_v2" azure_tags = { "dept" : "Engineering", "task" : "Image deployment", } } build { sources = ["source.azure-arm.builder"] provisioner "shell" { execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'" inline = [ "apt-get update", "apt-get upgrade -y", "apt-get -y install nginx", "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync", ] } }
Főbb pontok:
- Állítsa be a
client_id
,client_secret
éstenant_id
a mezőket a szolgáltatásnév megfelelő értékeire. - Állítsa be a
subscription_id
mezőt az Azure-előfizetés azonosítójához.
- Állítsa be a
Hozza létre a Packer-rendszerképet.
packer build ubuntu.json
3. A Terraform-kód implementálása
Hozzon létre egy könyvtárat, amelyben tesztelheti a Terraform-mintakódot, és az aktuális könyvtárá teheti.
Hozzon létre egy elnevezett
main.tf
fájlt, és szúrja be a következő kódot:terraform { required_version = ">=0.12" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } azapi = { source = "Azure/azapi" version = "~> 1.0" } local = { source = "hashicorp/local" version = "2.4.0" } random = { source = "hashicorp/random" version = "3.5.1" } tls = { source = "hashicorp/tls" version = "4.0.4" } } } provider "azurerm" { features {} } resource "random_pet" "id" {} resource "azurerm_resource_group" "vmss" { name = coalesce(var.resource_group_name, "201-vmss-packer-jumpbox-${random_pet.id.id}") location = var.location tags = var.tags } resource "random_string" "fqdn" { length = 6 special = false upper = false numeric = 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 } data "azurerm_resource_group" "image" { name = var.packer_resource_group_name } data "azurerm_image" "image" { name = var.packer_image_name resource_group_name = data.azurerm_resource_group.image.name } resource "azapi_resource" "ssh_public_key" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" name = random_pet.id.id location = azurerm_resource_group.vmss.location parent_id = azurerm_resource_group.vmss.id } resource "azapi_resource_action" "ssh_public_key_gen" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" resource_id = azapi_resource.ssh_public_key.id action = "generateKeyPair" method = "POST" response_export_values = ["publicKey", "privateKey"] } resource "random_password" "password" { count = var.admin_password == null ? 1 : 0 length = 20 } locals { admin_password = try(random_password.password[0].result, var.admin_password) } 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 { id = data.azurerm_image.image.id } 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 = local.admin_password } os_profile_linux_config { disable_password_authentication = true ssh_keys { path = "/home/azureuser/.ssh/authorized_keys" key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey } } 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 = local.admin_password } os_profile_linux_config { disable_password_authentication = true ssh_keys { path = "/home/azureuser/.ssh/authorized_keys" key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey } } tags = var.tags }
Hozzon létre egy fájlt
variables.tf
, amely tartalmazza a projektváltozókat, és szúrja be a következő kódot:variable "packer_resource_group_name" { description = "Name of the resource group in which the Packer image will be created" default = "myPackerImages" } variable "packer_image_name" { description = "Name of the Packer image" default = "myPackerImage" } variable "resource_group_name" { description = "Name of the resource group in which the Packer image will be created" default = null } 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" default = null }
Hozzon létre egy fájlt,
output.tf
amely megadja, hogy milyen értékek jelenjenek meg a Terraformban, és szúrja be a következő kódot: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 }
4. A Terraform inicializálása
Futtassa a Terraform init parancsot a Terraform üzembe helyezésének inicializálásához. Ez a parancs letölti az Azure-erőforrások kezeléséhez szükséges Azure-szolgáltatót.
terraform init -upgrade
Főbb pontok:
- A
-upgrade
paraméter frissíti a szükséges szolgáltatói beépülő modulokat a legújabb verzióra, amely megfelel a konfiguráció verziókorlátozásainak.
5. Terraform végrehajtási terv létrehozása
Végrehajtási terv létrehozásához futtassa a Terraform-tervet .
terraform plan -out main.tfplan
Főbb pontok:
- A
terraform plan
parancs létrehoz egy végrehajtási tervet, de nem hajtja végre. Ehelyett meghatározza, hogy milyen műveletek szükségesek a konfigurációs fájlokban megadott konfiguráció létrehozásához. Ez a minta lehetővé teszi annak ellenőrzését, hogy a végrehajtási terv megfelel-e az elvárásainak, mielőtt módosítanák a tényleges erőforrásokat. - Az opcionális
-out
paraméter lehetővé teszi a terv kimeneti fájljának megadását.-out
A paraméter használatával biztosítható, hogy a vizsgált terv pontosan az alkalmazott legyen.
6. Terraform végrehajtási terv alkalmazása
A terraform futtatásával alkalmazza a végrehajtási tervet a felhőinfrastruktúrára.
terraform apply main.tfplan
Főbb pontok:
- A példaparancs
terraform apply
feltételezi, hogy korábban futtatottterraform plan -out main.tfplan
. - Ha másik fájlnevet adott meg a
-out
paraméterhez, használja ugyanazt a fájlnevet a hívásbanterraform apply
. - Ha nem használta a paramétert
-out
, hívjonterraform apply
paraméterek nélkül.
7. Ellenőrizze az eredményeket
A parancs kimenetében a
terraform apply
következő értékek láthatók:- Virtuális gép teljes tartományneve
- Jumpbox FQDN
- Jumpbox IP-címe
Keresse meg a virtuális gép URL-címét, és erősítse meg az alapértelmezett oldalt az üdvözli az nginx!.
Az SSH használatával csatlakozhat a jumpbox virtuális géphez a változófájlban meghatározott felhasználónévvel és a futtatáskor
terraform apply
megadott jelszóval. Például:ssh azureuser@<ip_address>
8. Erőforrások törlése
Virtuálisgép-méretezési csoport törlése
Ha már nincs szüksége a Terraformon keresztül létrehozott erőforrásokra, hajtsa végre az alábbi lépéseket:
Futtassa a Terraform-tervet , és adja meg a jelölőt
destroy
.terraform plan -destroy -out main.destroy.tfplan
Főbb pontok:
- A
terraform plan
parancs létrehoz egy végrehajtási tervet, de nem hajtja végre. Ehelyett meghatározza, hogy milyen műveletek szükségesek a konfigurációs fájlokban megadott konfiguráció létrehozásához. Ez a minta lehetővé teszi annak ellenőrzését, hogy a végrehajtási terv megfelel-e az elvárásainak, mielőtt módosítanák a tényleges erőforrásokat. - Az opcionális
-out
paraméter lehetővé teszi a terv kimeneti fájljának megadását.-out
A paraméter használatával biztosítható, hogy a vizsgált terv pontosan az alkalmazott legyen.
- A
A végrehajtási terv alkalmazásához futtassa a terraformát .
terraform apply main.destroy.tfplan
Packer-rendszerkép és erőforráscsoport törlése
Futtassa az az group delete parancsot a Packer-rendszerképet tartalmazó erőforráscsoport törléséhez. A Packer-rendszerkép is törlődik.
az group delete --name myPackerImages --yes
A Terraform hibaelhárítása az Azure-ban
A Terraform Azure-beli használatakor felmerülő gyakori problémák elhárítása
Következő lépések
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: