diff --git a/ansible/playbooks/sap-hana-cluster.yaml b/ansible/playbooks/sap-hana-cluster.yaml index 6c28ca5d..b35d3d28 100644 --- a/ansible/playbooks/sap-hana-cluster.yaml +++ b/ansible/playbooks/sap-hana-cluster.yaml @@ -5,6 +5,8 @@ become: true become_user: root vars: + # SAPHahaSR-angi + use_hana_sr_angi: "{{ use_sap_hana_sr_angi | default(false) }}" # is_primary is selected so that tasks that need to be issued one are honoured correctly is_primary: "{{ ansible_play_hosts[0] == inventory_hostname }}" primary_hostname: "{{ ansible_play_hosts[0] }}" @@ -19,6 +21,7 @@ # Define some names in a central place rsc_socat: "rsc_socat_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}" rsc_saphanactl: "rsc_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}" + ms_saphanactl: "msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}" handlers: @@ -40,6 +43,11 @@ - name: Load SAP HANA variables ansible.builtin.include_vars: ./vars/hana_vars.yaml + - name: Re-set HANA Angi vars + ansible.builtin.set_fact: + ms_saphanactl: "mst_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}" + when: + - use_hana_sr_angi | bool tasks: - name: Base Cluster Configuration [azure] @@ -81,12 +89,7 @@ cmd: >- crm resource refresh - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - when: is_primary - - - name: Wait for cluster to settle - ansible.builtin.command: - cmd: cs_wait_for_idle -s 5 + {{ ms_saphanactl }} when: is_primary - name: MS Resource Maintenance off @@ -94,6 +97,11 @@ cmd: >- crm resource maintenance - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} off when: is_primary + + - name: Wait for cluster to settle + ansible.builtin.command: + cmd: cs_wait_for_idle -s 5 + when: is_primary diff --git a/ansible/playbooks/sap-hana-preconfigure.yaml b/ansible/playbooks/sap-hana-preconfigure.yaml index 282e7cb2..9ecaf754 100644 --- a/ansible/playbooks/sap-hana-preconfigure.yaml +++ b/ansible/playbooks/sap-hana-preconfigure.yaml @@ -3,7 +3,14 @@ remote_user: cloudadmin become: true become_user: root + + pre_tasks: + - name: Source hana install variables + include_vars: ./vars/hana_vars.yaml + vars: + # SAPHahaSR-angi + use_hana_sr_angi: "{{ use_sap_hana_sr_angi | default(false) }}" scale_out: false use_sapconf: false # Set use_reboottimeout default value to 1200, @@ -36,7 +43,7 @@ state: present replacefiles: true when: - - ansible_facts['distribution_version'] == '15.1' + - ansible_facts['distribution_version'] == '15.1' and not use_hana_sr_angi | bool register: result until: result is succeeded retries: 3 @@ -72,6 +79,24 @@ ansible.builtin.include_tasks: ./tasks/saptune.yaml when: not use_sapconf | bool + # SAPHanaSR-angi -BEGIN- + - name: Ensure SAPHanaSR-doc and SAPHanaSR is NOT installed when angi is used + community.general.zypper: + name: "{{ item }}" + state: absent + loop: + - 'SAPHanaSR-doc' + - 'SAPHanaSR' + when: use_hana_sr_angi | bool + + - name: Ensure SAPHanaSR-angi and supportutils plugin is installed when angi is used + community.general.zypper: + name: "{{ item }}" + state: present + loop: + - 'SAPHanaSR-angi' + - 'supportutils-plugin-ha-sap' + when: cluster_node and use_hana_sr_angi | bool # https://docs.ansible.com/ansible/latest/collections/ansible/builtin/reboot_module.html#parameters # reboot_timeout Maximum seconds to wait for machine to reboot and respond to a test command. Default: 600 diff --git a/ansible/playbooks/sap-hana-system-replication-hooks.yaml b/ansible/playbooks/sap-hana-system-replication-hooks.yaml index bb828e51..0cabe68a 100644 --- a/ansible/playbooks/sap-hana-system-replication-hooks.yaml +++ b/ansible/playbooks/sap-hana-system-replication-hooks.yaml @@ -15,6 +15,9 @@ # https://documentation.suse.com/sbp/sap-15/html/SLES4SAP-hana-sr-guide-PerfOpt-15/index.html#cha.s4s.hana-hook __hooks_dir: "/usr/share/SAPHanaSR/" __sapcontrol: "/usr/sap/hostctrl/exe/sapcontrol" + # SAPHahaSR-angi + use_hana_sr_angi: "{{ use_sap_hana_sr_angi | default(false) }}" + __hooks_dir_angi: "/usr/share/SAPHanaSR-angi/" handlers: - name: Stop HANA @@ -53,13 +56,23 @@ - 'sap_hana_install_sid' - 'sap_hana_install_instance_number' - - name: Ensure hooks directory exists + - name: Ensure SAPHanaSR hooks directory exists ansible.builtin.file: path: "{{ __hooks_dir }}" owner: "{{ sap_hana_install_sid | lower }}adm" group: sapsys state: directory mode: '0775' + when: not use_hana_sr_angi | bool + + - name: Ensure SAPHanaSR-angi hooks directory exists + ansible.builtin.file: + path: "{{ __hooks_dir_angi }}" + owner: "{{ sap_hana_install_sid | lower }}adm" + group: sapsys + state: directory + mode: '0775' + when: use_hana_sr_angi | bool - name: Ensure System Replication hooks are installed and configured notify: @@ -81,6 +94,30 @@ - {'section': 'ha_dr_provider_SAPHanaSR', 'key': 'path', 'value': '{{ __hooks_dir }}'} - {'section': 'ha_dr_provider_SAPHanaSR', 'key': 'execution_order', 'value': '1'} - {'section': 'trace', 'key': 'ha_dr_saphanasr', 'value': 'info'} + when: not use_hana_sr_angi | bool + + - name: Ensure ha_dr_provider_SAPHanaSR-angi section exists in global.ini + community.general.ini_file: + path: /usr/sap/{{ sap_hana_install_sid }}/SYS/global/hdb/custom/config/global.ini + section: "{{ item.section }}" + option: "{{ item.key }}" + value: "{{ item.value }}" + mode: '0644' + backup: true + loop: + - {'section': 'ha_dr_provider_sushanasr', 'key': 'provider', 'value': 'susHanaSR'} + - {'section': 'ha_dr_provider_sushanasr', 'key': 'path', 'value': '{{ __hooks_dir_angi }}'} + - {'section': 'ha_dr_provider_sushanasr', 'key': 'execution_order', 'value': '1'} + - {'section': 'ha_dr_provider_sustkover', 'key': 'provider', 'value': 'susTkOver'} + - {'section': 'ha_dr_provider_sustkover', 'key': 'path', 'value': '{{ __hooks_dir_angi }}'} + - {'section': 'ha_dr_provider_sustkover', 'key': 'execution_order', 'value': '2'} + - {'section': 'ha_dr_provider_suschksrv', 'key': 'provider', 'value': 'susChkSrv'} + - {'section': 'ha_dr_provider_suschksrv', 'key': 'path', 'value': '{{ __hooks_dir_angi }}'} + - {'section': 'ha_dr_provider_suschksrv', 'key': 'execution_order', 'value': '3'} + - {'section': 'trace', 'key': 'ha_dr_sushanasr', 'value': 'info'} + - {'section': 'trace', 'key': 'ha_dr_suschksrv', 'value': 'info'} + - {'section': 'trace', 'key': 'ha_dr_sustkover', 'value': 'info'} + when: use_hana_sr_angi | bool - name: Add hooks into sudoers ansible.builtin.lineinfile: @@ -98,3 +135,19 @@ - {'regexp': '^Cmnd_Alias SOK_SITEB', 'line': 'Cmnd_Alias SOK_SITEB = /usr/sbin/crm_attribute -n hana_{{ sap_hana_install_sid | lower }}_site_srHook_{{ secondary_site }} -v SOK -t crm_config -s SAPHanaSR'} - {'regexp': '^Cmnd_Alias SFAIL_SITEB', 'line': 'Cmnd_Alias SFAIL_SITEB = /usr/sbin/crm_attribute -n hana_{{ sap_hana_install_sid | lower }}_site_srHook_{{ secondary_site }} -v SFAIL -t crm_config -s SAPHanaSR'} - {'regexp': '^{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD', 'line': '{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD: SOK_SITEA, SFAIL_SITEA, SOK_SITEB, SFAIL_SITEB'} + when: not use_hana_sr_angi | bool + + - name: Add angi hooks into sudoers + ansible.builtin.lineinfile: + path: /etc/sudoers.d/HanaSystemReplication + state: present + regexp: "{{ item.regexp }}" + line: "{{ item.line }}" + validate: /usr/sbin/visudo -cf %s + create: true + mode: '0440' + loop: + - {'regexp': '^#ANSIBLE MANAGED DOCUMENT', 'line': '#ANSIBLE MANAGED DOCUMENT - no manual edits!'} + - {'regexp': '^{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD', 'line': '{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD: /usr/sbin/crm_attribute -n hana_{{ sap_hana_install_sid | lower }}_*'} + - {'regexp': '^{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD', 'line': '{{ sap_hana_install_sid | lower }}adm ALL=(ALL) NOPASSWD: /usr/bin/SAPHanaSR-hookHelper --sid={{ sap_hana_install_sid | upper }} *'} + when: use_hana_sr_angi | bool diff --git a/ansible/playbooks/tasks/aws-cluster-hana.yaml b/ansible/playbooks/tasks/aws-cluster-hana.yaml index 9ec299c7..c12d572a 100644 --- a/ansible/playbooks/tasks/aws-cluster-hana.yaml +++ b/ansible/playbooks/tasks/aws-cluster-hana.yaml @@ -8,12 +8,14 @@ - name: Set hana crm facts ansible.builtin.set_fact: - crm_maintainence_mode: "{{ (crm_conf_hana_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" + crm_maintenance_mode: "{{ (crm_conf_hana_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" stonith_timeout: "{{ crm_conf_hana_show.stdout | regex_search('stonith-timeout') }}" # this should be variable! hana_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_SAPHanaCtl_') }}" - hana_clone: "{{ crm_conf_hana_show.stdout | regex_search('ms msl_SAPHanaCtl_') }}" + hana_clone: "{{ crm_conf_hana_show.stdout | regex_search('ms ms(.)_SAPHanaCtl_') }}" hana_topology_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_SAPHanaTpg') }}" hana_topology_clone: "{{ crm_conf_hana_show.stdout | regex_search('clone cln_SAPHanaTpg') }}" + hana_filesystem_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_SAPHanaFil_') }}" + hana_filesystem_clone: "{{ crm_conf_show.stdout | regex_search('primitive cln_SAPHanaFil_') }}" ip_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_ip_') }}" ip_nc: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_socat_') }}" ip_grp: "{{ crm_conf_hana_show.stdout | regex_search('group g_ip_') }}" @@ -22,10 +24,10 @@ when: is_primary changed_when: false -- name: Ensure maintainence mode is active +- name: Ensure maintenance mode is active ansible.builtin.command: - cmd: crm configure property maintenance-mode=true - when: crm_maintainence_mode is false or crm_maintainence_mode == 'unknown' + cmd: crm maintenance on + when: crm_maintenance_mode is false or crm_maintenance_mode == 'unknown' - name: Create HANA topology resource ansible.builtin.command: @@ -62,7 +64,7 @@ ansible.builtin.command: cmd: >- crm configure primitive - rsc_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ rsc_saphanactl }} ocf:suse:SAPHana operations $id="rsc_sap_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" @@ -79,14 +81,40 @@ AUTOMATED_REGISTER="false" when: - hana_resource | length == 0 + - not use_hana_sr_angi | bool + - is_primary + +- name: Create HANA angi resource + ansible.builtin.command: + cmd: >- + crm configure primitive + {{ rsc_saphanactl }} + ocf:suse:SAPHanaController + op start interval="0" timeout="3600" + op stop interval="0" timeout="3600" + op promote interval="0" timeout="900" + op demote interval="0" timeout="320" + op monitor interval="60" role="Promoted" timeout="700" + op monitor interval="61" role="Unpromoted" timeout="700" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + PREFER_SITE_TAKEOVER="true" + DUPLICATE_PRIMARY_TIMEOUT="7200" + AUTOMATED_REGISTER="false" + meta + priority="100" + when: + - hana_resource | length == 0 + - use_hana_sr_angi | bool - is_primary - name: Create HANA resource clone ansible.builtin.command: cmd: >- crm configure ms - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - rsc_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} + {{ rsc_saphanactl }} meta notify="true" clone-max="2" @@ -97,6 +125,44 @@ - hana_clone | length == 0 - is_primary +- name: Create HANA Filesystem resource + ansible.builtin.command: + cmd: >- + crm configure primitive + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + ocf:suse:SAPHanaFilesystem + operations + $id="rsc_sap3_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" + op start interval="0" timeout="10" + op stop interval="0" timeout="20" + op monitor interval="120" timeout="120" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + ON_FAIL_ACTION="fence" + register: cmd_crm_chfr_output + changed_when: cmd_crm_chfr_output.rc != 0 + when: + - use_hana_sr_angi | bool + - hana_filesystem_resource | length == 0 + +- name: Create HANA Filesystem clone + ansible.builtin.command: + cmd: >- + crm configure clone + cln_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + meta + clone-max="2" + clone-node-max="1" + target-role="Started" + interleave="true" + register: cmd_crm_chfc_output + changed_when: cmd_crm_chfc_output.rc != 0 + when: + - use_hana_sr_angi | bool + - hana_filesystem_clone | length == 0 + - name: Configure colocation ansible.builtin.command: cmd: >- @@ -104,7 +170,7 @@ col_saphana_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} 2000: rsc_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Started - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Master + {{ ms_saphanactl }} when: ip_colo | length == 0 - name: Configure order @@ -114,22 +180,28 @@ ord_SAPHana Optional: cln_SAPHanaTpg_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} when: cluster_order | length == 0 -# Get current maintainence state +# Get current maintenance state - name: Refresh cluster status ansible.builtin.command: cmd: crm configure show register: refreshed_crm_conf_show changed_when: false -- name: Set crm facts +- name: Refresh crm facts ansible.builtin.set_fact: - refreshed_crm_maintainence_mode: "{{ (refreshed_crm_conf_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" + refreshed_crm_maintenance_mode: "{{ (refreshed_crm_conf_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" changed_when: false -- name: Ensure maintainence mode is disabled +- name: Ensure maintenance mode is disabled ansible.builtin.command: - cmd: crm configure property maintenance-mode=false - when: refreshed_crm_maintainence_mode is true or refreshed_crm_maintainence_mode == 'unknown' + cmd: crm maintenance off + when: refreshed_crm_maintenance_mode is true or refreshed_crm_maintenance_mode == 'unknown' + +# For debug purpose only +- name: Get cluster status at the end + ansible.builtin.command: + cmd: crm configure show + changed_when: false diff --git a/ansible/playbooks/tasks/azure-cluster-hana.yaml b/ansible/playbooks/tasks/azure-cluster-hana.yaml index 5813d824..05dc4289 100644 --- a/ansible/playbooks/tasks/azure-cluster-hana.yaml +++ b/ansible/playbooks/tasks/azure-cluster-hana.yaml @@ -11,9 +11,11 @@ stonith_enabled: "{{ (crm_conf_show.stdout | regex_search('stonith-enabled=([a-z]*)', '\\1'))[0] | default('false') }}" stonith_timeout: "{{ crm_conf_show.stdout | regex_search('stonith-timeout') }}" # this should be variable! hana_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_SAPHanaCtl_') }}" - hana_clone: "{{ crm_conf_show.stdout | regex_search('ms msl_SAPHanaCtl_') }}" + hana_clone: "{{ crm_conf_show.stdout | regex_search('ms ms(.)_SAPHanaCtl_') }}" hana_topology_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_SAPHanaTpg') }}" hana_topology_clone: "{{ crm_conf_show.stdout | regex_search('clone cln_SAPHanaTpg') }}" + hana_filesystem_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_SAPHanaFil_') }}" + hana_filesystem_clone: "{{ crm_conf_show.stdout | regex_search('primitive cln_SAPHanaFil_') }}" ip_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_ip_') }}" ip_nc: "{{ crm_conf_show.stdout | regex_search('primitive rsc_socat_') }}" ip_grp: "{{ crm_conf_show.stdout | regex_search('group g_ip_') }}" @@ -23,21 +25,10 @@ migration_threshold: "{{ (crm_conf_show.stdout | regex_search('migration-threshold=([0-9]*)', '\\1'))[0] }}" changed_when: false -- name: Create HANA topology resource +- name: Ensure maintenance mode is active ansible.builtin.command: - cmd: >- - crm configure primitive - rsc_SAPHanaTpg_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - ocf:suse:SAPHanaTopology - operations - $id="rsc_sap2_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" - op monitor interval="10" timeout="600" - op start interval="0" timeout="600" - op stop interval="0" timeout="300" - params - SID="{{ sap_hana_install_sid }}" - InstanceNumber="{{ sap_hana_install_instance_number }}" - when: hana_topology_resource | length == 0 + cmd: crm maintenance on + when: crm_maintenance_mode is false or crm_maintenance_mode == 'unknown' - name: Set stonith-timeout [sbd] ansible.builtin.command: @@ -65,6 +56,22 @@ when: - not use_sbd | bool +- name: Create HANA topology resource + ansible.builtin.command: + cmd: >- + crm configure primitive + rsc_SAPHanaTpg_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + ocf:suse:SAPHanaTopology + operations + $id="rsc_sap2_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" + op monitor interval="10" timeout="600" + op start interval="0" timeout="600" + op stop interval="0" timeout="300" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + when: hana_topology_resource | length == 0 + - name: Create HANA topology clone ansible.builtin.command: cmd: >- @@ -88,7 +95,7 @@ op start interval="0" timeout="3600" op stop interval="0" timeout="3600" op promote interval="0" timeout="3600" - op monitor interval="60" role="Master" timeout=\"700\" + op monitor interval="60" role="Master" timeout="700" op monitor interval="61" role="Slave" timeout="700" params SID="{{ sap_hana_install_sid }}" @@ -96,13 +103,39 @@ PREFER_SITE_TAKEOVER="true" DUPLICATE_PRIMARY_TIMEOUT="7200" AUTOMATED_REGISTER="false" - when: hana_resource | length == 0 + when: + - hana_resource | length == 0 + - not use_hana_sr_angi | bool + +- name: Create HANA angi resource + ansible.builtin.command: + cmd: >- + crm configure primitive + {{ rsc_saphanactl }} + ocf:suse:SAPHanaController + op start interval="0" timeout="3600" + op stop interval="0" timeout="3600" + op promote interval="0" timeout="900" + op demote interval="0" timeout="320" + op monitor interval="60" role="Promoted" timeout="700" + op monitor interval="61" role="Unpromoted" timeout="700" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + PREFER_SITE_TAKEOVER="true" + DUPLICATE_PRIMARY_TIMEOUT="7200" + AUTOMATED_REGISTER="false" + meta + priority="100" + when: + - hana_resource | length == 0 + - use_hana_sr_angi | bool - name: Create HANA resource clone ansible.builtin.command: cmd: >- crm configure ms - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} {{ rsc_saphanactl }} meta notify="true" @@ -113,6 +146,42 @@ maintenance="true" when: hana_clone | length == 0 +- name: Create HANA Filesystem resource + ansible.builtin.command: + cmd: >- + crm configure + primitive + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + ocf:suse:SAPHanaFilesystem + operations + $id="rsc_sap3_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" + op start interval="0" timeout="10" + op stop interval="0" timeout="20" + op monitor interval="120" timeout="120" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + ON_FAIL_ACTION="fence" + when: + - use_hana_sr_angi | bool + - hana_filesystem_resource | length == 0 + +- name: Create HANA Filesystem clone + ansible.builtin.command: + cmd: >- + crm configure + clone + cln_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + meta + clone-max="2" + clone-node-max="1" + target-role="Started" + interleave="true" + when: + - use_hana_sr_angi | bool + - hana_filesystem_clone | length == 0 + - name: Validate cluster IP vars: ip_regex: "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" @@ -165,7 +234,7 @@ col_saphana_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} 4000: g_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Started - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Master + {{ ms_saphanactl }}:Master when: ip_colo | length == 0 - name: Configure order @@ -175,9 +244,23 @@ ord_SAPHana_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} Optional: cln_SAPHanaTpg_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} when: cluster_order | length == 0 +- name: Ensure resource-stickiness is configured + ansible.builtin.command: + cmd: crm configure rsc_defaults resource-stickiness=1000 + when: resource_stickiness != '1000' + +- name: Ensure migration-threshold is configured + ansible.builtin.command: + cmd: crm configure rsc_defaults migration-threshold=5000 + when: migration_threshold != '5000' + +- name: Ensure maintenance mode is off + ansible.builtin.command: + cmd: crm maintenance off + - name: Wait for cluster to settle ansible.builtin.command: cmd: cs_wait_for_idle -s 5 @@ -193,15 +276,22 @@ ansible.builtin.command: cmd: cs_wait_for_idle -s 5 -- name: Ensure resource-stickiness is configured +# Get current maintenance state +- name: Refresh cluster status ansible.builtin.command: - cmd: crm configure rsc_defaults resource-stickiness=1000 - when: resource_stickiness != '1000' + cmd: crm configure show + register: refreshed_crm_conf_show + changed_when: false -- name: Ensure migration-threshold is configured +- name: Refresh crm facts + ansible.builtin.set_fact: + refreshed_crm_maintenance_mode: "{{ (refreshed_crm_conf_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" + changed_when: false + +- name: Ensure maintenance mode is disabled ansible.builtin.command: - cmd: crm configure rsc_defaults migration-threshold=5000 - when: migration_threshold != '1000' + cmd: crm maintenance off + when: refreshed_crm_maintenance_mode is true or refreshed_crm_maintenance_mode == 'unknown' # For debug purpose only - name: Get cluster status at the end diff --git a/ansible/playbooks/tasks/cluster-hana.yaml b/ansible/playbooks/tasks/cluster-hana.yaml index 7a0bee60..f282cf1a 100644 --- a/ansible/playbooks/tasks/cluster-hana.yaml +++ b/ansible/playbooks/tasks/cluster-hana.yaml @@ -8,12 +8,14 @@ - name: Set hana crm facts ansible.builtin.set_fact: - crm_maintainence_mode: "{{ (crm_conf_hana_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" + crm_maintenance_mode: "{{ (crm_conf_hana_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" stonith_timeout: "{{ crm_conf_hana_show.stdout | regex_search('stonith-timeout') }}" # this should be variable! hana_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_SAPHanaCtl_') }}" - hana_clone: "{{ crm_conf_hana_show.stdout | regex_search('ms msl_SAPHanaCtl_') }}" + hana_clone: "{{ crm_conf_hana_show.stdout | regex_search('ms ms(.)_SAPHanaCtl_') }}" hana_topology_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_SAPHanaTpg') }}" hana_topology_clone: "{{ crm_conf_hana_show.stdout | regex_search('clone cln_SAPHanaTpg') }}" + hana_filesystem_resource: "{{ crm_conf_show.stdout | regex_search('primitive rsc_SAPHanaFil_') }}" + hana_filesystem_clone: "{{ crm_conf_show.stdout | regex_search('primitive cln_SAPHanaFil_') }}" ip_resource: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_ip_') }}" ip_nc: "{{ crm_conf_hana_show.stdout | regex_search('primitive rsc_socat_') }}" ip_grp: "{{ crm_conf_hana_show.stdout | regex_search('group g_ip_') }}" @@ -22,10 +24,10 @@ when: is_primary changed_when: false -- name: Ensure maintainence mode is active +- name: Ensure maintenance mode is active ansible.builtin.command: - cmd: crm configure property maintenance-mode=true - when: crm_maintainence_mode is false or crm_maintainence_mode == 'unknown' + cmd: crm maintenance on + when: crm_maintenance_mode is false or crm_maintenance_mode == 'unknown' - name: Create HANA topology resource ansible.builtin.command: @@ -82,12 +84,38 @@ when: - is_primary - hana_resource | length == 0 + - not use_hana_sr_angi | bool + +- name: Create HANA angi resource + ansible.builtin.command: + cmd: >- + crm configure primitive + {{ rsc_saphanactl }} + ocf:suse:SAPHanaController + op start interval="0" timeout="3600" + op stop interval="0" timeout="3600" + op promote interval="0" timeout="900" + op demote interval="0" timeout="320" + op monitor interval="60" role="Promoted" timeout="700" + op monitor interval="61" role="Unpromoted" timeout="700" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + PREFER_SITE_TAKEOVER="true" + DUPLICATE_PRIMARY_TIMEOUT="7200" + AUTOMATED_REGISTER="false" + meta + priority="100" + when: + - is_primary + - hana_resource | length == 0 + - use_hana_sr_angi | bool - name: Create HANA resource clone ansible.builtin.command: cmd: >- crm configure ms - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} {{ rsc_saphanactl }} meta notify="true" @@ -99,6 +127,44 @@ - is_primary - hana_clone | length == 0 +- name: Create HANA Filesystem resource + ansible.builtin.command: + cmd: >- + crm configure primitive + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + ocf:suse:SAPHanaFilesystem + operations + $id="rsc_sap3_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}-operations" + op start interval="0" timeout="10" + op stop interval="0" timeout="20" + op monitor interval="120" timeout="120" + params + SID="{{ sap_hana_install_sid }}" + InstanceNumber="{{ sap_hana_install_instance_number }}" + ON_FAIL_ACTION="fence" + register: cmd_crm_chfr_output + changed_when: cmd_crm_chfr_output.rc != 0 + when: + - use_hana_sr_angi | bool + - hana_filesystem_resource | length == 0 + +- name: Create HANA Filesystem clone + ansible.builtin.command: + cmd: >- + crm configure clone + cln_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + rsc_SAPHanaFil_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + meta + clone-max="2" + clone-node-max="1" + target-role="Started" + interleave="true" + register: cmd_crm_chfc_output + changed_when: cmd_crm_chfc_output.rc != 0 + when: + - use_hana_sr_angi | bool + - hana_filesystem_clone | length == 0 + - name: Configure colocation [aws] ansible.builtin.command: cmd: >- @@ -106,7 +172,7 @@ col_saphana_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} 2000: rsc_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Started - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Master + {{ ms_saphanactl }}:Master when: - is_primary - ip_colo | length == 0 @@ -119,7 +185,7 @@ col_saphana_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} 4000: rsc_ip_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Started - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }}:Master + {{ ms_saphanactl }}:Master when: - is_primary - ip_colo | length == 0 @@ -135,7 +201,7 @@ ord_SAPHana Optional: cln_SAPHanaTpg_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} - msl_SAPHanaCtl_{{ sap_hana_install_sid }}_HDB{{ sap_hana_install_instance_number }} + {{ ms_saphanactl }} when: - is_primary - cluster_order | length == 0 @@ -148,21 +214,21 @@ register: refreshed_crm_conf_show changed_when: false -- name: Set crm facts +- name: Refresh crm facts ansible.builtin.set_fact: - refreshed_crm_maintainence_mode: "{{ (refreshed_crm_conf_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" + refreshed_crm_maintenance_mode: "{{ (refreshed_crm_conf_show.stdout | regex_search('maintenance-mode=([a-z]*)', '\\1'))[0] | default('unknown') }}" changed_when: false -- name: Ensure maintainence mode is disabled +- name: Ensure maintenance mode is disabled ansible.builtin.command: - cmd: crm configure property maintenance-mode=false + cmd: crm maintenance off when: - is_primary - - refreshed_crm_maintainence_mode is true or refreshed_crm_maintainence_mode == 'unknown' + - refreshed_crm_maintenance_mode is true or refreshed_crm_maintenance_mode == 'unknown' - name: Get cluster state ansible.builtin.command: - cmd: crm status + cmd: crm status full register: reg_crm_status when: is_primary