deploy/terraform/run/sap_system/module.tf (384 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
#########################################################################################
# #
# Name generator #
# #
#########################################################################################
module "sap_namegenerator" {
source = "../../terraform-units/modules/sap_namegenerator"
environment = local.infrastructure.environment
location = local.infrastructure.region
codename = lower(try(local.infrastructure.codename, ""))
random_id = coalesce(var.custom_random_id, module.common_infrastructure.random_id)
sap_vnet_name = local.vnet_logical_name
sap_sid = local.sap_sid
db_sid = local.db_sid
web_sid = local.web_sid
app_ostype = upper(try(local.application_tier.app_os.os_type, "LINUX"))
anchor_ostype = upper(try(local.anchor_vms.os.os_type, "LINUX"))
db_ostype = upper(try(local.database.os.os_type, "LINUX"))
db_server_count = var.database_server_count + var.stand_by_node_count
app_server_count = local.enable_app_tier_deployment ? try(local.application_tier.application_server_count, 0) : 0
web_server_count = local.enable_app_tier_deployment ? try(local.application_tier.webdispatcher_count, 0) : 0
scs_server_count = local.enable_app_tier_deployment ? local.application_tier.scs_high_availability ? (
2 * local.application_tier.scs_server_count) : (
local.application_tier.scs_server_count
) : 0
app_zones = local.enable_app_tier_deployment && var.application_server_count > 0 ? try(local.application_tier.app_zones, []) : []
scs_zones = local.enable_app_tier_deployment && var.scs_server_count > 0 ? try(local.application_tier.scs_zones, []) : []
web_zones = local.enable_app_tier_deployment && var.webdispatcher_server_count > 0 ? try(local.application_tier.web_zones, []) : []
db_zones = try(local.database.zones, [])
resource_offset = try(var.resource_offset, 0)
custom_prefix = var.custom_prefix
database_high_availability = local.database.high_availability
database_cluster_type = local.database.database_cluster_type
scs_high_availability = local.application_tier.scs_high_availability
scs_cluster_type = local.application_tier.scs_cluster_type
use_zonal_markers = var.use_zonal_markers
scale_out = var.database_HANA_use_scaleout_scenario
}
#########################################################################################
# #
# Common Infrastructure #
# #
#########################################################################################
module "common_infrastructure" {
source = "../../terraform-units/modules/sap_system/common_infrastructure"
providers = {
azurerm.main = azurerm.system
azurerm.dnsmanagement = azurerm.dnsmanagement
azurerm.privatelinkdnsmanagement = azurerm.privatelinkdnsmanagement
}
Agent_IP = var.add_Agent_IP ? var.Agent_IP : ""
application_tier = local.application_tier
application_tier_ppg_names = module.sap_namegenerator.naming_new.app_ppg_names
authentication = local.authentication
azure_files_sapmnt_id = var.azure_files_sapmnt_id
custom_disk_sizes_filename = try(coalesce(var.custom_disk_sizes_filename, var.db_disk_sizes_filename), "")
custom_prefix = var.use_prefix ? var.custom_prefix : " "
database = local.database
database_dual_nics = var.database_dual_nics
deploy_application_security_groups = var.deploy_application_security_groups
deployer_tfstate = length(var.deployer_tfstate_key) > 0 ? data.terraform_remote_state.deployer[0].outputs : null
deployment = var.deployment
enable_purge_control_for_keyvaults = var.enable_purge_control_for_keyvaults
ha_validator = format("%d%d-%s",
local.application_tier.scs_high_availability ? 1 : 0,
local.database.high_availability ? 1 : 0,
upper(try(local.application_tier.app_os.os_type, "LINUX")) == "LINUX" ? var.NFS_provider : "WINDOWS"
)
hana_ANF_volumes = local.hana_ANF_volumes
infrastructure = local.infrastructure
is_single_node_hana = "true"
key_vault = local.key_vault
landscape_tfstate = data.terraform_remote_state.landscape.outputs
license_type = var.license_type
naming = length(var.name_override_file) > 0 ? local.custom_names : module.sap_namegenerator.naming
NFS_provider = var.NFS_provider
options = local.options
sapmnt_private_endpoint_id = var.sapmnt_private_endpoint_id
sapmnt_volume_size = var.sapmnt_volume_size
scaleset_id = var.scaleset_id
service_principal = var.use_spn ? local.service_principal : local.account
tags = var.tags
terraform_template_version = var.terraform_template_version
use_private_endpoint = var.use_private_endpoint
use_random_id_for_storageaccounts = var.use_random_id_for_storageaccounts
use_scalesets_for_deployment = var.use_scalesets_for_deployment
dns_settings = local.dns_settings
enable_firewall_for_keyvaults_and_storage = var.enable_firewall_for_keyvaults_and_storage
}
#-------------------------------------------------------------------------------
# #
# HANA Infrastructure #
# #
#--------------------------------------+---------------------------------------8
module "hdb_node" {
source = "../../terraform-units/modules/sap_system/hdb_node"
depends_on = [module.common_infrastructure]
providers = {
azurerm.deployer = azurerm
azurerm.main = azurerm.system
azurerm.dnsmanagement = azurerm.dnsmanagement
azurerm.privatelinkdnsmanagement = azurerm.privatelinkdnsmanagement
# azapi.api = azapi.api
}
admin_subnet = module.common_infrastructure.admin_subnet
Agent_IP = var.add_Agent_IP ? var.Agent_IP : ""
anchor_vm = module.common_infrastructure.anchor_vm // Workaround to create dependency from anchor to db to app
cloudinit_growpart_config = null # This needs more consideration module.common_infrastructure.cloudinit_growpart_config
custom_disk_sizes_filename = try(coalesce(var.custom_disk_sizes_filename, var.db_disk_sizes_filename), "")
database = local.database
database_active_active = var.database_active_active
database_dual_nics = try(module.common_infrastructure.admin_subnet, null) == null ? false : var.database_dual_nics
database_server_count = upper(try(local.database.platform, "HANA")) == "HANA" ? (
local.database.high_availability ? (
2 * (var.database_server_count + var.stand_by_node_count)) : (
var.database_server_count + var.stand_by_node_count
)) : (
0
)
database_use_premium_v2_storage = var.database_use_premium_v2_storage
database_vm_admin_nic_ips = var.database_vm_admin_nic_ips
database_vm_db_nic_ips = var.database_vm_db_nic_ips
database_vm_db_nic_secondary_ips = var.database_vm_db_nic_secondary_ips
database_vm_storage_nic_ips = var.database_vm_storage_nic_ips
db_asg_id = module.common_infrastructure.db_asg_id
db_subnet = module.common_infrastructure.db_subnet
deploy_application_security_groups = var.deploy_application_security_groups
deployment = var.deployment
dns_settings = local.dns_settings
enable_firewall_for_keyvaults_and_storage = var.enable_firewall_for_keyvaults_and_storage
fencing_role_name = var.fencing_role_name
hana_ANF_volumes = local.hana_ANF_volumes
hanashared_id = length(var.hanashared_id) > 0 ? (length(var.hanashared_id[0]) > 0 ? var.hanashared_id : []) : []
hanashared_private_endpoint_id = length(var.hanashared_private_endpoint_id) > 0 ? (length(var.hanashared_private_endpoint_id[0]) > 0 ? var.hanashared_private_endpoint_id : []) : []
infrastructure = local.infrastructure
landscape_tfstate = data.terraform_remote_state.landscape.outputs
license_type = var.license_type
naming = length(var.name_override_file) > 0 ? local.custom_names : module.sap_namegenerator.naming
NFS_provider = var.NFS_provider
options = local.options
ppg = module.common_infrastructure.ppg
random_id = coalesce(var.custom_random_id, module.common_infrastructure.random_id)
resource_group = module.common_infrastructure.resource_group
sap_sid = local.sap_sid
scale_set_id = length(var.scaleset_id) > 0 ? var.scaleset_id : module.common_infrastructure.scale_set_id
sdu_public_key = module.common_infrastructure.sdu_public_key
sid_keyvault_user_id = module.common_infrastructure.sid_keyvault_user_id
sid_password = module.common_infrastructure.sid_password
sid_username = module.common_infrastructure.sid_username
storage_bootdiag_endpoint = module.common_infrastructure.storage_bootdiag_endpoint
storage_subnet = module.common_infrastructure.storage_subnet
tags = var.tags
terraform_template_version = var.terraform_template_version
use_loadbalancers_for_standalone_deployments = var.use_loadbalancers_for_standalone_deployments
use_msi_for_clusters = var.use_msi_for_clusters
use_observer = var.database_HANA_use_scaleout_scenario && local.database.high_availability
use_private_endpoint = var.use_private_endpoint
use_scalesets_for_deployment = var.use_scalesets_for_deployment
use_secondary_ips = var.use_secondary_ips
}
#########################################################################################
# #
# App Tier Infrastructure #
# #
#########################################################################################
module "app_tier" {
source = "../../terraform-units/modules/sap_system/app_tier"
providers = {
azurerm.deployer = azurerm
azurerm.main = azurerm.system
azurerm.dnsmanagement = azurerm.dnsmanagement
azurerm.privatelinkdnsmanagement = azurerm.privatelinkdnsmanagement
# azapi.api = azapi.api
}
depends_on = [module.common_infrastructure]
admin_subnet = module.common_infrastructure.admin_subnet
application_tier = local.application_tier
cloudinit_growpart_config = null # This needs more consideration module.common_infrastructure.cloudinit_growpart_config
custom_disk_sizes_filename = try(coalesce(var.custom_disk_sizes_filename, var.app_disk_sizes_filename), "")
deploy_application_security_groups = var.deploy_application_security_groups
deployment = var.deployment
fencing_role_name = var.fencing_role_name
firewall_id = module.common_infrastructure.firewall_id
idle_timeout_scs_ers = var.idle_timeout_scs_ers
infrastructure = local.infrastructure
landscape_tfstate = data.terraform_remote_state.landscape.outputs
license_type = var.license_type
naming = length(var.name_override_file) > 0 ? local.custom_names : module.sap_namegenerator.naming
network_location = module.common_infrastructure.network_location
network_resource_group = module.common_infrastructure.network_resource_group
options = local.options
order_deployment = null
ppg = var.use_app_proximityplacementgroups ? module.common_infrastructure.app_ppg : module.common_infrastructure.ppg
resource_group = module.common_infrastructure.resource_group
route_table_id = module.common_infrastructure.route_table_id
sap_sid = local.sap_sid
scale_set_id = try(module.common_infrastructure.scale_set_id, null)
sdu_public_key = module.common_infrastructure.sdu_public_key
sid_keyvault_user_id = module.common_infrastructure.sid_keyvault_user_id
sid_password = module.common_infrastructure.sid_password
sid_username = module.common_infrastructure.sid_username
storage_bootdiag_endpoint = module.common_infrastructure.storage_bootdiag_endpoint
tags = var.tags
terraform_template_version = var.terraform_template_version
use_loadbalancers_for_standalone_deployments = var.use_loadbalancers_for_standalone_deployments
use_msi_for_clusters = var.use_msi_for_clusters
use_scalesets_for_deployment = var.use_scalesets_for_deployment
use_secondary_ips = var.use_secondary_ips
dns_settings = local.dns_settings
}
#########################################################################################
# #
# AnyDB Infrastructure #
# #
#########################################################################################
module "anydb_node" {
source = "../../terraform-units/modules/sap_system/anydb_node"
providers = {
azurerm.deployer = azurerm
azurerm.main = azurerm.system
azurerm.dnsmanagement = azurerm.dnsmanagement
azurerm.privatelinkdnsmanagement = azurerm.privatelinkdnsmanagement
# azapi.api = azapi.api
}
depends_on = [module.common_infrastructure]
admin_subnet = try(module.common_infrastructure.admin_subnet, null)
anchor_vm = module.common_infrastructure.anchor_vm // Workaround to create dependency from anchor to db to app
cloudinit_growpart_config = null # This needs more consideration module.common_infrastructure.cloudinit_growpart_config
custom_disk_sizes_filename = try(coalesce(var.custom_disk_sizes_filename, var.db_disk_sizes_filename), "")
database = local.database
database_vm_db_nic_ips = var.database_vm_db_nic_ips
database_vm_db_nic_secondary_ips = var.database_vm_db_nic_secondary_ips
database_vm_admin_nic_ips = var.database_vm_admin_nic_ips
database_server_count = upper(try(local.database.platform, "HANA")) == "HANA" ? (
0) : (
local.database.high_availability ? 2 * var.database_server_count : var.database_server_count
)
db_asg_id = module.common_infrastructure.db_asg_id
db_subnet = module.common_infrastructure.db_subnet
deploy_application_security_groups = var.deploy_application_security_groups
deployment = var.deployment
fencing_role_name = var.fencing_role_name
infrastructure = local.infrastructure
landscape_tfstate = data.terraform_remote_state.landscape.outputs
license_type = var.license_type
naming = length(var.name_override_file) > 0 ? local.custom_names : module.sap_namegenerator.naming
options = local.options
order_deployment = local.enable_db_deployment ? (
local.db_zonal_deployment && local.application_tier.enable_deployment ? (
try(module.app_tier.scs_vm_ids[0], null)
) : (null)
) : (null)
ppg = module.common_infrastructure.ppg
resource_group = module.common_infrastructure.resource_group
sap_sid = local.sap_sid
scale_set_id = try(module.common_infrastructure.scale_set_id, null)
sdu_public_key = module.common_infrastructure.sdu_public_key
sid_keyvault_user_id = module.common_infrastructure.sid_keyvault_user_id
sid_password = module.common_infrastructure.sid_password
sid_username = module.common_infrastructure.sid_username
storage_bootdiag_endpoint = module.common_infrastructure.storage_bootdiag_endpoint
tags = var.tags
terraform_template_version = var.terraform_template_version
use_loadbalancers_for_standalone_deployments = var.use_loadbalancers_for_standalone_deployments
use_msi_for_clusters = var.use_msi_for_clusters
use_observer = var.use_observer
use_scalesets_for_deployment = var.use_scalesets_for_deployment
use_secondary_ips = var.use_secondary_ips
dns_settings = local.dns_settings
}
#########################################################################################
# #
# Output files #
# #
#########################################################################################
module "output_files" {
source = "../../terraform-units/modules/sap_system/output_files"
depends_on = [module.anydb_node, module.common_infrastructure, module.app_tier, module.hdb_node]
providers = {
azurerm.main = azurerm.system
azurerm.dnsmanagement = azurerm.dnsmanagement
# azapi.api = azapi.api
}
authentication = local.authentication
authentication_type = try(local.application_tier.authentication.type, "key")
configuration_settings = var.configuration_settings
database = local.database
database_shared_disks = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.database_shared_disks) : (
module.anydb_node.database_shared_disks
)
is_use_fence_kdump = var.use_fence_kdump
infrastructure = local.infrastructure
landscape_tfstate = data.terraform_remote_state.landscape.outputs
naming = length(var.name_override_file) > 0 ? (
local.custom_names) : (
module.sap_namegenerator.naming
)
random_id = module.common_infrastructure.random_id
save_naming_information = var.save_naming_information
tfstate_resource_id = var.tfstate_resource_id
created_resource_group_name = module.common_infrastructure.created_resource_group_name
created_resource_group_subscription_id = module.common_infrastructure.created_resource_group_subscription_id
#########################################################################################
# Database tier #
#########################################################################################
database_admin_ips = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.db_admin_ip) : (
module.anydb_node.database_server_admin_ips
) #TODO Change to use Admin IP
database_authentication_type = try(local.database.authentication.type, "key")
database_cluster_type = var.database_cluster_type
database_cluster_ip = module.anydb_node.database_cluster_ip
database_high_availability = local.database.high_availability
database_active_active = var.database_active_active
database_active_active_loadbalancer_ip = try(module.hdb_node.database_loadbalancer_ip[1], "")
database_loadbalancer_ip = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.database_loadbalancer_ip[0]) : (
module.anydb_node.database_loadbalancer_ip[0]
)
database_server_ips = upper(try(local.database.platform, "HANA")) == "HANA" ? (module.hdb_node.database_server_ips
) : (module.anydb_node.database_server_ips
)
database_server_vm_names = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.database_server_vm_names) : (
module.anydb_node.database_server_vm_names
)
database_server_secondary_ips = upper(try(local.database.platform, "HANA")) == "HANA" ? (module.hdb_node.database_server_secondary_ips
) : (module.anydb_node.database_server_secondary_ips
)
database_subnet_netmask = module.common_infrastructure.db_subnet_netmask
disks = distinct(compact(concat(module.hdb_node.database_disks,
module.anydb_node.database_disks,
module.app_tier.apptier_disks,
module.hdb_node.database_kdump_disks,
module.anydb_node.database_kdump_disks,
module.app_tier.scs_kdump_disks
)))
loadbalancers = module.hdb_node.loadbalancers
subnet_cidr_anf = module.hdb_node.ANF_subnet_prefix
subnet_cidr_app = module.app_tier.subnet_cidr_app
subnet_cidr_client = module.common_infrastructure.subnet_cidr_client
subnet_cidr_db = module.common_infrastructure.subnet_cidr_db
subnet_cidr_storage = module.common_infrastructure.subnet_cidr_storage
#########################################################################################
# SAP Application information #
#########################################################################################
bom_name = var.bom_name
db_sid = local.db_sid
observer_ips = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.observer_ips) : (
module.anydb_node.observer_ips
)
observer_vms = upper(try(local.database.platform, "HANA")) == "HANA" ? (
module.hdb_node.observer_vms) : (
module.anydb_node.observer_vms
)
platform = upper(try(local.database.platform, "HANA"))
sap_sid = local.sap_sid
web_sid = var.web_sid
web_instance_number = var.web_instance_number
#########################################################################################
# Application tier #
#########################################################################################
ansible_user = module.common_infrastructure.sid_username
app_subnet_netmask = module.app_tier.app_subnet_netmask
app_tier_os_types = module.app_tier.app_tier_os_types
application_server_ips = module.app_tier.application_server_ips
application_server_secondary_ips = module.app_tier.application_server_secondary_ips
app_vm_names = module.app_tier.app_vm_names
ers_instance_number = var.ers_instance_number
ers_server_loadbalancer_ip = module.app_tier.ers_server_loadbalancer_ip
pas_instance_number = var.pas_instance_number
sid_keyvault_user_id = module.common_infrastructure.sid_keyvault_user_id
scs_shared_disks = module.app_tier.scs_asd
scs_cluster_loadbalancer_ip = module.app_tier.cluster_loadbalancer_ip
scs_cluster_type = var.scs_cluster_type
scs_high_availability = module.app_tier.scs_high_availability
scs_instance_number = var.scs_instance_number
scs_server_loadbalancer_ip = module.app_tier.scs_server_loadbalancer_ip
scs_server_ips = module.app_tier.scs_server_ips
scs_server_vm_resource_ids = module.app_tier.scs_vm_ids
scs_server_secondary_ips = module.app_tier.scs_server_secondary_ips
scs_vm_names = module.app_tier.scs_vm_names
use_local_credentials = module.common_infrastructure.use_local_credentials
use_msi_for_clusters = var.use_msi_for_clusters
use_secondary_ips = var.use_secondary_ips
webdispatcher_server_ips = module.app_tier.webdispatcher_server_ips
webdispatcher_server_secondary_ips = module.app_tier.webdispatcher_server_secondary_ips
webdispatcher_server_vm_names = module.app_tier.webdispatcher_server_vm_names
#########################################################################################
# Mounting information #
#########################################################################################
NFS_provider = var.NFS_provider
sap_mnt = module.common_infrastructure.sapmnt_path
sap_transport = try(data.terraform_remote_state.landscape.outputs.saptransport_path, "")
install_path = try(data.terraform_remote_state.landscape.outputs.install_path, "")
shared_home = var.shared_home
hana_data = module.hdb_node.hana_data_ANF_volumes
hana_log = module.hdb_node.hana_log_ANF_volumes
hana_shared = var.NFS_provider == "ANF" ? module.hdb_node.hana_shared : module.hdb_node.hana_shared_afs_path
usr_sap = module.common_infrastructure.usrsap_path
#########################################################################################
# DNS information #
#########################################################################################
dns = try(data.terraform_remote_state.landscape.outputs.dns_label, "")
use_custom_dns_a_registration = try(data.terraform_remote_state.landscape.outputs.use_custom_dns_a_registration, false)
management_dns_subscription_id = try(data.terraform_remote_state.landscape.outputs.management_dns_subscription_id, null)
management_dns_resourcegroup_name = try(data.terraform_remote_state.landscape.outputs.management_dns_resourcegroup_name, local.saplib_resource_group_name)
dns_zone_names = var.dns_zone_names
dns_a_records_for_secondary_names = var.dns_a_records_for_secondary_names
#########################################################################################
# Server counts #
#########################################################################################
app_server_count = try(local.application_tier.application_server_count, 0)
db_server_count = var.database_server_count + var.stand_by_node_count
scs_server_count = local.application_tier.scs_high_availability ? (
2 * local.application_tier.scs_server_count) : (
local.application_tier.scs_server_count
)
web_server_count = try(local.application_tier.webdispatcher_count, 0)
#########################################################################################
# Miscallaneous #
#########################################################################################
use_simple_mount = local.validated_use_simple_mount
upgrade_packages = var.upgrade_packages
scale_out = var.database_HANA_use_scaleout_scenario
scale_out_no_standby_role = var.database_HANA_no_standby_role
#########################################################################################
# iSCSI #
#########################################################################################
iSCSI_server_ips = var.database_cluster_type == "ISCSI" || var.scs_cluster_type == "ISCSI" ? data.terraform_remote_state.landscape.outputs.iSCSI_server_ips : []
iSCSI_server_names = var.database_cluster_type == "ISCSI" || var.scs_cluster_type == "ISCSI" ? data.terraform_remote_state.landscape.outputs.iSCSI_server_names : []
iSCSI_servers = var.database_cluster_type == "ISCSI" || var.scs_cluster_type == "ISCSI" ? data.terraform_remote_state.landscape.outputs.iSCSI_servers : []
#########################################################################################
# AMS #
#########################################################################################
ams_resource_id = try(coalesce(var.ams_resource_id, try(data.terraform_remote_state.landscape.outputs.ams_resource_id, "")),"")
enable_ha_monitoring = var.enable_ha_monitoring
enable_os_monitoring = var.enable_os_monitoring
#########################################################################################
# SAP CAL #
#########################################################################################
enable_sap_cal = var.enable_sap_cal
calapi_kv = var.calapi_kv
sap_cal_product_name = var.sap_cal_product_name
site_information = module.hdb_node.site_information
}