基于变量控制Terraform Azure托管磁盘创建与VM挂载问题排查
解决方案:Terraform控制Azure VM数据磁盘的条件挂载
直接用dynamic块替代storage_data_disk块内的count配置,就能彻底实现“变量为false时完全忽略磁盘挂载”的需求,具体操作如下:
1. 调整VM的磁盘挂载配置
把原来在storage_data_disk里加count的写法,改成动态生成块的形式:
resource "azurerm_virtual_machine" "oracle19c" { # 保留VM的其他原有配置... # 这里放其他需要固定挂载的磁盘配置 storage_data_disk { managed_disk_id = azurerm_managed_disk.other_disk.id lun = 0 caching = "ReadWrite" disk_size_gb = 100 } # 条件生成orahome磁盘的挂载块 dynamic "storage_data_disk" { for_each = var.azure_db_server_create_orahome_disk ? [1] : [] content { managed_disk_id = azurerm_managed_disk.dbhome[0].id lun = 1 # 注意不要和其他磁盘的LUN号重复,按需调整 caching = "ReadWrite" disk_size_gb = azurerm_managed_disk.dbhome[0].disk_size_gb } } }
当var.azure_db_server_create_orahome_disk为true时,for_each会生成一个包含单个元素的列表,对应的storage_data_disk块就会被创建并挂载磁盘;变量为false时,列表为空,这个挂载块直接不会生成,VM自然不会去查找对应的磁盘ID。
2. 保留磁盘资源的count配置
之前给azurerm_managed_disk.dbhome加的count配置是正确的,继续保留:
resource "azurerm_managed_disk" "dbhome" { count = var.azure_db_server_create_orahome_disk ? 1 : 0 name = "orahome-disk" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name storage_account_type = "Premium_LRS" disk_size_gb = 50 }
3. 注意事项
- 务必保证
dynamic块里的lun号不与其他固定挂载磁盘的LUN重复,避免VM创建时报错; - 如果有多个条件磁盘,可以把
for_each的逻辑扩展为对应磁盘的列表,灵活生成多个挂载块。
内容的提问来源于stack exchange,提问作者user3364798
相关产品推荐
相关产品推荐

