【问题标题】:Terraform Azure run bash script on VMTerraform Azure 在 VM 上运行 bash 脚本
【发布时间】:2019-12-07 21:13:50
【问题描述】:

我正在尝试在使用 Terraform 部署 Azure VM 后在其上运行 bash 脚本。我尝试了不同的方法,但都没有奏效。使用“custom_data”,我假设该文件将被上传并执行,但是我什至没有在 VM 中看到该文件。

我也看过“azurerm_virtual_machine_extension”,但这并没有给我上传文件的选项,只能执行命令或从远程位置下载(由于要求不能使用 fileUris):

resource "azurerm_virtual_machine_extension" "test" {
  name                 = "hostname"
  location             = "${azurerm_resource_group.test.location}"
  resource_group_name  = "${azurerm_resource_group.test.name}"
  virtual_machine_name = "${azurerm_virtual_machine.test.name}"
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"

  settings = <<SETTINGS
    {
        "commandToExecute": "sh my_script.sh"
    }
SETTINGS

  tags = {
    environment = "Production"
  }
}
resource "azurerm_virtual_machine" "middleware_vm" {
    name                  = "${var.middleware_vm}"
    location              = "${var.location}"
    resource_group_name   = "${azurerm_resource_group.middleware.name}"
    network_interface_ids = ["${azurerm_network_interface.middleware.id}"]
    vm_size               = "Standard_DS4_v2"        

    storage_os_disk {
        name              = "centos_os_disk"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Premium_LRS"
    }

    storage_data_disk {
        name                 = "managed_backup_disk"
        create_option        = "Empty"
        caching              = "ReadWrite"
        disk_size_gb         = "256"  
        managed_disk_type    = "Premium_LRS"
        lun                  = 0
    }

    storage_image_reference {
        publisher = "OpenLogic"
        offer     = "CentOS"
        sku       = "7.5"
        version   = "latest"
    }

    os_profile {
        computer_name  = "${var.middleware_vm}"
        admin_username = "middlewareadmin"
        custom_data    = "${file("scripts/middleware_disk.sh")}"
  }

【问题讨论】:

    标签: azure terraform azure-virtual-machine


    【解决方案1】:

    在 azurerm_virtual_machine_extension 中,您可以使用:

    protected_settings = <<PROTECTED_SETTINGS
    {
        "script": "${base64encode(file(var.scfile))}"
    }
    PROTECTED_SETTINGS
    

    请参考我的answer

    【讨论】:

      【解决方案2】:

      首先,VM 扩展只会执行脚本,不会将文件复制到 VM。如果要将脚本复制到 VM 中,然后执行它。我会建议你Terraform provisioner file and remote-exec。

      以下是将文件复制到现有 VM 并执行脚本的示例:

      resource "null_resource" "example" {
      
          connection {
              type = "ssh"
              user = "azureuser"
              password = "azureuser@2018"
              host = "13.92.255.50"
              port = 22
          }
          provisioner "file" {
              source = "script.sh"
              destination = "/tmp/script.sh"
          }
      
          provisioner "remote-exec" {
              inline = [
                  "/bin/bash /tmp/script.sh"
              ]
          }
      }
      

      注意:脚本应该在当前目录下创建。

      【讨论】:

      • 谢谢,但这对我们不起作用。虚拟机不能暴露在互联网上,这就是为什么我想使用“custom_data”或“azurerm_virtual_machine_extension”
      • @MarioJacobo 首先,没有任何迹象表明虚拟机不会暴露在互联网上。而且您也没有显示确切的要求以及您遇到的错误。
      • @MarioJacobo 如果您不将虚拟机暴露在互联网上,您将如何使用虚拟机?
      • 没有任何错误,只是没有运行或上传到 VM,使用 custom_data = "${file("scripts/middleware_disk.sh")}"。我希望使用“custom_data”上传文件,然后使用“azurerm_virtual_machine_extension”来执行脚本。由于磁盘上的敏感数据,VM 只是在内部执行一些 cron 任务,根本不需要暴露在互联网上。我可能需要使用 ARM 模板(我将脚本编码为 base64)并将其注入 Terraform。这并不理想,但这是我看到的唯一选择
      • 经过更多测试后,我决定使用带有“azurerm_template_deployment”的 ARM 模板,因为“azurerm_virtual_machine_extension”或“custom_data”不起作用。 ARM 模板可以处理所有 base64 编码的 bash 脚本。
      猜你喜欢
      • 2021-06-14
      • 2018-05-13
      • 2021-09-17
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      相关资源
      最近更新 更多