. Max length of final hostname must be <= 13 characters. | `string` | `"nw"` | no |
-| [powervs\_netweaver\_instance\_storage\_config](#input\_powervs\_netweaver\_instance\_storage\_config) | File systems to be created and attached to PowerVS SAP NetWeaver instance. 'size' is in GB. 'count' specify over how many storage volumes the file system will be striped. 'tier' specifies the storage tier in PowerVS workspace. 'mount' specifies the target mount point on OS. Do not specify volume for 'sapmnt' as this will be created internally if 'powervs\_create\_separate\_sharefs\_instance' is false, else 'sapmnt' will mounted from sharefs instance. | list(object({
name = string
size = string
count = string
tier = string
mount = string
pool = optional(string)
}))
| [
{
"count": "1",
"mount": "/usr/sap",
"name": "usrsap",
"size": "50",
"tier": "tier3"
}
]
| no |
+| [powervs\_netweaver\_instance\_storage\_config](#input\_powervs\_netweaver\_instance\_storage\_config) | File systems to be created and attached to PowerVS SAP NetWeaver instance. 'size' is in GB. 'count' specify over how many storage volumes the file system will be striped. 'tier' specifies the storage tier in PowerVS workspace. 'mount' specifies the target mount point on OS. Do not specify volume for 'sapmnt' as this will be created internally if 'powervs\_create\_separate\_sharefs\_instance' is false, else 'sapmnt' will be mounted from sharefs instance. | list(object({
name = string
size = string
count = string
tier = string
mount = string
pool = optional(string)
}))
| [
{
"count": "1",
"mount": "/usr/sap",
"name": "usrsap",
"size": "50",
"tier": "tier3"
}
]
| no |
| [powervs\_netweaver\_memory\_size](#input\_powervs\_netweaver\_memory\_size) | Memory size for PowerVS SAP NetWeaver instance. | `string` | `"32"` | no |
| [powervs\_sap\_network\_cidr](#input\_powervs\_sap\_network\_cidr) | Network range for dedicated SAP network. Used for communication between SAP Application servers with SAP HANA Database. E.g., '10.53.0.0/24' | `string` | `"10.53.0.0/24"` | no |
| [powervs\_sharefs\_instance](#input\_powervs\_sharefs\_instance) | Share fs instance. This parameter is effective if 'powervs\_create\_separate\_sharefs\_instance' is set to true. size' is in GB. 'count' specify over how many storage volumes the file system will be striped. 'tier' specifies the storage tier in PowerVS workspace. 'mount' specifies the target mount point on OS. | object({
name = string
processors = string
memory = string
proc_type = string
storage_config = list(object({
name = string
size = string
count = string
tier = string
mount = string
pool = optional(string)
}))
})
| {
"memory": "2",
"name": "share",
"proc_type": "shared",
"processors": "0.5",
"storage_config": [
{
"count": "1",
"mount": "/sapmnt",
"name": "sapmnt",
"size": "300",
"tier": "tier3"
},
{
"count": "1",
"mount": "/usr/trans",
"name": "trans",
"size": "50",
"tier": "tier3"
}
]
}
| no |
@@ -175,8 +183,9 @@ S4HANA_2023
| [sap\_domain](#input\_sap\_domain) | SAP network domain name. | `string` | `"sap.com"` | no |
| [sap\_hana\_master\_password](#input\_sap\_hana\_master\_password) | SAP HANA master password. | `string` | n/a | yes |
| [sap\_hana\_vars](#input\_sap\_hana\_vars) | SAP HANA SID and instance number. | object({
sap_hana_install_sid = string
sap_hana_install_number = string
})
| {
"sap_hana_install_number": "02",
"sap_hana_install_sid": "HDB"
}
| no |
+| [sap\_monitoring\_vars](#input\_sap\_monitoring\_vars) | Configuration details for SAP monitoring dashboard. Takes effect only when a monitoring instance was deployed as part of Power Virtual Server with VPC landing zone deployment. If 'config\_override' is true, an existing configuration will be overwritten, 'sap\_monitoring\_nr' Two-digit incremental number starting with 01 up to 99. This is not a existing SAP ID, but a pure virtual number and 'sap\_monitoring\_solution\_name' is a virtual arbitrary short name to recognize SAP System. | object({
config_override = bool
sap_monitoring_nr = string
sap_monitoring_solution_name = string
})
| {
"config_override": false,
"sap_monitoring_nr": "01",
"sap_monitoring_solution_name": ""
}
| no |
| [sap\_solution](#input\_sap\_solution) | SAP Solution to be installed on Power Virtual Server. | `string` | n/a | yes |
-| [sap\_solution\_vars](#input\_sap\_solution\_vars) | SAP SID, ASCS and PAS instance numbers. | object({
sap_swpm_sid = string
sap_swpm_ascs_instance_nr = string
sap_swpm_pas_instance_nr = string
})
| {
"sap_swpm_ascs_instance_nr": "00",
"sap_swpm_pas_instance_nr": "01",
"sap_swpm_sid": "S4H"
}
| no |
+| [sap\_solution\_vars](#input\_sap\_solution\_vars) | SAP SID, ASCS and PAS instance numbers and service/protectedwebmethods parameters. | object({
sap_swpm_sid = string
sap_swpm_ascs_instance_nr = string
sap_swpm_pas_instance_nr = string
sap_swpm_service_protectedwebmethods = string
})
| {
"sap_swpm_ascs_instance_nr": "00",
"sap_swpm_pas_instance_nr": "01",
"sap_swpm_service_protectedwebmethods": "SDEFAULT -GetQueueStatistic -ABAPGetWPTable -EnqGetStatistic -GetProcessList -GetEnvironment -BAPGetSystemWPTable",
"sap_swpm_sid": "S4H"
}
| no |
| [sap\_swpm\_master\_password](#input\_sap\_swpm\_master\_password) | SAP SWPM master password. | `string` | n/a | yes |
| [software\_download\_directory](#input\_software\_download\_directory) | Software installation binaries will be downloaded to this directory. | `string` | `"/software"` | no |
| [ssh\_private\_key](#input\_ssh\_private\_key) | Private SSH key (RSA format) used to login to IBM PowerVS instances. Should match to uploaded public SSH key referenced by 'ssh\_public\_key' which was created previously. The key is temporarily stored and deleted. For more information about SSH keys, see [SSH keys](https://cloud.ibm.com/docs/vpc?topic=vpc-ssh-keys). | `string` | n/a | yes |
@@ -194,5 +203,6 @@ S4HANA_2023
| [powervs\_netweaver\_instance\_management\_ip](#output\_powervs\_netweaver\_instance\_management\_ip) | Management IP of NetWeaver instance. |
| [powervs\_sharefs\_instance\_ips](#output\_powervs\_sharefs\_instance\_ips) | Private IPs of the Share FS instance. |
| [sap\_hana\_vars](#output\_sap\_hana\_vars) | SAP HANA system details. |
+| [sap\_monitoring\_vars](#output\_sap\_monitoring\_vars) | SAP Monitoring Instance details. |
| [sap\_solution\_vars](#output\_sap\_solution\_vars) | SAP NetWeaver system details. |
diff --git a/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md b/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md
index 1c74c000..f5aaf7b2 100644
--- a/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md
+++ b/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md
@@ -1,4 +1,4 @@
-| HANA rev78 Binaries |
+| SAP HANA rev78 Binaries |
|-----------------------------------|
| IMDB_AFL20_078_0-80002045.SAR |
| IMDB_CLIENT20_020_23-80002095.SAR |
@@ -39,3 +39,9 @@
| SWPM20SP15_1-80003426.SAR |
| igsexe_3-70005446.sar |
| igshelper_17-10010245.sar |
+
+
+| SAP x86_64 binaries for monitoring host|
+|-----------------------------------|
+| IMDB_CLIENT20_020_23-80002082.SAR |
+| SAPCAR_1300-70007716.EXE |
diff --git a/solutions/ibm-catalog/sap-s4hana-bw4hana/locals_schematics_data.tf b/solutions/ibm-catalog/sap-s4hana-bw4hana/locals_schematics_data.tf
index a43e0e3d..89ec84f3 100644
--- a/solutions/ibm-catalog/sap-s4hana-bw4hana/locals_schematics_data.tf
+++ b/solutions/ibm-catalog/sap-s4hana-bw4hana/locals_schematics_data.tf
@@ -18,22 +18,23 @@ data "ibm_schematics_output" "schematics_output" {
}
locals {
- powervs_infrastructure = jsondecode(data.ibm_schematics_output.schematics_output.output_json)
-
- powervs_workspace_guid = local.powervs_infrastructure[0].powervs_workspace_guid.value
- powervs_sshkey_name = local.powervs_infrastructure[0].powervs_ssh_public_key.value.name
- powervs_images = local.powervs_infrastructure[0].powervs_images.value
- powervs_networks = [local.powervs_infrastructure[0].powervs_management_subnet.value, local.powervs_infrastructure[0].powervs_backup_subnet.value]
- access_host_or_ip = local.powervs_infrastructure[0].access_host_or_ip.value
- proxy_host_or_ip_port = local.powervs_infrastructure[0].proxy_host_or_ip_port.value
- dns_host_or_ip = local.powervs_infrastructure[0].dns_host_or_ip.value
- ntp_host_or_ip = local.powervs_infrastructure[0].ntp_host_or_ip.value
- nfs_host_or_ip_path = local.powervs_infrastructure[0].nfs_host_or_ip_path.value
- ansible_host_or_ip = local.powervs_infrastructure[0].ansible_host_or_ip.value
- network_services_config = local.powervs_infrastructure[0].network_services_config.value
+ powervs_infrastructure = jsondecode(data.ibm_schematics_output.schematics_output.output_json)
+ powervs_workspace_guid = local.powervs_infrastructure[0].powervs_workspace_guid.value
+ powervs_sshkey_name = local.powervs_infrastructure[0].powervs_ssh_public_key.value.name
+ powervs_images = local.powervs_infrastructure[0].powervs_images.value
+ powervs_networks = [local.powervs_infrastructure[0].powervs_management_subnet.value, local.powervs_infrastructure[0].powervs_backup_subnet.value]
+ access_host_or_ip = local.powervs_infrastructure[0].access_host_or_ip.value
+ proxy_host_or_ip_port = local.powervs_infrastructure[0].proxy_host_or_ip_port.value
+ dns_host_or_ip = local.powervs_infrastructure[0].dns_host_or_ip.value
+ ntp_host_or_ip = local.powervs_infrastructure[0].ntp_host_or_ip.value
+ nfs_host_or_ip_path = local.powervs_infrastructure[0].nfs_host_or_ip_path.value
+ ansible_host_or_ip = local.powervs_infrastructure[0].ansible_host_or_ip.value
+ network_services_config = local.powervs_infrastructure[0].network_services_config.value
+ monitoring_instance_guid = local.powervs_infrastructure[0].monitoring_instance.value.guid
+ monitoring_instance_location = local.powervs_infrastructure[0].monitoring_instance.value.location
+ monitoring_host_ip = local.powervs_infrastructure[0].monitoring_instance.value.monitoring_host_ip
}
-
locals {
powervs_sharefs_os_image = var.powervs_default_sap_images.rhel_nw_image
powervs_hana_os_image = var.powervs_default_sap_images.rhel_hana_image
@@ -52,4 +53,6 @@ locals {
dns = { enable = local.dns_host_or_ip != "" ? true : false, dns_server_ip = local.dns_host_or_ip }
ntp = { enable = local.ntp_host_or_ip != "" ? true : false, ntp_server_ip = local.ntp_host_or_ip }
}
+
+ enable_monitoring = local.monitoring_instance_guid != "" && local.monitoring_host_ip != "" && local.monitoring_instance_location != "" && var.ibmcloud_cos_configuration.cos_monitoring_software_path != ""
}
diff --git a/solutions/ibm-catalog/sap-s4hana-bw4hana/main.tf b/solutions/ibm-catalog/sap-s4hana-bw4hana/main.tf
index b3ad2a31..d9843a19 100644
--- a/solutions/ibm-catalog/sap-s4hana-bw4hana/main.tf
+++ b/solutions/ibm-catalog/sap-s4hana-bw4hana/main.tf
@@ -85,6 +85,15 @@ locals {
cos_dir_name = var.ibmcloud_cos_configuration.cos_solution_software_path
download_dir_path = local.network_services_config.nfs.nfs_client_path
}
+
+ ibmcloud_cos_monitoring_configuration = {
+ cos_apikey = local.cos_apikey
+ cos_region = var.ibmcloud_cos_configuration.cos_region
+ cos_resource_instance_id = local.cos_resource_instance_id
+ cos_bucket_name = var.ibmcloud_cos_configuration.cos_bucket_name
+ cos_dir_name = var.ibmcloud_cos_configuration.cos_monitoring_software_path
+ download_dir_path = local.network_services_config.nfs.nfs_client_path
+ }
}
module "ibmcloud_cos_download_hana_binaries" {
@@ -108,6 +117,16 @@ module "ibmcloud_cos_download_netweaver_binaries" {
ibmcloud_cos_configuration = local.ibmcloud_cos_solution_configuration
}
+module "ibmcloud_cos_download_monitoring_binaries" {
+ source = "../../../modules/ibmcloud-cos"
+ depends_on = [module.ibmcloud_cos_download_netweaver_binaries]
+ count = local.enable_monitoring ? 1 : 0
+
+ access_host_or_ip = local.access_host_or_ip
+ target_server_ip = local.ansible_host_or_ip
+ ssh_private_key = var.ssh_private_key
+ ibmcloud_cos_configuration = local.ibmcloud_cos_monitoring_configuration
+}
#####################################################
# Ansible vars validation
@@ -210,3 +229,59 @@ module "ansible_sap_install_solution" {
dst_inventory_file_name = "${var.prefix}-${var.powervs_netweaver_instance_name}-instance-inventory"
inventory_template_vars = { "pi_instance_management_ip" : module.sap_system.pi_netweaver_instance_management_ips }
}
+
+####################################################
+# Ansible Install Monitoring SAP solution
+#####################################################
+
+locals {
+
+ ansible_monitoring_solution_playbook_vars = merge(var.sap_monitoring_vars,
+ {
+ sap_monitoring_action = "add"
+ sap_tools_directory = "${local.network_services_config.nfs.nfs_client_path}/${var.ibmcloud_cos_configuration.cos_monitoring_software_path}"
+ sap_hana_ip = module.sap_system.pi_hana_instance_management_ip
+ sap_hana_http_port = "5${var.sap_hana_vars.sap_hana_install_number}13"
+ sap_hana_sql_systemdb_port = "3${var.sap_hana_vars.sap_hana_install_number}13"
+ sap_hana_sql_systemdb_user = "system"
+ sap_hana_sql_systemdb_password = var.sap_hana_master_password
+ sap_ascs_ip = module.sap_system.pi_netweaver_instance_management_ips
+ sap_ascs_http_port = "5${var.sap_solution_vars.sap_swpm_ascs_instance_nr}13"
+ sap_app_server = jsonencode([
+ {
+ sap_app_server_nr = "01"
+ ip = module.sap_system.pi_netweaver_instance_management_ips
+ port = "5${var.sap_solution_vars.sap_swpm_pas_instance_nr}13"
+ }]
+ )
+ ibmcloud_monitoring_instance_url = "https://ingest.prws.private.${local.monitoring_instance_location}.monitoring.cloud.ibm.com/prometheus/remote/write"
+ ibmcloud_monitoring_request_credential_url = "https://${local.monitoring_instance_location}.monitoring.cloud.ibm.com/api/token"
+ ibmcloud_monitoring_instance_guid = local.monitoring_instance_guid
+ }
+ )
+}
+
+
+module "ansible_monitoring_sap_install_solution" {
+
+ source = "../../../modules/ansible"
+ depends_on = [module.ibmcloud_cos_download_monitoring_binaries, module.ansible_sap_install_hana, module.ansible_sap_install_solution]
+ count = local.enable_monitoring ? 1 : 0
+
+ bastion_host_ip = local.access_host_or_ip
+ ansible_host_or_ip = local.ansible_host_or_ip
+ ssh_private_key = var.ssh_private_key
+ ansible_vault_password = var.ansible_vault_password
+ configure_ansible_host = false
+ ibmcloud_api_key = var.ibmcloud_api_key
+
+ src_script_template_name = "configure-monitoring-sap/ansible_configure_monitoring.sh.tftpl"
+ dst_script_file_name = "${var.prefix}-configure_monitoring.sh"
+
+ src_playbook_template_name = "configure-monitoring-sap/playbook-configure-monitoring-sap.yml.tftpl"
+ dst_playbook_file_name = "${var.prefix}-playbook-configure-monitoring-sap.yml"
+ playbook_template_vars = local.ansible_monitoring_solution_playbook_vars
+ src_inventory_template_name = "monitoring-inventory.tftpl"
+ dst_inventory_file_name = "${var.prefix}-monitoring-instance-inventory"
+ inventory_template_vars = { "monitoring_host_ip" : local.monitoring_host_ip }
+}
diff --git a/solutions/ibm-catalog/sap-s4hana-bw4hana/outputs.tf b/solutions/ibm-catalog/sap-s4hana-bw4hana/outputs.tf
index 3e9ba1da..1dd19c1d 100644
--- a/solutions/ibm-catalog/sap-s4hana-bw4hana/outputs.tf
+++ b/solutions/ibm-catalog/sap-s4hana-bw4hana/outputs.tf
@@ -47,3 +47,8 @@ output "sap_solution_vars" {
description = "SAP NetWeaver system details."
value = var.sap_solution_vars
}
+
+output "sap_monitoring_vars" {
+ description = "SAP Monitoring Instance details."
+ value = merge(var.sap_monitoring_vars, local.powervs_infrastructure[0].monitoring_instance.value)
+}
diff --git a/solutions/ibm-catalog/sap-s4hana-bw4hana/variables.tf b/solutions/ibm-catalog/sap-s4hana-bw4hana/variables.tf
index 5d82c13e..37dc0e4e 100644
--- a/solutions/ibm-catalog/sap-s4hana-bw4hana/variables.tf
+++ b/solutions/ibm-catalog/sap-s4hana-bw4hana/variables.tf
@@ -71,19 +71,21 @@ variable "ibmcloud_cos_service_credentials" {
}
variable "ibmcloud_cos_configuration" {
- description = "Cloud Object Storage instance containing SAP installation files that will be downloaded to NFS share. 'cos_hana_software_path' must contain only binaries required for HANA DB installation. 'cos_solution_software_path' must contain only binaries required for S/4HANA or BW/4HANA installation and must not contain any IMDB files. The binaries required for installation can be found [here](https://github.com/terraform-ibm-modules/terraform-ibm-powervs-sap/blob/main/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md) If you have an optional stack xml file (maintenance planner), place it under the 'cos_solution_software_path' directory. Avoid inserting '/' at the beginning for 'cos_hana_software_path' and 'cos_solution_software_path'."
+ description = "Cloud Object Storage instance containing SAP installation files that will be downloaded to NFS share. 'cos_hana_software_path' must contain only binaries required for HANA DB installation. 'cos_solution_software_path' must contain only binaries required for S/4HANA or BW/4HANA installation and must not contain any IMDB files. 'cos_monitoring_software_path' is optional and must contain x86_64 SAPCAR and SAP HANA client binaries required for configuring monitoring instance. The binaries required for installation can be found [here](https://github.com/terraform-ibm-modules/terraform-ibm-powervs-sap/blob/main/solutions/ibm-catalog/sap-s4hana-bw4hana/docs/s4hana23_bw4hana21_binaries.md) If you have an optional stack xml file (maintenance planner), place it under the 'cos_solution_software_path' directory. Avoid inserting '/' at the beginning for 'cos_hana_software_path', 'cos_solution_software_path' and 'cos_monitoring_software_path'."
type = object({
- cos_region = string
- cos_bucket_name = string
- cos_hana_software_path = string
- cos_solution_software_path = string
- cos_swpm_mp_stack_file_name = string
+ cos_region = string
+ cos_bucket_name = string
+ cos_hana_software_path = string
+ cos_solution_software_path = string
+ cos_monitoring_software_path = optional(string)
+ cos_swpm_mp_stack_file_name = string
})
default = {
"cos_region" : "eu-geo",
"cos_bucket_name" : "powervs-automation",
"cos_hana_software_path" : "HANA_DB/rev78",
"cos_solution_software_path" : "S4HANA_2023",
+ "cos_monitoring_software_path" = "HANA_CLIENT/x86_64",
"cos_swpm_mp_stack_file_name" : ""
}
}
@@ -141,17 +143,19 @@ variable "sap_swpm_master_password" {
}
variable "sap_solution_vars" {
- description = "SAP SID, ASCS and PAS instance numbers."
+ description = "SAP SID, ASCS and PAS instance numbers and service/protectedwebmethods parameters."
type = object({
- sap_swpm_sid = string
- sap_swpm_ascs_instance_nr = string
- sap_swpm_pas_instance_nr = string
+ sap_swpm_sid = string
+ sap_swpm_ascs_instance_nr = string
+ sap_swpm_pas_instance_nr = string
+ sap_swpm_service_protectedwebmethods = string
})
default = {
"sap_swpm_sid" : "S4H",
"sap_swpm_ascs_instance_nr" : "00",
- "sap_swpm_pas_instance_nr" : "01"
+ "sap_swpm_pas_instance_nr" : "01",
+ "sap_swpm_service_protectedwebmethods" : "SDEFAULT -GetQueueStatistic -ABAPGetWPTable -EnqGetStatistic -GetProcessList -GetEnvironment -BAPGetSystemWPTable"
}
validation {
condition = var.sap_solution_vars.sap_swpm_ascs_instance_nr != var.sap_solution_vars.sap_swpm_pas_instance_nr
@@ -189,7 +193,6 @@ variable "ibmcloud_api_key" {
sensitive = true
}
-
################################################################
#
# Optional Parameters
@@ -236,7 +239,7 @@ variable "powervs_hana_instance_additional_storage_config" {
}
variable "powervs_netweaver_instance_storage_config" {
- description = "File systems to be created and attached to PowerVS SAP NetWeaver instance. 'size' is in GB. 'count' specify over how many storage volumes the file system will be striped. 'tier' specifies the storage tier in PowerVS workspace. 'mount' specifies the target mount point on OS. Do not specify volume for 'sapmnt' as this will be created internally if 'powervs_create_separate_sharefs_instance' is false, else 'sapmnt' will mounted from sharefs instance."
+ description = "File systems to be created and attached to PowerVS SAP NetWeaver instance. 'size' is in GB. 'count' specify over how many storage volumes the file system will be striped. 'tier' specifies the storage tier in PowerVS workspace. 'mount' specifies the target mount point on OS. Do not specify volume for 'sapmnt' as this will be created internally if 'powervs_create_separate_sharefs_instance' is false, else 'sapmnt' will be mounted from sharefs instance."
type = list(object({
name = string
size = string
@@ -305,3 +308,21 @@ variable "powervs_default_sap_images" {
"rhel_nw_image" : "RHEL9-SP4-SAP-NETWEAVER"
}
}
+
+variable "sap_monitoring_vars" {
+ description = "Configuration details for SAP monitoring dashboard. Takes effect only when a monitoring instance was deployed as part of Power Virtual Server with VPC landing zone deployment. If 'config_override' is true, an existing configuration will be overwritten, 'sap_monitoring_nr' Two-digit incremental number starting with 01 up to 99. This is not a existing SAP ID, but a pure virtual number and 'sap_monitoring_solution_name' is a virtual arbitrary short name to recognize SAP System."
+ type = object({
+ config_override = bool
+ sap_monitoring_nr = string
+ sap_monitoring_solution_name = string
+ })
+ default = {
+ config_override = false
+ sap_monitoring_nr = "01"
+ sap_monitoring_solution_name = ""
+ }
+ validation {
+ condition = (length(var.sap_monitoring_vars.sap_monitoring_nr) == 2 && tonumber(var.sap_monitoring_vars.sap_monitoring_nr) >= 0 && tonumber(var.sap_monitoring_vars.sap_monitoring_nr) <= 99) || var.sap_monitoring_vars.sap_monitoring_nr == ""
+ error_message = "sap_monitoring_nr should be a 2-digit number between 00 and 99. or empty"
+ }
+}