Имя хоста виртуальной машины Azure не меняется в terraform

Мы используем собственные образы для развертывания виртуальных машин в Terraform. Пользовательские изображения имеют наши стандартные настройки. Однако если вы используете этот пользовательский образ для его развертывания в Terraform, ваше имя хоста не изменится и оно безоговорочно будет отображаться как «rockylinuximage01».

Наш код приведен ниже.

  • вар.tf
variable "vm_template" {
  type = map(any)
  default = {
    vm1 = {
      source_image_id = "/subscriptions/00000/resourceGroups/image/providers/Microsoft.Compute/images/new-image-rocky8"
      vm_name         = "test-vm"
      hostname        = "test-vm"
      os_publisher    = "resf"
      os_offer        = "rockylinux-x86_64"
      os_sku          = "8-base"
      os_version      = "8.9.20231119"
      osdisk_type     = "StandardSSD_LRS"
      osdisk_size     = "32"
      vm_type         = "Standard_D2s_v5"
      nic             = "nic01"
      os_disk         = "osdisk01"
    }
  }
}
  • vm.tf
data "azurerm_key_vault" "kv" {
  name                = var.kv_name
  resource_group_name = var.kv_rg
}

data "azurerm_key_vault_secret" "password" {
  name         = var.kv_secret_name
  key_vault_id = data.azurerm_key_vault.kv.id
}

data "azurerm_resource_group" "system_rg_name" {
  name = var.system_rg
}

data "azurerm_subnet" "network_subnet" {
  name                 = var.network_subnet
  virtual_network_name = var.network_vnet
  resource_group_name  = var.network_rg
}

resource "azurerm_network_interface" "nic" {
  for_each                      = var.vm_template
  name                          = "${each.value.vm_name}-${each.value.nic}"
  location                      = var.location
  resource_group_name           = data.azurerm_resource_group.system_rg_name.name
  enable_accelerated_networking = true
  ip_configuration {
    name                          = "internal"
    subnet_id                     = data.azurerm_subnet.network_subnet.id
    private_ip_address_allocation = var.private-ip-type
    private_ip_address            = each.value.private_ip
  }
}

resource "azurerm_linux_virtual_machine" "vm" {
  for_each = var.vm_template
  name                = each.value.vm_name
  location            = var.location
  resource_group_name = data.azurerm_resource_group.system_rg_name.name
  source_image_id     = each.value.source_image_id
  zone                = each.value.zone
  #### VM Instance Type
  size = each.value.vm_type

  network_interface_ids = [
    azurerm_network_interface.nic[each.key].id,
  ]

  identity {
    type = "SystemAssigned"
  }

  os_disk {
    name                 = "${each.value.vm_name}-${each.value.os_disk}"
    caching              = "ReadWrite" # ReadOnly, ReadWrite
    storage_account_type = each.value.osdisk_type
    disk_size_gb         = each.value.osdisk_size
  }

  plan {
    name      = each.value.os_sku
    publisher = each.value.os_publisher
    product   = each.value.os_offer
  }

  computer_name  = each.value.hostname
  admin_username = var.adminid
  admin_password = data.azurerm_key_vault_secret.password.value
 
  disable_password_authentication = false

  lifecycle {
    ignore_changes = [
      admin_password,
    ]
  }
}

Если вы создаете и распространяете код, используя собственный образ, как указано выше, «test-vm», установленный вами в «имя_компьютера», будет изменен на «rockylinuximage01». Я хочу, чтобы заданное мной имя хоста применялось к серверу. Пожалуйста помоги.

Очевидно, что для свойств name и hostname установлены правильные значения для vm1. Это единственная виртуальная машина, которую вы пытаетесь создать? Можете ли вы показать созданный план?

Rui Jarimba 31.05.2024 12:19

Если имя хоста изменится на имя по умолчанию rockylinuximage01, вы можете изменить имя с помощью команды hostnamectl set-hostname test-vm. Запустите этот скрипт на виртуальной машине после его создания с использованием блока null_resource в Terraform.

Venkat V 31.05.2024 13:00

Предположим, вы используете null_resource или azurerm_virtual_machine_extension. Что, если нужно создать несколько виртуальных машин?

gotothesky 31.05.2024 16:49
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
3
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Имя хоста виртуальной машины Azure не меняется в terraform.

