Terraform kullanarak Linux sanal makinesi sağlama

Tamamlandı

Terraform, bileşenlerinin istenen durumunu açıklayan yapılandırma dosyalarını kullanarak hedef altyapıyı uygular ve denetler. Hashicorp Yapılandırma Dili'nde (HCL) ifade edilen dosyaların temel biçimi ve genel söz dizimi, bulut seçiminden bağımsız olarak aynıdır. Ancak tek tek bileşen açıklamaları, ilgili Terraform sağlayıcısı tarafından belirlenen buluta bağımlıdır.

Azure altyapı yönetimini destekleyen birkaç Terraform sağlayıcısı olsa da, AzureRM'nin özellikle ilgisi vardır. AzureRM sağlayıcısı sanal makineler, depolama hesapları ve ağ arabirimleri gibi yaygın Azure IaaS kaynaklarının sağlanmasını ve yapılandırılmasını kolaylaştırır. Ayrıca, dağıtımlarınıza dahil etmek isteyebileceğiniz buluta özgü olmayan başka sağlayıcılar da vardır. Bunlar rastgele karakter dizeleri oluşturarak kaynak adlandırma çakışmalarını önlemeye yardımcı olan rastgele sağlayıcıyı içerir; ve Linux kimlik doğrulamasının güvenliğini sağlamak için asimetrik anahtarları yönetmeyi basitleştiren tls sağlayıcısı.

Terraform, Hashicorp web sitesinden indirebileceğiniz tek bir ikili dosya olarak kullanılabilir. Bu ikili, Terraform komut satırı arabirimini (CLI) uygular ve ardından Terraform'ı başlatmak ve yapılandırma dosyalarını işlemek için bir kabuk oturumundan çağırabilirsiniz. Terraform CLI'yi Azure CLI'yi destekleyen herhangi bir kabuktan kullanabilirsiniz.

Dekont

Azure Cloud Shell kullanırken, Bash ile Azure Cloud Shell'de Terraform'u yapılandırma başlığında sağlanan yönergeleri izleyerek geçerli Terraform sürümünü çalıştırdığınızdan emin olun.

Terraform kullanarak Linux VM dağıtma

Terraform, kaynakları tanımlamanıza, önizlemenize ve sağlayıcıya özgü bir bulut altyapısına dağıtmanıza olanak tanır. Sağlama işlemi, Azure gibi hedef bulut ortamını ve bulut altyapınızı oluşturan kaynakları belirlemenizi sağlayan HCL söz dizimini kullanan yapılandırma dosyaları oluşturmakla başlar. Tüm ilgili yapılandırma dosyaları (genellikle aynı dosya sistemi konumunda) oluşturulduktan sonra, gerçek dağıtımdan önce elde edilen altyapı değişikliklerinin önizlemesini görüntülemenizi sağlayan bir yürütme planı oluşturabilirsiniz. Bu, bulut kaynaklarını uygulamak için gerekli sağlayıcı modüllerini indirmek için Terraform'un başlatılmasını gerektirir. Değişiklikleri doğruladıktan sonra, altyapıyı dağıtmak için yürütme planını uygulayabilirsiniz.

Dekont

Yürütme planı oluşturmak isteğe bağlıdır, ancak hedef ortamı etkilemeden planlanan dağıtımdan herhangi bir etkiyi belirlemenize olanak sağladığından bunu yapmanızı öneririz. Azure kaynaklarını etkileşimli olarak dağıttığınızda Terraform, hedef Azure aboneliğine erişmek için kimlik bilgilerinizi yeniden kullanarak Azure CLI kimlik doğrulamasını şeffaf bir şekilde destekler.

Terraform kullanarak Linux çalıştıran bir Azure VM sağlama işlemi genellikle aşağıdaki üst düzey adımları içerir:

  • Uygun VM görüntüsünü tanımlayın.
  • Uygun VM boyutunu belirleyin.
  • Azure VM kaynağını bağımlılıklarıyla tanımlayan yapılandırma dosyaları oluşturun.
  • Terraform'u başlatın.
  • Terraform yürütme planı oluşturma.
  • Terraform dağıtımı başlatın.

