Öğretici: Teroyform kullanarak Packer özel görüntüsünden Azure sanal makine ölçek kümesi oluşturmaTutorial: Create an Azure virtual machine scale set from a Packer custom image by using Terraform

Bu öğreticide Terrayform kullanarak, HashiCorp yapılandırma dilini (HCL) kullanan yönetilen disklerle birlikte Packer kullanılarak oluşturulan özel bir görüntüyle oluşturulmuş bir Azure sanal makine ölçek kümesi oluşturun ve dağıtın.In this tutorial, you use Terraform to create and deploy an Azure virtual machine scale set created with a custom image produced by using Packer with managed disks that use the HashiCorp Configuration Language (HCL).

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:In this tutorial, you learn how to:

  • Terrayform dağıtımınızı ayarlayın.Set up your Terraform deployment.
  • Terrayform dağıtımı için değişkenleri ve çıkışları kullanın.Use variables and outputs for Terraform deployment.
  • Ağ altyapısı oluşturun ve dağıtın.Create and deploy a network infrastructure.
  • Packer kullanarak özel bir sanal makine görüntüsü oluşturun.Create a custom virtual machine image by using Packer.
  • Özel görüntüyü kullanarak bir sanal makine ölçek kümesi oluşturun ve dağıtın.Create and deploy a virtual machine scale set by using the custom image.
  • Bir JumpBox oluşturun ve dağıtın.Create and deploy a jumpbox.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.If you don't have an Azure subscription, create a free account before you begin.

Ön koşullarPrerequisites

Dosya yapısını oluşturunCreate the file structure

Boş bir dizinde aşağıdaki adları kullanarak üç yeni dosya oluşturun:Create three new files in an empty directory with the following names:

  • variables.tf: Bu dosya şablonda kullanılan değişkenlerin değerlerini içerir.variables.tf: This file holds the values of the variables used in the template.
  • output.tf: Bu dosya dağıtımdan sonra görüntülenecek ayarları açıklar.output.tf: This file describes the settings that display after deployment.
  • vmss.tf: Bu dosya, dağıtmakta olduğunuz altyapının kodunu içerir.vmss.tf: This file contains the code of the infrastructure that you're deploying.

Değişkenleri oluşturmaCreate the variables

Bu adımda Terraform tarafından oluşturulan kaynakları özelleştiren değişkenleri tanımlayacaksınız.In this step, you define variables that customize the resources created by Terraform.

variables.tf dosyasını düzenleyin, aşağıdaki kodu kopyalayın ve değişiklikleri kaydedin.Edit the variables.tf file, copy the following code, and then save the changes.

variable "location" {
  description = "The location where resources are created"
  default     = "East US"
}

variable "resource_group_name" {
  description = "The name of the resource group in which the resources are created"
  default     = ""
}

Not

Resource_group_name değişkeninin varsayılan değeri unset.The default value of the resource_group_name variable is unset. Kendi değerini tanımlayın.Define your own value.

Dosyayı kaydedin.Save the file.

Terkform şablonunuzu dağıttığınızda, uygulamaya erişmek için kullanılan tam etki alanı adını almak istersiniz.When you deploy your Terraform template, you want to get the fully qualified domain name that's used to access the application. Terraform'un output kaynak türünü kullanın ve kaynağın fqdn özelliğini alın.Use the output resource type of Terraform, and get the fqdn property of the resource.

output.tf dosyasını düzenleyin ve aşağıdaki kodu kopyalayarak tam etki alanı adını sanal makinelerin kullanımına açın.Edit the output.tf file, and copy the following code to expose the fully qualified domain name for the virtual machines.

output "vmss_public_ip" {
    value = azurerm_public_ip.vmss.fqdn
}

Şablonda ağ altyapısını tanımlamaDefine the network infrastructure in a template

Bu adımda yeni bir Azure kaynak grubunda aşağıdaki ağ altyapısını oluşturacaksınız:In this step, you create the following network infrastructure in a new Azure resource group:

  • 10.0.0.0/16 adres alanına sahip bir sanal ağ.One virtual network with the address space of 10.0.0.0/16.
  • Adres alanı 10.0.2.0/24 olan bir alt ağ.One subnet with the address space of 10.0.2.0/24.
  • İki genel IP adresi.Two public IP addresses. Bunlardan biri, sanal makine ölçek kümesi yük dengeleyici tarafından kullanılır.One is used by the virtual machine scale set load balancer. Diğer bir deyişle SSH atlama kutusuna bağlanmak için kullanılır.The other is used to connect to the SSH jumpbox.

Ayrıca tüm kaynakların oluşturulacağı bir kaynak grubu da oluşturmanız gerekir.You also need a resource group where all the resources are created.

