Terraform kullanarak bir Azure sanal makine ölçek kümesi oluşturmaUse Terraform to create an Azure virtual machine scale set

Azure sanal makine ölçek kümeleri, bire bir aynı ve yük dengeleme özellikli bir sanal makine grubu oluşturmanızı ve yönetmenizi sağlar. Bu gruptaki sanal makine örneklerinin sayısı talep üzerine veya bir plan doğrultusunda otomatik olarak artırılabilir veya azaltılabilir.Azure virtual machine scale sets allow you to create and manage a group of identical, load balanced virtual machines where the number of virtual machine instances can automatically increase, or decrease in response to demand or a defined schedule.

Bu öğreticide, Azure Cloud Shell'i kullanarak aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:In this tutorial, you learn how to use Azure Cloud Shell to perform the following tasks:

  • Terraform dağıtımı ayarlamaSet up a Terraform deployment
  • Terraform dağıtımı için değişkenleri ve çıkışları kullanmaUse variables and outputs for Terraform deployment
  • Ağ altyapısı oluşturma ve dağıtmaCreate and deploy network infrastructure
  • Sanal makine ölçek kümesi oluşturma, dağıtma ve ağa eklemeCreate and deploy a virtual machine scale set and attach it to the network
  • VM'lere SSH aracılığıyla bağlanmak için bir sıçrama kutusu oluşturma ve dağıtmaCreate and deploy a jumpbox to connect to the VMs via SSH

Not

Bu makalede kullanılan yapılandırma dosyalar, Terraform en son sürümünü GitHub deposunu harika Terraform.The most recent version of the Terraform configuration files used in this article are in the Awesome Terraform repository on GitHub.

ÖnkoşullarPrerequisites

Dizin yapısını oluşturmaCreate the directory structure

  1. Azure portala gidin.Browse to the Azure portal.

  2. Azure Cloud Shell'i açın.Open Azure Cloud Shell. Önceden bir ortam seçmediyseniz Bash ortamını seçin.If you didn't select an environment previously, select Bash as your environment.

    Cloud Shell istemi

  3. clouddrive dizinine geçin.Change directories to the clouddrive directory.

    cd clouddrive
    
  4. vmss adlı bir dizin oluşturun.Create a directory named vmss.

    mkdir vmss
    
  5. Dizinleri yeni dizinle değiştirin:Change directories to the new directory:

    cd vmss
    

Değişken tanımı dosyasını oluşturmaCreate the variables definitions file

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

Azure Cloud Shell'de aşağıdaki adımları gerçekleştirin:Within the Azure Cloud Shell, perform the following steps:

  1. variables.tf adlı bir dosya oluşturun.Create a file named variables.tf.

    vi variables.tf
    
  2. I tuşunu seçerek ekleme moduna geçin.Enter insert mode by selecting the I key.

  3. Aşağıdaki kodu düzenleyiciye yapıştırın:Paste the following code into the editor:

    variable "location" {
     description = "The location where resources will be created"
    }
    
    variable "tags" {
     description = "A map of the tags to use for the resources that are deployed"
     type        = "map"
    
     default = {
       environment = "codelab"
     }
    }
    
    variable "resource_group_name" {
     description = "The name of the resource group in which the resources will be created"
     default     = "myResourceGroup"
    }
    
  4. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  5. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    

Çıkış tanımları dosyasını oluşturmaCreate the output definitions file

Bu bölümde dağıtım sonrasındaki çıkışı açıklayan dosyayı oluşturacaksınız.In this section, you create the file that describes the output after deployment.

Azure Cloud Shell'de aşağıdaki adımları gerçekleştirin:Within the Azure Cloud Shell, perform the following steps:

  1. output.tf adlı bir dosya oluşturun.Create a file named output.tf.

    vi output.tf
    
  2. I tuşunu seçerek ekleme moduna geçin.Enter insert mode by selecting the I key.

  3. Aşağıdaki kodu düzenleyiciye yapıştırarak tam etki alanı adını (FQDN) sanal makinelerin kullanımına açın.Paste the following code into the editor to expose the fully qualified domain name (FQDN) for the virtual machines. ::

     output "vmss_public_ip" {
         value = "${azurerm_public_ip.vmss.fqdn}"
     }
    
  4. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  5. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    

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

