Как эффективно использовать azure_virtual_machine_extension в Azure Terraform

Я хотел бы запустить несколько команд Linux, используя azurerm_virtual_machine_extension. Есть ли сложный способ использовать несколько команд рядом вместо того, чтобы перечислять их в одной строке? Раньше я использовал его, как показано ниже.

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" # VM 개수가 많으면 그만큼 더 오래걸림
  }
  settings = <<SETTINGS
 {
  "commandToExecute": "bash -c 'hostnamectl set-hostname --static ${each.value.hostname}'&& sleep 60 && sh /tmp/for_image.sh > /tmp/installed.log 2>&1"
 }
SETTINGS
}

Можно ли написать код, выровняв его построчно, не выполняя все строки команд, как указано выше? Мне нужна ваша помощь.

Честно говоря, единственный хороший опыт, который у меня был с расширением пользовательского сценария, выполняющим что-то большее, чем одна строка, — это помещение кода в отдельный файл в хранилище BLOB-объектов. Расширение пользовательского сценария также эффективно использует управляемую идентификацию для аутентификации в этом хранилище BLOB-объектов. Я бы действительно рекомендовал идти в этом направлении, а не пытаться заставить его работать напрямую в terraform.

KonTheCat 01.06.2024 16:43
Как установить 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
1
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как эффективно использовать azure_virtual_machine_extension в Azure Terraform

Вот код Terraform для создания нескольких виртуальных машин и нескольких cmd с VM extensions для выполнения Bash code внутри VMs.

переменные.tf

variable "vms" {
  default = [
    {
      name   = "vm1"
      size   = "Standard_DS1_v2"
      admin_username = "Venkat"
      admin_password = "Welcome@123$"
      computer_name   = "Linux_VM1"
      new_computername = "Venkat_LinuxVM1"
    },
    {
      name   = "vm2"
      size   = "Standard_DS1_v2"
      admin_username = "Venkat"
      admin_password = "Welcome@123$"
      computer_name   = "Linux_VM2"
      new_computername = "Venkat_LinuxVM2"
    }
  ]
}

main.tf

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "VM-resources"
  location = "West US"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-network"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "sample"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.2.0/24"]
}

resource "azurerm_public_ip" "example" {
  count               = 2
  name                = "demo-pip-${count.index}"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  allocation_method   = "Static"
}

resource "azurerm_network_interface" "example" {
  count               = 2
  name                = "demo-nic-${count.index}"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = element(azurerm_public_ip.example.*.id, count.index)
  }
}

resource "azurerm_linux_virtual_machine" "example" {
  count              = length(var.vms)
  name               = var.vms[count.index].name
  location           = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  size               = var.vms[count.index].size
  admin_username     = var.vms[count.index].admin_username
  network_interface_ids = [
    azurerm_network_interface.example[count.index].id,
  ]

  computer_name      = var.vms[count.index].computer_name
  admin_password     = var.vms[count.index].admin_password
  disable_password_authentication = false

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

  resource "azurerm_virtual_machine_extension" "hostname" {
  count               = length(var.vms)
  name                = "hostname"
  virtual_machine_id  = azurerm_linux_virtual_machine.example[count.index].id
  publisher           = "Microsoft.Azure.Extensions"
  type                = "CustomScript"
  type_handler_version = "2.0"
  
      settings = <<SETTINGS
        fileUris = [
          "https://samplestoragevm.blob.core.windows.net/vmstorage/script.sh",
        ]
        commandToExecute = "sh script.sh"
}

Терраформ применить

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

Имя хоста ВМ 1:

Обновлять:

Чтобы запустить несколько команд с помощью azurerm_virtual_machine_extension, создайте файл bash и загрузите тот же файл в учетную запись хранения. Затем используйте каплю URL в fileUris в terraform.

   resource "azurerm_virtual_machine_extension" "hostname" {
  count               = length(var.vms)
  name                = "hostname"
  virtual_machine_id  = azurerm_linux_virtual_machine.example[count.index].id
  publisher           = "Microsoft.Azure.Extensions"
  type                = "CustomScript"
  type_handler_version = "2.0"
  
      settings = <<SETTINGS
        fileUris = [
          "https://samplestoragevm.blob.core.windows.net/vmstorage/script.sh",
        ]
        commandToExecute = "sh script.sh"
}

Ссылка: стек link1 от Нэнси и link2, на который я ответил за использование нескольких команд в azurerm_virtual_machine_extension.

Расширение пользовательского сценария

Привет @gotothesky, я обновил ответ для запуска нескольких команд в azurerm_virtual_machine_extension. Пожалуйста, проверьте и подтвердите результат.

Venkat V 06.06.2024 11:10

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