vmss.tf dosyasını düzenleyip aşağıdaki kodu kopyalayın:Edit and copy the following code in the vmss.tf file:


resource "azurerm_resource_group" "vmss" {
  name     = var.resource_group_name
  location = var.location

  tags {
    environment = "codelab"
  }
}

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 {
    environment = "codelab"
  }
}

resource "azurerm_subnet" "vmss" {
  name                 = "vmss-subnet"
  resource_group_name  = azurerm_resource_group.vmss.name
  virtual_network_name = azurerm_virtual_network.vmss.name
  address_prefix       = "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            = azurerm_resource_group.vmss.name

  tags {
    environment = "codelab"
  }
}

Not

Daha sonra tanımlanmasını kolaylaştırmak için Azure 'da dağıtılan kaynakları etiketleyerek.Tag the resources that are being deployed in Azure to facilitate their identification in the future.

Ağ altyapısını oluşturmaCreate the network infrastructure

.tf dosyalarını oluşturduğunuz dizinde aşağıdaki komutu çalıştırarak Terraform ortamını başlatın:Initialize the Terraform environment by running the following command in the directory where you created the .tf files:

terraform init 

Sağlayıcı eklentileri, Terrayform kayıt defterinden komutu çalıştırdığınız dizindeki .terraform klasörüne indirir.The provider plug-ins download from the Terraform registry into the .terraform folder in the directory where you ran the command.

Altyapıyı Azure'a dağıtmak için aşağıdaki komutu çalıştırın.Run the following command to deploy the infrastructure in Azure.

terraform apply

Genel IP adresinin tam etki alanı adının yapılandırmanıza gittiğinden emin olun.Verify that the fully qualified domain name of the public IP address corresponds to your configuration.

Genel IP adresi için sanal makine ölçek kümesi Terkform tam etki alanı adı

Kaynak grubu aşağıdaki kaynakları kapsar:The resource group contains the following resources:

Sanal makine ölçek kümesi Terraform ağ kaynakları

Packer kullanarak Azure görüntüsü oluşturmaCreate an Azure image by using Packer

Azure 'Da Linux sanal makine görüntüleri oluşturmak Için Packer kullanmaöğreticisindeki adımları izleyerek özel bir Linux görüntüsü oluşturun.Create a custom Linux image by following the steps in the tutorial How to use Packer to create Linux virtual machine images in Azure.

NGINX yüklü olarak önceden sağlanmış bir Ubuntu görüntüsü oluşturmak için öğreticiyi izleyin.Follow the tutorial to create a deprovisioned Ubuntu image with Nginx installed.

Packer görüntüsünü oluşturduktan sonra bir görüntünüz vardır

Not

Bu öğreticinin amaçları doğrultusunda, Packer görüntüsünde, NGINX yüklemek için bir komut çalıştırılır.For the purposes of this tutorial, in the Packer image, a command is run to install Nginx. Oluşturma sırasında kendi betiğinizi de çalıştırabilirsiniz.You can also run your own script while creating.

Altyapıyı düzenleyerek sanal makine ölçek kümesini eklemeEdit the infrastructure to add the virtual machine scale set

Bu adımda önceden dağıttığınız ağ üzerinde aşağıdaki kaynakları oluşturacaksınız:In this step, you create the following resources on the network that was previously deployed:

  • Uygulamayı sunacak bir Azure yük dengeleyici.An Azure load balancer to serve the application. Daha önce dağıtılan genel IP adresine iliştirin.Attach it to the public IP address that was deployed earlier.
  • Uygulamayı sunacak bir Azure yük dengeleyici ve kuralları.One Azure load balancer and rules to serve the application. Daha önce yapılandırılmış genel IP adresine iliştirin.Attach it to the public IP address that was configured earlier.
  • Bir Azure arka uç Adres Havuzu.An Azure back-end address pool. Yük dengeleyiciye atayın.Assign it to the load balancer.
  • Uygulama tarafından kullanılan ve yük dengeleyicide yapılandırılan bir sistem durumu araştırması bağlantı noktası.A health probe port used by the application and configured on the load balancer.
  • Yük dengeleyicinin arkasında yer alan ve daha önce dağıtılan sanal ağ üzerinde çalışan bir sanal makine ölçek kümesi.A virtual machine scale set that sits behind the load balancer and runs on the virtual network that was deployed earlier.
  • Özel görüntüden yüklenen sanal makine ölçeğinin düğümlerinde NGINX .Nginx on the nodes of the virtual machine scale installed from a custom image.

vmss.tf dosyasının sonuna aşağıdaki kodu ekleyin.Add the following code to the end of the vmss.tf file.


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 {
    environment = "codelab"
  }
}