Uygun VM görüntüsünü ve boyutunu belirlemek için bu modülün 4. Ünitesinde açıklanan adımları izleyin. Bu ünite Terraform'a özgü görevlere odaklanır.

Yapılandırma dosyaları oluşturma

Dekont

Terraform dosyalarınız için seçtiğiniz dosya adları rastgeledir, ancak dosya içeriğini veya amacını yansıtan bir ad seçmek iyi bir uygulamadır. Dosya uzantısı için ".tf" kullanmalısınız.

Terraform kullanarak bir Linux VM dağıtmak için, yapılandırma dosyalarını barındırmak için bir dizin oluşturarak başlarsınız. Ardından, Terraform sürümünü zorlayan ve dağıtımınıza dahil edilen kaynakları tanımlarken güvendiğiniz sağlayıcıları belirleyen providers.tf adlı bir dosya oluşturun. Bu dosyanın içeriği aşağıdaki kod parçacığında görüntülenmelidir:

terraform {
  required_version = ">=0.12"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>2.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "~>3.0"
    }
    tls = {
      source = "hashicorp/tls"
      version = "~>4.0"
    }
  }
}

provider "azurerm" {
  features {}
}

Aynı dizinde, Azure VM yapılandırmasını ve bağımlılıklarını tanımlayan aşağıdaki kodu kullanarak main.tf adlı bir dosya oluşturun:

resource "random_pet" "rg_name" {
  prefix = var.resource_group_name_prefix
}

resource "azurerm_resource_group" "rg" {
  location = var.resource_group_location
  name     = random_pet.rg_name.id
}

# Create virtual network
resource "azurerm_virtual_network" "terraform_network" {
  name                = "lnx-tf-vnet"
  address_space       = ["10.1.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

# Create subnet
resource "azurerm_subnet" "terraform_subnet" {
  name                 = "subnet0"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.terraform_network.name
  address_prefixes     = ["10.1.0.0/24"]
}

# Create public IPs
resource "azurerm_public_ip" "terraform_public_ip" {
  name                = "lnx-tf-pip"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method   = "Dynamic"
}

# Create Network Security Group and rule
resource "azurerm_network_security_group" "terraform_nsg" {
  name                = "lnx-tf-nsg"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  security_rule {
    name                       = "ssh"
    priority                   = 300
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "22"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }
}

# Create network interface
resource "azurerm_network_interface" "terraform_nic" {
  name                = "lnx-tf-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "nic_configuration"
    subnet_id                     = azurerm_subnet.terraform_subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.terraform_public_ip.id
  }
}

# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "lnx-tf-nic-nsg" {
  network_interface_id      = azurerm_network_interface.terraform_nic.id
  network_security_group_id = azurerm_network_security_group.terraform_nsg.id
}

# Generate random text for a unique storage account name
resource "random_id" "random_id" {
  keepers = {
    # Generate a new ID only when a new resource group is defined
    resource_group = azurerm_resource_group.rg.name
  }

  byte_length = 8
}