Bu bölümde yeni bir Azure kaynak grubunda aşağıdaki ağ altyapısını oluşturacaksınız:In this section, 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 (VNET) with the address space of 10.0.0.0/16
  • 10.0.2.0/24 adres alanına sahip bir alt ağOne subnet with the address space of 10.0.2.0/24
  • İki genel IP adresi.Two public IP addresses. Biri sanal makine ölçek kümesi yük dengeleyici tarafından, diğeri ise SSH sıçrama kutusuna bağlanmak için kullanılır.One used by the virtual machine scale set load balancer, the other used to connect to the SSH jumpbox.

Azure Cloud Shell'de aşağıdaki adımları gerçekleştirin:Within the Azure Cloud Shell, perform the following steps:

  1. Sanal makine ölçek kümesi altyapısını açıklayacak vmss.tf adlı bir dosya oluşturun.Create a file named vmss.tf to describe the virtual machine scale set infrastructure.

    vi vmss.tf
    
  2. I tuşunu seçerek ekleme moduna geçin.Enter insert mode by selecting the I key.

  3. Aşağıdaki kodu dosyanın sonuna yapıştırarak tam etki alanı adını (FQDN) sanal makinelerin kullanımına açın.Paste the following code to the end of the file to expose the fully qualified domain name (FQDN) for the virtual machines.

    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_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            = "${random_string.fqdn.result}"
     tags                         = "${var.tags}"
    }
    
  4. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  5. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    

Ağ altyapısını sağlamaProvision the network infrastructure

Azure Cloud Shell'i yapılandırma dosyalarını (.tf) oluşturduğunuz dizinde kullanarak aşağıdaki adımları gerçekleştirin:Using the Azure Cloud Shell from the directory where you created the configuration files (.tf) perform the following steps:

  1. Terraform'u başlatın.Initialize Terraform.

    terraform init
    
  2. Tanımlanan altyapıyı Azure'a dağıtmak için aşağıdaki komutu çalıştırın.Run the following command to deploy the defined infrastructure in Azure.

    terraform apply
    

    location değişkeni variables.tf dosyasında tanımlandığından ancak ayarlanmadığından Terraform bir "location" değeri belirlemenizi ister.Terraform prompts you for a "location" value as the location variable is defined in variables.tf, but it's never set. "West US" gibi geçerli bir konum girip Enter tuşuyla onaylayabilirsiniz.You can enter any valid location - such as "West US" followed by selecting Enter. (Boşluk içeren değerleri girerken parantez kullanın.)(Use parentheses around any value with spaces.)

  3. Terraform, output.tf dosyasında tanımlanan şekilde çıkışı yazdırır.Terraform prints the output as defined in the output.tf file. Aşağıdaki ekran görüntüsünde gösterildiği gibi FQDN <kimlik>.<konum>.cloudapp.azure.com biçiminde olur.As shown in the following screenshot, the FQDN takes the form <id>.<location>.cloudapp.azure.com. Kimlik değeri hesaplanan bir değerdir ve konum yerine Terraform'u çalıştırırken belirlediğiniz değer gösterilir.The id value is a computed value and location is the value you provide when running Terraform.

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

  4. Azure portal ana menüsünden Kaynak grupları'nı seçin.In the Azure portal menu, select Resource groups from the main menu.

  5. Terraform tarafından oluşturulan kaynakları görüntülemek için Kaynak grupları sekmesinde myResourceGroup kaynak grubunu seçin.On the Resource groups tab, select myResourceGroup to view the resources that were created by Terraform. Sanal makine ölçek kümesi ağ kaynaklarıVirtual machine scale set network resources

Sanal makine ölçek kümesi eklemeAdd a virtual machine scale set

