terraform/scenarios/avs_greenfield_new_vpn_hub/main.tf (158 lines of code) (raw):

# Create local variable derived from an input prefix or modify for customer naming locals { #update naming convention with target naming convention if different private_cloud_rg_name = "${var.prefix}-PrivateCloud-${random_string.namestring.result}" network_rg_name = "${var.prefix}-Network-${random_string.namestring.result}" vnet_name = "${var.prefix}-VirtualNetwork-${random_string.namestring.result}" sddc_name = "${var.prefix}-AVS-SDDC-${random_string.namestring.result}" expressroute_authorization_key_name = "${var.prefix}-AVS-ExpressrouteAuthKey-${random_string.namestring.result}" express_route_connection_name = "${var.prefix}-AVS-ExpressrouteConnection-${random_string.namestring.result}" expressroute_pip_name = "${var.prefix}-AVS-expressroute-gw-pip-${random_string.namestring.result}" expressroute_gateway_name = "${var.prefix}-AVS-expressroute-gw-${random_string.namestring.result}" vpn_pip_name_1 = "${var.prefix}-AVS-vpn-gw-pip-1-${random_string.namestring.result}" vpn_pip_name_2 = "${var.prefix}-AVS-vpn-gw-pip-2-${random_string.namestring.result}" vpn_gateway_name = "${var.prefix}-AVS-vpn-gw-${random_string.namestring.result}" firewall_pip_name = "${var.prefix}-AVS-firewall-pip-${random_string.namestring.result}" firewall_name = "${var.prefix}-AVS-firewall-${random_string.namestring.result}" log_analytics_name = "${var.prefix}-AVS-log-analytics-${random_string.namestring.result}" virtual_hub_name = "${var.prefix}-AVS-virtual-hub-${random_string.namestring.result}" virtual_hub_pip_name = "${var.prefix}-AVS-virtual-hub-pip-${random_string.namestring.result}" route_server_name = "${var.prefix}-AVS-virtual-route-server-${random_string.namestring.result}" service_health_alert_name = "${var.prefix}-AVS-service-health-alert-${random_string.namestring.result}" action_group_name = "${var.prefix}-AVS-action-group-${random_string.namestring.result}" action_group_shortname = "avs-sddc-sh" } #create a random string for uniqueness during redeployments using the same values resource "random_string" "namestring" { length = 4 special = false upper = false lower = true } #Create the private cloud resource group resource "azurerm_resource_group" "greenfield_privatecloud" { name = local.private_cloud_rg_name location = var.region } #Create the Network objects resource group resource "azurerm_resource_group" "greenfield_network" { name = local.network_rg_name location = var.region } #Create a virtual network with subnets for gateway and routeserver and any custom NVA subnets module "avs_virtual_network" { source = "../../modules/avs_vnet_variable_subnets" rg_name = azurerm_resource_group.greenfield_network.name rg_location = azurerm_resource_group.greenfield_network.location vnet_name = local.vnet_name vnet_address_space = var.vnet_address_space subnets = var.subnets tags = var.tags module_telemetry_enabled = false } #deploy the expressroute gateway in the gateway subnet module "avs_expressroute_gateway" { source = "../../modules/avs_expressroute_gateway" expressroute_pip_name = local.expressroute_pip_name expressroute_gateway_name = local.expressroute_gateway_name expressroute_gateway_sku = var.expressroute_gateway_sku rg_name = azurerm_resource_group.greenfield_network.name rg_location = azurerm_resource_group.greenfield_network.location gateway_subnet_id = module.avs_virtual_network.subnet_ids["GatewaySubnet"].id module_telemetry_enabled = false tags = var.tags depends_on = [ module.avs_vpn_gateway ] } #deploy a private cloud with a single management cluster and connect to the expressroute gateway module "avs_private_cloud" { source = "../../modules/avs_private_cloud_single_management_cluster_no_internet_conn" sddc_name = local.sddc_name sddc_sku = var.sddc_sku management_cluster_size = var.management_cluster_size rg_name = azurerm_resource_group.greenfield_privatecloud.name rg_location = azurerm_resource_group.greenfield_privatecloud.location avs_network_cidr = var.avs_network_cidr expressroute_authorization_key_name = local.expressroute_authorization_key_name internet_enabled = false hcx_enabled = var.hcx_enabled hcx_key_names = var.hcx_key_names tags = var.tags module_telemetry_enabled = false } #deploy a VPNGateway module "avs_vpn_gateway" { source = "../../modules/avs_vpn_gateway" vpn_pip_name_1 = local.vpn_pip_name_1 vpn_pip_name_2 = local.vpn_pip_name_2 vpn_gateway_name = local.vpn_gateway_name vpn_gateway_sku = var.vpn_gateway_sku asn = var.asn rg_name = azurerm_resource_group.greenfield_network.name rg_location = azurerm_resource_group.greenfield_network.location gateway_subnet_id = module.avs_virtual_network.subnet_ids["GatewaySubnet"].id module_telemetry_enabled = false } #deploy a routeserver module "avs_routeserver" { source = "../../modules/avs_routeserver" rg_name = azurerm_resource_group.greenfield_network.name rg_location = azurerm_resource_group.greenfield_network.location virtual_hub_name = local.virtual_hub_name virtual_hub_pip_name = local.virtual_hub_pip_name route_server_name = local.route_server_name route_server_subnet_id = module.avs_virtual_network.subnet_ids["RouteServerSubnet"].id module_telemetry_enabled = false tags = var.tags } #deploy the default service health and azure monitor alerts module "avs_service_health" { source = "../../modules/avs_service_health" rg_name = azurerm_resource_group.greenfield_privatecloud.name action_group_name = local.action_group_name action_group_shortname = local.action_group_shortname email_addresses = var.email_addresses service_health_alert_name = local.service_health_alert_name service_health_alert_scope_id = azurerm_resource_group.greenfield_privatecloud.id private_cloud_id = module.avs_private_cloud.sddc_id module_telemetry_enabled = false } #deploy a test VM and bastion spoke for initial configuration and testing module "avs_jumpbox_and_bastion" { source = "../../modules/avs_test_spoke_with_jump_vm" prefix = var.prefix region = var.region jumpbox_sku = var.jumpbox_sku admin_username = var.jumpbox_admin_username tags = var.tags hub_vnet_name = local.vnet_name hub_rg_name = azurerm_resource_group.greenfield_network.name jumpbox_spoke_vnet_address_space = var.jumpbox_spoke_vnet_address_space bastion_subnet_prefix = var.bastion_subnet_prefix jumpbox_subnet_prefix = var.jumpbox_subnet_prefix module_telemetry_enabled = false depends_on = [ module.avs_virtual_network ] } ############################################################################################# # Telemetry Section - Toggled on and off with the telemetry variable # This allows us to get deployment frequency statistics for deployments # Re-using parts of the Core Enterprise Landing Zone methodology ############################################################################################# locals { #create an empty ARM template to use for generating the deployment value telem_arm_subscription_template_content = <<TEMPLATE { "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": {}, "variables": {}, "resources": [], "outputs": { "telemetry": { "type": "String", "value": "For more information, see https://aka.ms/alz/tf/telemetry" } } } TEMPLATE module_identifier = lower("avs_brownfield_existing_vwan_hub") telem_arm_deployment_name = "d2b1d33f-3e1e-4fe9-b9b4-d20b6147535b.${substr(local.module_identifier, 0, 20)}.${random_string.telemetry.result}" } #create a random string for uniqueness resource "random_string" "telemetry" { length = 4 special = false upper = false lower = true } resource "azurerm_subscription_template_deployment" "telemetry_core" { count = var.telemetry_enabled ? 1 : 0 name = local.telem_arm_deployment_name provider = azurerm location = azurerm_resource_group.greenfield_privatecloud.location template_content = local.telem_arm_subscription_template_content }