# Create storage account for boot diagnostics
resource "azurerm_storage_account" "storage_account" {
  name                     = "diag${random_id.random_id.hex}"
  location                 = azurerm_resource_group.rg.location
  resource_group_name      = azurerm_resource_group.rg.name
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

# Create (and display) an SSH key
resource "tls_private_key" "lnx-tf-ssh" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

# Create virtual machine
resource "azurerm_linux_virtual_machine" "lnx-tf-vm" {
  name                  = "lnx-tf-vm"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  network_interface_ids = [azurerm_network_interface.terraform_nic.id]
  size                  = "Standard_F4s"

  os_disk {
    name                 = "lnx-tf-vm-osdisk"
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-jammy"
    sku       = "22_04-lts-gen2"
    version   = "latest"
  }

  computer_name                   = "lnx-tf-vm"
  admin_username                  = "azureuser"
  disable_password_authentication = true

  admin_ssh_key {
    username   = "azureuser"
    public_key = tls_private_key.lnx-tf-ssh.public_key_openssh
  }

  boot_diagnostics {
    storage_account_uri = azurerm_storage_account.storage_account.primary_blob_endpoint
  }
}

Aynı dizinde, değeri main.tf dosyasında görünen değişkenlere atayan aşağıdaki kodu kullanarak variables.tf adlı başka bir dosya oluşturun:

variable "resource_group_location" {
  default     = "eastus"
  description = "Location of the resource group"
}

variable "resource_group_name_prefix" {
  default     = "rg"
  description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription"
}

Son olarak, başarılı bir dağıtımın ardından görüntülenen çıkışı belirleyen aşağıdaki kodu kullanarak outputs.tf adlı bir dosya oluşturun:

output "resource_group_name" {
  value = azurerm_resource_group.rg.name
}

output "public_ip_address" {
  value = azurerm_linux_virtual_machine.lnx-tf-vm.public_ip_address
}

output "tls_private_key" {
  value     = tls_private_key.lnx-tf-ssh.private_key_pem
  sensitive = true
}

Terraform'u başlatma

Terraform dağıtımını başlatmak için kabuk isteminden aşağıdaki komutu çalıştırın:

terraform init

Bu komut, Azure kaynaklarını sağlamak ve yönetmek için gereken Azure modüllerini indirir.

Yürütme planı oluşturma

Başlatma işleminden sonra terraform planını çalıştırarak bir yürütme planı oluşturun. Komut bir yürütme planı oluşturur, ancak çalıştırmaz. Bunun yerine, yapılandırma dosyalarınızda tanımlanan kaynakları oluşturmak için hangi eylemlerin gerekli olduğunu belirler. İsteğe bağlı -out parametresi, plan için gerçek dağıtım sırasında başvurabileceğiniz bir çıkış dosyası belirtmenize olanak tanır. Bu dosyanın kullanılması, gözden geçirdiğiniz planın tam dağıtım sonucuyla eşleşmesini sağlar. Yürütme planı oluşturmak için aşağıdaki komutu kullanın:

terraform plan -out <terraform_plan>.tfplan

Dağıtım başlatma

Yürütme planını Azure ortamınıza uygulamaya hazır olduğunuzda, önceki adımda oluşturduğunuz dosyanın adıyla birlikte komutunu çalıştırın terraform apply. Beklenen sonucu gözden geçirmek için başka bir şansınız olacak. Terraform devam etmek için sizden onay ister, ancak anahtarı ekleyerek -auto-approve istemi ortadan kaldırabilirsiniz. Dağıtımı başlatmak için aşağıdaki komutu kullanın:

terraform apply <terraform_plan>.tfplan

Azure VM kısa süre içinde, genellikle birkaç dakika içinde çalışmaya başlar. Komut çıktısı terraform apply çıkış listesini içerir, ancak terraform değerini tls_private_key hassas> etiketle <değiştirir:

Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

Çıkış:

public_ip_address = "74.235.10.136"
resource_group_name = "rg-flexible-shark"
tls_private_key = <sensitive>

SSH bağlantınızın kimliğini doğrulamak için otomatik olarak oluşturulan özel anahtarı kullanmak için, bunu bir dosyada depolayın ve ardından dosyanın izinlerini başkaları tarafından erişilmediğinden emin olacak şekilde ayarlayın. Bunu gerçekleştirmek için aşağıdaki komutları çalıştırın:

terraform output -raw tls_private_key > id_rsa
chmod 600 id_rsa

Bu noktada aşağıdaki komutu çalıştırarak Azure VM'sine bağlanabileceksiniz (public_ip_address> yer tutucusunu <terraform apply-generated çıkışında tanımladığınız IP adresiyle değiştirdikten sonra):

ssh -i id_rsa azureuser@<public_ip_address>