Terraform kullanarak Azure sanal makine ölçek kümesi oluşturma
Azure sanal makine ölçek kümeleri, aynı VM'leri yapılandırmaya olanak sağlar. VM örneklerinin sayısı isteğe veya zaman çizelgesine göre ayarlanabilir. Daha fazla bilgi için bkz. Sanal makine ölçek kümesinde otomatik olarak ölçeklendirme Azure portal.
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ırma
- Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Terraform'yi yapılandırma: Henüz bunu yapmamışsanız, aşağıdaki seçeneklerden birini kullanarak Terraform'ı yapılandırabilirsiniz:
- SSH anahtar çifti oluşturma:Daha fazla bilgi için bkz. Azure'da Linux VM'ler için SSH ortak ve özel anahtar çifti oluşturma ve kullanma.
2. Terraform kodunu uygulama
Örnek Terraform kodunu test etmek ve bunu geçerli dizin yapmak için bir dizin oluşturun.
adlı bir dosya
main.tfoluşturun ve aşağıdaki kodu girin: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 }Proje değişkenlerini
variables.tfiçeren adlı bir dosya oluşturun ve aşağıdaki kodu girin: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" }output.tfTerraform'daki değerleri belirtmek için adlı bir dosya oluşturun ve aşağıdaki kodu girin: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 }adlı bir dosya
web.confoluşturun ve aşağıdaki kodu girin:#cloud-config packages: - nginx
3. Terraform'ü 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. Terraform yürütme planı oluşturma
Terraform planını çalıştırarak bir yürütme planı oluşturun.
terraform plan -out main.tfplan
Önemli noktalar:
- Komut
terraform planbir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarında belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinize uygun olup olmadığını doğrulamanıza olanak sağlar. - İsteğe
-outbağlı parametresi, plan için bir çıkış dosyası belirtmenize olanak sağlar. parametresini-outkullanmak, gözden geçiren planın tam olarak uygulandığını garantiler. - Yürütme planlarını ve güvenliği kalıcı hale uygulama hakkında daha fazla bilgi için güvenlik uyarısı bölümüne bakın.
5. Terraform yürütme planı uygulama
Yürütme planını bulut altyapınıza uygulamak için terraform apply'i çalıştırın.
terraform apply main.tfplan
Önemli noktalar:
- Yukarıdaki
terraform applykomut daha önce komutunun olduğunu varsayıyor.terraform plan -out main.tfplan - parametresi için farklı bir dosya adı
-outbelirttiyebilirsiniz, çağrısında aynı dosya adınıterraform applykullanın. - parametresini
-outkullanmadıysanız herhangi bir parametreterraform applyolmadan çağrısı yapmanız gerekir.
6. Sonuçları doğrulama
Komutun
terraform applyçıkışında aşağıdaki değerlerin yer alan değerlerini görüyorsunuz:- Sanal makine FQDN'si
- Jumpbox FQDN
- Sıçrama kutusu IP adresi
nginx'ehoş geldiniz! metninin yer alan varsayılan bir sayfa olduğunu onaylamak için sanal makine URL'sini bulun.
Değişkenler dosyasında tanımlanan kullanıcı adını ve dosyasını çalıştırıp belirttiğiniz parolayı kullanarak sıçrama kutusu VM'sinde bağlanmak için SSH
terraform applykullanın. Örneğin:ssh azureuser@<ip_address>.
7. Kaynakları temizleme
Terraform aracılığıyla oluşturulan kaynaklara artık ihtiyacınız kalmadan aşağıdaki adımları uygulayın:
Terraform planını çalıştırın ve bayrağını belirtin.
terraform plan -destroy -out main.destroy.tfplanÖnemli noktalar:
- Komut
terraform planbir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarında belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinize uygun olup olmadığını doğrulamanıza olanak sağlar. - İsteğe
-outbağlı parametresi, plan için bir çıkış dosyası belirtmenize olanak sağlar. parametresini-outkullanmak, gözden geçiren planın tam olarak uygulandığını garantiler. - Yürütme planlarını ve güvenliği kalıcı hale uygulama hakkında daha fazla bilgi için güvenlik uyarısı bölümüne bakın.
- Komut
Yürütme planını uygulamak için terraform apply'i çalıştırın.
terraform apply main.destroy.tfplan
Azure'da Terraform sorunlarını giderme
Azure'da Terraform kullanırken karşılaşılan yaygın sorunları giderme