From 6dbd543284c41ddf6022a7e4d66afbf8ecc9cd18 Mon Sep 17 00:00:00 2001 From: Shawn Anderson Date: Sat, 19 Nov 2022 17:31:39 -0500 Subject: [PATCH] Added suport for file shares and installing vm extensions to support backup --- main.tf | 141 ++++++++++++++++++++++++++++++++++++++++++++- repo-settings.json | 4 +- variables.tf | 40 ++++++++++++- 3 files changed, 179 insertions(+), 6 deletions(-) diff --git a/main.tf b/main.tf index ab8e5ba..a99a709 100644 --- a/main.tf +++ b/main.tf @@ -14,6 +14,12 @@ locals { } } + file_shares = { + for idx, fs in var.backup_file_shares : fs.name => { + idx : idx + file_share : fs + } + } timeout_create = "180m" timeout_update = "60m" @@ -33,7 +39,15 @@ resource "azurerm_resource_group" "rg" { count = var.create_resource_group ? 1 : 0 name = var.resource_group_name location = var.location + tags = merge({ "ResourceName" = "${var.resource_group_name}" }, var.tags, ) + + timeouts { + create = local.timeout_create + delete = local.timeout_delete + read = local.timeout_read + update = local.timeout_update + } } #------------------------------------- @@ -41,13 +55,22 @@ resource "azurerm_resource_group" "rg" { #------------------------------------- resource "azurerm_recovery_services_vault" "vault" { - name = var.recovery_services_vault_name != null ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault" + name = var.recovery_services_vault_name != "" ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault" location = var.location resource_group_name = local.resource_group_name sku = var.recovery_services_vault_sku != null ? var.recovery_services_vault_sku : "Standard" storage_mode_type = var.recovery_services_vault_storage_mode != null ? var.recovery_services_vault_storage_mode : "LocallyRedundant" #cross_region_restore_enabled = var.recovery_servuces_vault_cross_region_restore_enabled + + tags = merge({ "ResourceName" = var.recovery_services_vault_name != "" ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault" }, var.tags, ) + + timeouts { + create = local.timeout_create + delete = local.timeout_delete + read = local.timeout_read + update = local.timeout_update + } } #------------------------------------- @@ -55,7 +78,7 @@ resource "azurerm_recovery_services_vault" "vault" { #------------------------------------- resource "azurerm_backup_policy_vm" "policy" { - name = "${local.resource_prefix}-bkpol" + name = "${local.resource_prefix}-bkpol-vms" resource_group_name = local.resource_group_name recovery_vault_name = azurerm_recovery_services_vault.vault.name policy_type = var.backup_policy_type != null ? var.backup_policy_type : "V2" @@ -102,6 +125,53 @@ resource "azurerm_backup_policy_vm" "policy" { } } +resource "azurerm_backup_policy_file_share" "policy" { + name = "${local.resource_prefix}-bkpol-fileshares" + resource_group_name = local.resource_group_name + recovery_vault_name = azurerm_recovery_services_vault.vault.name + + timezone = var.backup_policy_time_zone != null ? var.backup_policy_time_zone : "UTC" + + backup { + frequency = var.backup_policy_frequency != null ? var.backup_policy_frequency : "Daily" + time = var.backup_policy_time != null ? var.backup_policy_time : "23:00" + } + + dynamic "retention_daily" { + for_each = var.backup_policy_retention_daily_count != "" ? [1] : [] + + content { + count = var.backup_policy_retention_daily_count + } + } + + dynamic "retention_weekly" { + for_each = var.backup_polcy_retention_weekly_count != "" ? [1] : [] + + content { + count = var.backup_polcy_retention_weekly_count + weekdays = var.backup_policy_retention_weekly_weekdays != null ? var.backup_policy_retention_weekly_weekdays : [ "Saturday" ] + } + } + + dynamic "retention_monthly" { + for_each = var.backup_polcy_retention_monthly_count != "" ? [1] : [] + + content { + count = var.backup_polcy_retention_monthly_count + weekdays = var.backup_policy_retention_monthly_weekdays != null ? var.backup_policy_retention_monthly_weekdays : [ "Saturday" ] + weeks = [ "Last" ] + } + } + + timeouts { + create = local.timeout_create + delete = local.timeout_delete + read = local.timeout_read + update = local.timeout_update + } +} + #------------------------------------- ## Enable Backups for VMs #------------------------------------- @@ -113,6 +183,16 @@ data "azurerm_virtual_machine" "vm" { resource_group_name = each.value.vm.resource_group_name != "" ? each.value.vm.resource_group_name : local.resource_group_name } +# resource "azurerm_virtual_machine_extension" "vm_extensions" { +# for_each = local.virtual_machines + +# name = each.value.vm.name +# virtual_machine_id = data.azurerm_virtual_machine.vm[each.value.vm.name].id +# publisher = "Microsoft.Azure.RecoveryServices" +# type = each.value.vm.os_type == "linux" ? "VMSnapshotLinux" : "VMSnapshot" +# type_handler_version = "1.0" +# } + resource "azurerm_backup_protected_vm" "vm" { for_each = local.virtual_machines @@ -122,6 +202,10 @@ resource "azurerm_backup_protected_vm" "vm" { source_vm_id = data.azurerm_virtual_machine.vm[each.value.vm.name].id + # depends_on = [ + # azurerm_virtual_machine_extension.vm_extensions + # ] + timeouts { create = local.timeout_create delete = local.timeout_delete @@ -129,3 +213,56 @@ resource "azurerm_backup_protected_vm" "vm" { update = local.timeout_update } } + +#------------------------------------- +## Enable Backups for File Shares +#------------------------------------- + +data "azurerm_storage_account" "storage_backup" { + for_each = local.file_shares + + name = each.value.file_share.storage_account_name + resource_group_name = each.value.file_share.resource_group_name +} + +resource "azurerm_backup_container_storage_account" "container" { + for_each = local.file_shares + + recovery_vault_name = azurerm_recovery_services_vault.vault.name + resource_group_name = local.resource_group_name + + storage_account_id = data.azurerm_storage_account.storage_backup[each.value.file_share.name].id + + depends_on = [ + data.azurerm_storage_account.storage_backup + ] + + timeouts { + create = local.timeout_create + delete = local.timeout_delete + read = local.timeout_read + update = local.timeout_update + } +} + +resource "azurerm_backup_protected_file_share" "share" { + for_each = local.file_shares + + resource_group_name = local.resource_group_name + recovery_vault_name = azurerm_recovery_services_vault.vault.name + backup_policy_id = azurerm_backup_policy_file_share.policy.id + + source_storage_account_id = data.azurerm_storage_account.storage_backup[each.value.file_share.name].id + source_file_share_name = each.value.file_share.name + + depends_on = [ + azurerm_backup_container_storage_account.container + ] + + timeouts { + create = local.timeout_create + delete = local.timeout_delete + read = local.timeout_read + update = local.timeout_update + } +} \ No newline at end of file diff --git a/repo-settings.json b/repo-settings.json index 63b62bf..51eca2e 100644 --- a/repo-settings.json +++ b/repo-settings.json @@ -1,6 +1,6 @@ { "name": "terraform-azurerm-azure-backup", "description": "Terraform module for setting up Azure Backup", - "version": "v1.0.1", - "message": "Changed vm backup details to a list of objects" + "version": "v1.0.2", + "message": "Added suport for file shares and installing vm extensions to support backup" } \ No newline at end of file diff --git a/variables.tf b/variables.tf index a8a271c..b05f59e 100644 --- a/variables.tf +++ b/variables.tf @@ -4,13 +4,13 @@ variable "name" { } variable "create_resource_group" { - description = "Whether to create resource group and use it for all networking resources" + description = "Whether to create resource group and use it for all resources" default = true } variable "resource_group_name" { description = "A container that holds related resources for an Azure solution" - default = "rg-filestorage" + default = "" } variable "location" { @@ -23,6 +23,31 @@ variable "resource_prefix" { default = "" } +variable "create_storage_account" { + description = "Whether to create storage account and use it for all backups" + default = true +} + +variable "storage_account_resource_group_name" { + description = "A container that holds related resources for an Azure solution" + default = "" +} + +variable "storage_account_name" { + description = "(Optional) Indicates the name of the storage account to either use or create" + default = "" +} + +variable "storage_account_tier" { + description = "(Optional) Indicates the storage acccount tier" + default = "" +} + +variable "storage_account_replication_type" { + description = "(Optional) Indicates the storage account replication type" + default = "LZR" +} + variable "recovery_services_vault_name" { description = "(Optional) Indicates the name of recovery services vault to be created" default = "" @@ -118,6 +143,17 @@ variable "backup_virtual_machines" { type = list(object({ name = string resource_group_name = string + os_type = string + })) + default = [] +} + +variable "backup_file_shares" { + description = "Contains the list file shares that will be backed up" + type = list(object({ + name = string + storage_account_name = string + resource_group_name = string })) default = [] }