resource "azurerm_lb_backend_address_pool" "bpepool" {
  resource_group_name = azurerm_resource_group.vmss.name
  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 = "myResourceGroup"
}

data "azurerm_image" "image" {
  name                = "myPackerImage"
  resource_group_name = data.azurerm_resource_group.image.name
}

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       = "azureuser"
    admin_password       = "Passwword1234"
  }

  os_profile_linux_config {
    disable_password_authentication = true

    ssh_keys {
      path     = "/home/azureuser/.ssh/authorized_keys"
      key_data = file("~/.ssh/id_rsa.pub")
    }
  }

  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 {
    environment = "codelab"
  }
}

Dağıtımı özelleştirmek için variables.tf dosyasına aşağıdaki kodu ekleyin:Customize the deployment by adding the following code to variables.tf:

variable "application_port" {
    description = "The port that you want to expose to the external load balancer"
    default     = 80
}

variable "admin_password" {
    description = "Default password for admin"
    default = "Passwwoord11223344"
}

Sanal makine ölçek kümesini Azure'da dağıtmaDeploy the virtual machine scale set in Azure

Sanal makine ölçek kümesi dağıtımını görselleştirmek için aşağıdaki komutu çalıştırın:Run the following command to visualize the virtual machine scale set deployment:

terraform plan

Komutunu çıkışı şu görüntüye benzer olacaktır:The output of the command looks like the following image:

Terraform sanal makine ölçek kümesi ekleme planı

Ek kaynakları Azure'a dağıtın:Deploy the additional resources in Azure:

terraform apply 

Kaynak grubunun içeriği şu görüntüye benzer olacaktır:The content of the resource group looks like the following image:

Terraform sanal makine ölçek kümesi kaynak grubu

Bir tarayıcı penceresi açın ve komutun döndürdüğü tam etki alanı adına bağlanın.Open a browser and connect to the fully qualified domain name that was returned by the command.

Var olan ağa sıçrama kutusu eklemeAdd a jumpbox to the existing network

Bu isteğe bağlı adım, sıçrama kutusu kullanarak sanal makine ölçek kümesi örneklerine SSH erişimi sunar.This optional step enables SSH access to the instances of the virtual machine scale set by using a jumpbox.

Var olan dağıtımınıza aşağıdaki kaynakları ekleyin:Add the following resources to your existing deployment:

  • Sanal makine ölçek kümesi ile aynı alt ağa bağlı bir ağ arabirimiA network interface connected to the same subnet as the virtual machine scale set
  • Bu ağ arabirimine sahip bir sanal makineA virtual machine with this network interface

vmss.tf dosyasının sonuna aşağıdaki kodu ekleyin:Add the following code to the end of the vmss.tf file:

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            = "${azurerm_resource_group.vmss.name}-ssh"

  tags {
    environment = "codelab"
  }
}

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 {
    environment = "codelab"
  }
}

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 = "azureuser"
    admin_password = "Password1234!"
  }

  os_profile_linux_config {
    disable_password_authentication = true

    ssh_keys {
      path     = "/home/azureuser/.ssh/authorized_keys"
      key_data = file("~/.ssh/id_rsa.pub")
    }
  }

  tags {
    environment = "codelab"
  }
}

Dağıtım tamamlandığında sıçrama kutusu ana bilgisayar adını görüntüleyen aşağıdaki kodu eklemek için outputs.tf düzenleyin:Edit outputs.tf to add the following code that displays the hostname of the jumpbox when the deployment finishes:

output "jumpbox_public_ip" {
    value = azurerm_public_ip.jumpbox.fqdn
}

Sıçrama kutusu dağıtmaDeploy the jumpbox

Sıçrama kutusu dağıtın.Deploy the jumpbox.

terraform apply 

Dağıtım tamamlandıktan sonra, kaynak grubunun içeriği aşağıdaki görüntüye benzer şekilde görünür:After the deployment has completed, the content of the resource group looks like the following image:

Terraform sanal makine ölçek kümesi kaynak grubu

Not

Parola ile oturum açma, sıçrama kutusu ve dağıttığınız sanal makine ölçek kümesi üzerinde devre dışıdır.Sign-in with a password is disabled on the jumpbox and the virtual machine scale set that you deployed. VM 'Lere erişmek için SSH ile oturum açın.Sign in with SSH to access the VMs.

Ortamı temizlemeClean up the environment

Aşağıdaki komutlar bu öğreticide oluşturulan kaynakları siler:The following commands delete the resources created in this tutorial:

terraform destroy

Kaynakları silme işlemini onaylamanız istendiğinde Evet yazın.Enter yes when you're asked to confirm the deletion of the resources. Yok etme işleminin tamamlanması birkaç dakika sürebilir.The destruction process can take a few minutes to complete.

Sonraki adımlarNext steps