Bu bölümde şablona aşağıdaki kaynakları eklemeyi öğreneceksiniz:In this section, you learn how to add the following resources to the template:

  • Uygulamayı sunmak ve bu makalenin önceki bölümlerinde yapılandırılan genel IP adresine eklemek için bir Azure yük dengeleyici ve kurallarAn Azure load balancer and rules to serve the application and attach it to the public IP address configured earlier in this article
  • Yük dengeleyiciye atanacak Azure arka uç adres havuzuAn Azure backend address pool and assign it to the load balancer
  • Uygulama tarafından kullanılan ve yük dengeleyici üzerinde yapılandırılan sistem durumu yoklama bağlantı noktasıA health probe port used by the application and configured on the load balancer
  • Bu makalenin önceki bölümlerinde dağıtılan sanal ağ üzerinde çalışan ve yük dengeleyicinin arkasında bulunan bir sanal makine ölçek kümesiA virtual machine scale set sitting behind the load balancer that runs on the VNET deployed earlier in this article
  • cloud-init kullanılarak yüklenen ve sanal makine ölçek kümesi düğümlerinde bulunan Nginx.Nginx on the nodes of the virtual machine scale using cloud-init.

Cloud Shell'de aşağıdaki adımları gerçekleştirin:In Cloud Shell, perform the following steps:

  1. vmss.tf yapılandırma dosyasını açın.Open the vmss.tf configuration file.

    vi vmss.tf
    
  2. Dosyanın sonuna gidin ve A tuşuna basarak ekleme moduna geçin.Go to the end of the file and enter append mode by selecting the A key.

  3. Dosyanın sonuna aşağıdaki kodu yapıştırın:Paste the following code to the end of the 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 = "${var.tags}"
    }
    
    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}"
    }
    
    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}"
    }
    
  4. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  5. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    
  6. Ölçek kümesine dahil olan sanal makineler için cloud-init yapılandırması görevi görecek web.conf adlı bir dosya oluşturun.Create a file named web.conf to serve as the cloud-init configuration for the virtual machines that are part of the scale set.

    vi web.conf
    
  7. I tuşunu seçerek ekleme moduna geçin.Enter insert mode by selecting the I key.

  8. Aşağıdaki kodu düzenleyiciye yapıştırın:Paste the following code into the editor:

    #cloud-config
    packages:
     - nginx
    
  9. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  10. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    
  11. variables.tf yapılandırma dosyasını açın.Open the variables.tf configuration file.

    vi variables.tf
    
  12. Dosyanın sonuna gidin ve A tuşuna basarak ekleme moduna geçin.Go to the end of the file and enter append mode by selecting the A key.

  13. Dağıtımı özelleştirmek için dosyanın sonuna aşağıdaki kodu yapıştırın:Customize the deployment by pasting the following code to the end of the file:

    variable "application_port" {
       description = "The 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"
    }
    
  14. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  15. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

    :wq
    
  16. Sanal makine ölçek kümesi dağıtımını görselleştirmek için bir Terraform planı oluşturun.Create a Terraform plan to visualize the virtual machine scale set deployment. (Kaynaklarınızın konumuna ek olarak bir parola da belirlemeniz gerekir.)(You need to specify a password of your choosing, as well as the location for your resources.)

    terraform plan
    

    Komut çıktısı aşağıdaki ekran görüntüsüne benzer olmalıdır:The output of the command should be similar to the following screenshot:

    Sanal makine ölçek kümesi oluşturma işleminin çıkışı

  17. Yeni kaynakları Azure'a dağıtın.Deploy the new resources in Azure.

    terraform apply
    

    Komut çıktısı aşağıdaki ekran görüntüsüne benzer olmalıdır:The output of the command should be similar to the following screenshot:

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

  18. Bir tarayıcı penceresi açın ve komutun döndürdüğü FQDN değerine bağlanın.Open a browser and connect to the FQDN that was returned by the command.

    FQDN değerine göz atma sonuçları

SSH sıçrama kutusu eklemeAdd an SSH jumpbox

