Мы используем собственные образы для развертывания виртуальных машин в Terraform. Пользовательские изображения имеют наши стандартные настройки. Однако если вы используете этот пользовательский образ для его развертывания в Terraform, ваше имя хоста не изменится и оно безоговорочно будет отображаться как «rockylinuximage01».
Наш код приведен ниже.
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"
}
}
}
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». Я хочу, чтобы заданное мной имя хоста применялось к серверу. Пожалуйста помоги.
Если имя хоста изменится на имя по умолчанию rockylinuximage01, вы можете изменить имя с помощью команды hostnamectl set-hostname test-vm. Запустите этот скрипт на виртуальной машине после его создания с использованием блока null_resource в Terraform.
Предположим, вы используете null_resource или azurerm_virtual_machine_extension. Что, если нужно создать несколько виртуальных машин?


Имя хоста виртуальной машины 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. Что, если нужно создать несколько виртуальных машин?
Чтобы применить azurerm_virtual_machine_extension к нескольким виртуальным машинам в Terraform, вы можете использовать цикл for-each в блоке расширения.
sudo hostnamectl set-hostname Linux-RockyVM && sudo systemctl restart Извините, но я не знаю, как реализовать эту часть в for_ech. Разве это не сценарий оболочки? Как я могу изменить имена хостов нескольких виртуальных машин в этой части? Я не уверен.
Спасибо всем, кто помог. Я хотел бы объединить свои мнения и использовать код, измененный следующим образом. Я не знаю, лучший это способ или нет, но я уверен, что он в любом случае соответствует требованиям. Ниже приведен модифицированный код. Если у вас есть лучшее мнение, я был бы очень признателен, если бы вы сообщили мне об этом.
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
}
Очевидно, что для свойств
nameиhostnameустановлены правильные значения дляvm1. Это единственная виртуальная машина, которую вы пытаетесь создать? Можете ли вы показать созданный план?