Я создал Rocky Linux VM, используя собственное изображение, и оно берет указанный computer_name из кода Terraform.

В вашем случае он принимает еще один computer name, что может указывать на то, что он не использует текущую конфигурацию Terraform. Проверьте план перед его применением, а также удалите все ранее созданные файлы состояния перед повторным запуском кода.

provider "azurerm" {
  features {}
}

data "azurerm_resource_group" "example" {
  name     = "RG-Name"
}

resource "azurerm_virtual_network" "example" {
  name                = "rockyvnet"
  address_space       = ["10.0.0.0/16"]
  location            = data.azurerm_resource_group.example.location
  resource_group_name = data.azurerm_resource_group.example.name
lifecycle  {
    prevent_destroy = true
    }
}

resource "azurerm_subnet" "example" {
  name                 = "rocky-subnet"
  resource_group_name  = data.azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
lifecycle  {
    prevent_destroy = true
    }
}

resource "azurerm_network_interface" "example" {
  name                = "rockyvm-nic"
  location            = data.azurerm_resource_group.example.location
  resource_group_name = data.azurerm_resource_group.example.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
  }
lifecycle  {
    prevent_destroy = true
    }
}

resource "azurerm_linux_virtual_machine" "example" {
  name                = "Linuxvm-Rocky"
  source_image_id     = "/subscriptions/11111b-b5ba-21111111/resourceGroups/RG-name/providers/Microsoft.Compute/galleries/Venkatgallery/images/Venkat-Image"
  resource_group_name = data.azurerm_resource_group.example.name
  location            = data.azurerm_resource_group.example.location
  size                = "Standard_D2s_v5"
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]
  identity {
    type = "SystemAssigned"
  }

  computer_name      = "Rockylinuxvm"
  admin_username      = "adminuser"
  admin_password      = "Welcome@123$"
  disable_password_authentication = false

  os_disk {
    name                 = "rockyosdisk"
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
    disk_size_gb         = "128"
  }



  plan {
    name      = "8-base"
    publisher = "resf"
    product   = "rockylinux-x86_64"
  }
  lifecycle  {
    prevent_destroy = true
    }
}

Терраформирование Применить

Имя хоста виртуальной машины

Если он по-прежнему использует имя по умолчанию, вы можете изменить имя хоста с помощью команды sudo hostnamectl set-hostname Linux-RockyVM с расширением виртуальной машины.

resource "azurerm_virtual_machine_extension" "example" {
  name                 = "hostname"
  virtual_machine_id   = azurerm_linux_virtual_machine.example.id
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"

  settings = <<SETTINGS
 {
  "commandToExecute": "sudo hostnamectl set-hostname Linux-RockyVM && sudo systemctl restart"
 }
SETTINGS
}

После выполнения VM Extension имя хоста было успешно изменено.

Ссылка: azurerm_virtual_machine_extension

Предположим, вы используете null_resource или azurerm_virtual_machine_extension. Что, если нужно создать несколько виртуальных машин?

gotothesky 31.05.2024 16:49

Чтобы применить azurerm_virtual_machine_extension к нескольким виртуальным машинам в Terraform, вы можете использовать цикл for-each в блоке расширения.

Venkat V 31.05.2024 18:12
sudo hostnamectl set-hostname Linux-RockyVM && sudo systemctl restart Извините, но я не знаю, как реализовать эту часть в for_ech. Разве это не сценарий оболочки? Как я могу изменить имена хостов нескольких виртуальных машин в этой части? Я не уверен.
gotothesky 31.05.2024 19:24

Спасибо всем, кто помог. Я хотел бы объединить свои мнения и использовать код, измененный следующим образом. Я не знаю, лучший это способ или нет, но я уверен, что он в любом случае соответствует требованиям. Ниже приведен модифицированный код. Если у вас есть лучшее мнение, я был бы очень признателен, если бы вы сообщили мне об этом.

resource "azurerm_virtual_machine_extension" "run_command" {
  for_each             = var.vm_template
  name                 = "${each.value.vm_name}-run_command"
  virtual_machine_id   = azurerm_linux_virtual_machine.vm[each.key].id
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"
  timeouts {
    create = "1h"
  }
  settings = <<SETTINGS
 {
  "commandToExecute": "bash -c 'hostnamectl set-hostname --static ${each.value.hostname}'"
 }
SETTINGS
}

Другие вопросы по теме