SSH sıçrama kutusu, ağdaki diğer sunuculara erişmek için üzerine "sıçradığınız" tek bir sunucudur.An SSH jumpbox is a single server that you "jump" through in order to access other servers on the network. Bu adımda aşağıdaki kaynakları oluşturacaksınız:In this step, you configure the following resources:

  • Sanal makine ölçek kümesiyle aynı alt ağa bağlı olan bir ağ arabirimi (veya sıçrama kutusu).A network interface (or jumpbox) connected to the same subnet as the virtual machine scale set.

  • Bu ağ arabirimine bağlı bir sanal makine.A virtual machine connected with this network interface. Bu "sıçrama kutusuna" uzaktan erişim sağlanabilir.This 'jumpbox' is remotely accessible. Bağlantı kurduktan sonra SSH ile ölçek kümesindeki sanal makinelere bağlanabilirsiniz.Once connected, you can SSH to any of the virtual machines in the scale set.

  1. vmss.tf yapılandırma dosyasını açın.Open the vmss.tf configuration file.

    vi vmss.tf
    
  2. Dosyanın sonuna gidin ve A tuşuna basarak ekleme moduna geçin.Go to the end of the file and enter append mode by selecting the A key.

  3. Dosyanın sonuna aşağıdaki kodu yapıştırın:Paste the following code to the end of the 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            = "${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}"
    }
    
  4. output.tf yapılandırma dosyasını açın.Open the output.tf configuration file.

    vi output.tf
    
  5. Dosyanın sonuna gidin ve A tuşuna basarak ekleme moduna geçin.Go to the end of the file and enter append mode by selecting the A key.

  6. Dağıtım tamamlandığında sıçrama kutusunun ana bilgisayar adının gösterilmesi için aşağıdaki kodu dosyanın sonuna yapıştırın:Paste the following code to the end of the file to display the hostname of the jumpbox when the deployment is complete:

    output "jumpbox_public_ip" {
       value = "${azurerm_public_ip.jumpbox.fqdn}"
    }
    
  7. Esc tuşuna basarak ekleme modundan çıkın.Exit insert mode by selecting the Esc key.

  8. Dosyayı kaydedin ve aşağıdaki komutu girerek VI düzenleyicisini kapatın:Save the file and exit the vi editor by entering the following command:

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

    terraform apply
    

Dağıtım tamamlandıktan sonra kaynak grubunun içeriği şu ekran görüntüsünde gösterilene benzer olacaktır:Once the deployment has completed, the content of the resource group resembles that shown in the following screenshot:

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

Not

Dağıttığınız sıçrama kutusunda ve sanal makine ölçek kümesinde devre dışı bırakılmış olan bir parolayla oturum açma imkanı.The ability to log in with a password is disabled on the jumpbox and the virtual machine scale set that you deployed. Sanal makinelere erişmek için SSH ile oturum açın.Log in with SSH to access the virtual machine(s).

Ortamı temizlemeEnvironment cleanup

Bu öğreticide oluşturulan Terraform kaynaklarını silmek için Cloud Shell'e şu komutu girin:To delete the Terraform resources that were created in this tutorial, enter the following command into Cloud Shell:

terraform destroy

Yok etme işleminin tamamlanması birkaç dakika sürebilir.The destruction process can take several minutes to complete.

Sonraki adımlarNext steps

Bu öğreticide Terraform kullanarak Azure sanal makine ölçek kümesi oluşturmayı öğrendiniz.In this article, you learned how to use Terraform to create an Azure virtual machine scale set. Aşağıdaki kaynaklardan Azure'da Terraform kullanımı hakkında daha fazla bilgi edinebilirsiniz:Here are some additional resources to help you learn more about Terraform on Azure:

Microsoft.com Terraform Hub Terraform'u Azure sağlayıcısı belgelerine Terraform'u Azure sağlayıcısı kaynak Terraform Azure modülleriTerraform Hub in Microsoft.com Terraform Azure provider documentation Terraform Azure provider source Terraform Azure modules