我一直在尝试在Azure中对以下设置进行Terraform操作,但无济于事:
来自Packer创建的自定义VM映像的Linux VM,具有附加到该VM的附加的持久性,受管和加密的数据磁盘,但是位于外部,以防我想使用较新的(更新的,更安全的)版本重新创建该VM自定义映像,而不丢失任何保存到外部磁盘的数据(想象数据库集群中的一个节点)。然后继续执行以下操作:
azurerm_managed_disk
和azurerm_virtual_machine_data_disk_attachment
与VM资源一起使用,但是问题是,如果您只是创建这样的磁盘(使用{{ 1}}设置为create_option
),磁盘将被格式化,未分区和卸载。除非在VM上运行了某些脚本,否则基本上无法使用。Empty
或预配置程序块的东西来对磁盘进行分区/挂载,仅此而已。但是:如果执行此操作,则在旋转VM时,脚本将再次运行并重新格式化/分区磁盘,从而删除我可能保存的所有数据。cloud-init
的{{1}}中使用FromImage
,但事实证明it only works when referencing marketplace images和custom images are not supported 我现在想到的唯一可行的方法是回到方法azurerm_managed_disk
,并制作一个更聪明的脚本,该脚本仅在连接的磁盘未 分区时才运行。
有没有我看不到的替代方法?有人可以帮助我验证这种想法吗?
我还担心上述磁盘中的加密,因为我不知道采用哪种方法都不会成为问题。
答案 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}"
}
...
}