Terraform Azure:从打包程序映像和外部数据磁盘创建Linux VM

时间:2019-03-06 22:13:32

标签: azure terraform packer terraform-provider-azure infrastructure-as-a-code

我一直在尝试在Azure中对以下设置进行Terraform操作,但无济于事:

来自Packer创建的自定义VM映像的Linux VM,具有附加到该VM的附加的持久性,受管和加密的数据磁盘,但是位于外部,以防我想使用较新的(更新的,更安全的)版本重新创建该VM自定义映像,而不丢失任何保存到外部磁盘的数据(想象数据库集群中的一个节点)。然后继续执行以下操作:

  1. 最初,我尝试将azurerm_managed_diskazurerm_virtual_machine_data_disk_attachment与VM资源一起使用,但是问题是,如果您只是创建这样的磁盘(使用{{ 1}}设置为create_option),磁盘将被格式化,未分区和卸载。除非在VM上运行了某些脚本,否则基本上无法使用。
  2. 我的想法去了:好的,我将运行Empty或预配置程序块的东西来对磁盘进行分区/挂载,仅此而已。但是:如果执行此操作,则在旋转VM时,脚本将再次运行并重新格式化/分区磁盘,从而删除我可能保存的所有数据。
  3. 我还尝试了使用Packer使用附加数据磁盘创建自定义映像,并在cloud-init的{​​{1}}中使用FromImage,但事实证明it only works when referencing marketplace imagescustom images are not supported

我现在想到的唯一可行的方法是回到方法azurerm_managed_disk,并制作一个更聪明的脚本,该脚本仅在连接的磁盘未 分区时才运行。

有没有我看不到的替代方法?有人可以帮助我验证这种想法吗?

我还担心上述磁盘中的加密,因为我不知道采用哪种方法都不会成为问题。

1 个答案:

答案 0 :(得分:1)

首先,无论您如何使用打包程序或其他方式创建映像,都可以通过Terraform通过自定义映像创建Azure VM,更多详细信息请参见To provision a Custom Image in Terraform

但是当您使用自定义映像并希望对数据磁盘进行加密时,问题就来了。

  

使用定制Linux当前不支持磁盘加密   图片。

更多详细信息,请参见Requirements and limitations of Encryption

此外,要将数据磁盘安装到VM,我认为您可以使用VM扩展来实现。并将托管数据磁盘连接到VM,您可以像这样在Terraform代码的VM配置中添加storage_data_disk块:

resource "azurerm_virtual_machine" "main" {
  name                  = "${var.prefix}-vm"
  location              = "${azurerm_resource_group.main.location}"
  resource_group_name   = "${azurerm_resource_group.main.name}"
  network_interface_ids = ["${azurerm_network_interface.main.id}"]
  vm_size               = "Standard_DS1_v2"

  # Uncomment this line to delete the OS disk automatically when deleting the VM
  # delete_os_disk_on_termination = true


  # Uncomment this line to delete the data disks automatically when deleting the VM
  # delete_data_disks_on_termination = true

  ...

  storage_data_disk {
    name          = "datadisk0"
    vhd_uri       = "${azurestack_storage_account.test.primary_blob_endpoint}${azurestack_storage_container.test.name}/datadisk0.vhd"
    disk_size_gb  = "1023"
    create_option = "Empty"
    lun           = 0
  }

  ...

  tags {
    environment = "staging"
  }
}

编辑

恐怕您需要在vm storage_image_reference中使用自定义映像ID。您可以使用数据azurerm_image引用组中的自定义图像。像这样的代码:

data "azurerm_image" "custom" {
    name = "your_custom_image_name"
    resource_group_name = "your_group"
}

resource "azurerm_virtual_machine" "main" {
    ...

    storage_image_reference {
        id = "${data.azurerm_image.custom.id}"
    }

    ...
}