Terrayform kullanarak bir Azure sanal makine ölçek kümesi oluşturma

Azure sanal makine ölçek kümeleri , özdeş VM 'leri yapılandırmanızı sağlar. Sanal makine örneklerinin sayısı isteğe göre veya bir zamanlamaya göre ayarlayabilir. Daha fazla bilgi için, bkz. Azure Portal sanal makine ölçek kümesini otomatik olarak ölçeklendirme.

Bu makalede şunları öğreneceksiniz:

  • Terraform dağıtımı ayarlama
  • Terraform dağıtımı için değişkenleri ve çıkışları kullanma
  • Ağ altyapısı oluşturma ve dağıtma
  • Sanal makine ölçek kümesi oluşturma, dağıtma ve ağa ekleme
  • VM'lere SSH aracılığıyla bağlanmak için bir sıçrama kutusu oluşturma ve dağıtma

1. ortamınızı yapılandırın

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

2. Terrayform kodunu uygulama

  1. Örnek Terraycode kodunu test etmek ve çalıştırmak ve geçerli dizin yapmak için bir dizin oluşturun.

  2. Adlı bir dosya oluşturun main.tf ve aşağıdaki kodu ekleyin:

    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
    }
    
  3. variables.tfProje değişkenlerini içerecek şekilde adlı bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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"
    }
    
  4. output.tfTerrampaform 'un görüntüleyeceği değerleri belirtmek için adlı bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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
    }
    
  5. Adlı bir dosya oluşturun web.conf ve aşağıdaki kodu ekleyin:

    #cloud-config
    packages:
     - nginx
    

3. Terrayform 'u başlatma

Terraform dağıtımını başlatmak için terraform init'i çalıştırın.

terraform init

Önemli noktalar:

  • Bu komut, bir Azure kaynak grubu oluşturmak için gereken Azure modüllerini indirir.

4. bir Terrayform yürütme planı oluşturma

Terraform planını çalıştırarak bir yürütme planı oluşturun.

terraform plan -out main.tfplan

Anahtar noktaları:

  • terraform planKomut bir yürütme planı oluşturur, ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu model, gerçek kaynaklarda herhangi bir değişiklik yapmadan önce yürütme planının beklentilerinizi eşleşip eşleşmediğini doğrulamanızı sağlar.
  • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. Parametresinin kullanılması, -out gözden geçirdiğiniz planın tam olarak uygulanmış olmasını sağlar.
  • Kalıcı yürütme planları ve güvenlik hakkında daha fazla bilgi edinmek için güvenlik uyarısı bölümünebakın.

5. Teraform yürütme planı uygulama

Yürütme planını bulut altyapınıza uygulamak için terrayform uygulamasını çalıştırın.

terraform apply main.tfplan

Anahtar noktaları:

  • terraform applyYukarıdaki komutu daha önce çalıştırdığınız varsayılır terraform plan -out main.tfplan .
  • Parametresi için farklı bir dosya adı belirttiyseniz -out , çağrısında aynı dosya adını kullanın terraform apply .
  • -outParametresini kullanmıyorsanız, yalnızca terraform apply herhangi bir parametre olmadan çağrı yapmanız yeterlidir.

6. sonuçları doğrulayın

  1. Komutun çıktısından, terraform apply aşağıdakiler için değerler görürsünüz:

    • Sanal makine FQDN 'SI
    • Sıçrama kutusu FQDN 'SI
    • Atlama kutusu IP adresi
  2. Metnin NGINX! ' e hoş geldiniz sayfasına sahip bir varsayılan sayfayı onaylamak için sanal makine URL 'sine gidin.

  3. Değişkenler dosyasında tanımlanan Kullanıcı adını ve çalıştırdığınızda belirttiğiniz parolayı kullanarak sıçrama kutusu sanal makinesine bağlanmak için SSH kullanın terraform apply . Örneğin: ssh azureuser@<ip_address>.

7. Kaynakları Temizleme

Terrayform ile oluşturulan kaynaklara artık ihtiyacınız kalmadığında aşağıdaki adımları uygulayın:

  1. Terrayform planını çalıştırın ve bayrağını belirtin destroy .

    terraform plan -destroy -out main.destroy.tfplan
    

    Anahtar noktaları:

    • terraform planKomut bir yürütme planı oluşturur, ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu model, gerçek kaynaklarda herhangi bir değişiklik yapmadan önce yürütme planının beklentilerinizi eşleşip eşleşmediğini doğrulamanızı sağlar.
    • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. Parametresinin kullanılması, -out gözden geçirdiğiniz planın tam olarak uygulanmış olmasını sağlar.
    • Kalıcı yürütme planları ve güvenlik hakkında daha fazla bilgi edinmek için güvenlik uyarısı bölümünebakın.
  2. Yürütme planını uygulamak için terrayform Uygula ' yı çalıştırın.

    terraform apply main.destroy.tfplan
    

Azure 'da Terrampaform sorunlarını giderme

Azure 'da Terrampaform kullanırken karşılaşılan yaygın sorunları giderme

Sonraki adımlar