deploy/ansible/roles-sap/5.0.1-scs-ha-install/tasks/main.yaml (334 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# /*---------------------------------------------------------------------------8
# | |
# | SAP: Register BOM |
# | SAP SCS: deploy SCS Parameter file install template |
# | SAP SCS: Install |
# | |
# +------------------------------------4--------------------------------------*/
---
- name: "SCS HA Install: Set Python version {{ distribution_id }}"
ansible.builtin.set_fact:
python_version: "python2"
when: (ansible_distribution | lower ~ ansible_distribution_major_version) in ['sles_sap12']
- name: "SCS HA Install: Set BOM facts"
ansible.builtin.set_fact:
sap_inifile: "{{ bom_base_name }}-scsha-{{ ansible_hostname }}.params"
sap_inifile_template: "scsha-inifile-param.j2"
dir_params: "{{ tmp_directory }}/.{{ sid_to_be_deployed.sid | lower }}-params"
# 0x) Create hidden directory for parameter files
- name: "SCS HA Install: Create directories"
ansible.builtin.file:
path: "{{ item.path }}"
state: directory
mode: '{{ item.mode }}'
loop:
- { mode: '0755', path: '{{ dir_params }}' }
- { mode: '0755', path: '{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}' }
- { mode: '0755', path: '/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}' }
- name: "SCS HA Install: reset"
ansible.builtin.file:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_scs.txt"
state: absent
when: reinstall
- name: "SCS HA Install: check if installed"
ansible.builtin.stat:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_scs.txt"
register: scs_installed
when: node_tier == 'scs'
# Returns bom object
- name: "SCS HA Install: Register BoM"
ansible.builtin.include_role:
name: roles-sap/3.3.1-bom-utility
tasks_from: bom-register
vars:
bom_name: "{{ bom_base_name }}"
task_prefix: "SCS HA Install: "
sa_enabled: true
- name: "SCS HA Install: register variables"
ansible.builtin.set_fact:
scs_bom_id: "{{ bom.product_ids.scs_ha }}"
scs_bom_instance_type: "{% if bom.InstanceType is defined %}{{ bom.InstanceType }}{% else %}ABAP{% endif %}"
public: true
- name: "SCS Install: register additional variables"
ansible.builtin.set_fact:
installGateway: "{% if scs_bom_instance_type == 'ABAP' %}true{% else %}false{% endif %}"
- name: "SCS HA Install"
block:
- name: "SCS Install: check media exists"
ansible.builtin.stat:
path: "{{ target_media_location }}/SWPM/sapinst"
register: sapinst_found
- name: "ErrorHandling"
ansible.builtin.fail:
msg: "INSTALL:0003:Unable to find sapinst, please check that the installation media is mounted"
when: not sapinst_found.stat.exists
- name: "SCS HA Install: Template processing - Create ini file {{ sap_inifile }} from {{ sap_inifile_template }}"
ansible.builtin.template:
src: "{{ sap_inifile_template }}"
dest: "{{ dir_params }}/{{ sap_inifile }}"
mode: 0644
force: true
vars:
sap_scs_hostname: "{{ scs_virtual_hostname }}"
param_directory: "{{ dir_params }}"
set_ascsInstallGateway: "{{ installGateway | bool | lower }}"
set_ascsInstallWebDispatcher: "{{ ascsInstallWebDispatcher | default(false) | bool | lower }}"
- name: "SCS HA Install: check if installed"
ansible.builtin.debug:
msg: "SCS HA Install flag: {{ scs_installed }}"
verbosity: 2
- name: "SCS HA Install: install variables"
ansible.builtin.debug:
msg:
- "INIFILE: {{ sap_inifile }}"
- "PRODUCT ID: {{ bom.product_ids.scs_ha }}"
- "HOST: {{ scs_virtual_hostname }}"
verbosity: 2
- name: "SCS HA Install: SCS - Assign ownership"
ansible.builtin.file:
path: "{{ item.path }}"
owner: "{{ sid_to_be_deployed.sid | lower }}adm"
group: sapsys
recurse: true
state: directory
loop:
- { path: '/sapmnt/{{ sid_to_be_deployed.sid | upper }}' }
- { path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS' }
- { path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/{{ instance_type }}{{ scs_instance_number }}' }
- name: "SCS HA Install: SCS - comment out required message server ports in /etc/services"
ansible.builtin.replace:
path: /etc/services
regexp: '^([a-z\-]+\s+36{{ scs_instance_number }}/.*)$'
replace: '# \1'
backup: true
- name: "SCS HA Install: SCS - comment out required message server ports in /etc/services for JAVA"
ansible.builtin.replace:
path: /etc/services
regexp: '^([a-z\-]+\s+39{{ scs_instance_number }}/.*)$'
replace: '# \1'
backup: true
when: instance_type=='SCS'
- name: "SCS HA Install: SCS Second port for JAVA"
ansible.builtin.set_fact:
second_port: "{{ scs_instance_number | int }}"
- name: "SCS HA Install: SCS Second port for JAVA"
ansible.builtin.set_fact:
second_port_str: '{{ "%02d" | format(((second_port | int) + 1)) }}'
- name: "SCS HA Install: SCS - comment out required message server ports in /etc/services for JAVA"
ansible.builtin.replace:
path: /etc/services
regexp: '^([a-z\-]+\s+39{{ second_port_str }}/.*)$'
replace: '# \1'
backup: true
when: instance_type=='SCS'
# *====================================4=======================================8
# | SAP SCS: Install |
# | 2230669 - System Provisioning Using a Parameter Input File |
# *====================================4=======================================8
- name: "SCS HA Install: Create temp directory for sid"
ansible.builtin.file:
path: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}"
state: directory
mode: 0755
- name: "SCS HA Installation"
block:
- name: "SCS HA Install: Create Symlink"
ansible.builtin.import_tasks: ../../../roles-sap-os/2.10-sap-notes/tasks/2.10.3119751.yaml
when:
- ansible_os_family == 'RedHat'
- name: "SCS HA Install: Start"
ansible.builtin.debug:
msg: "Starting sapinst for {{ sid_to_be_deployed.sid | upper }}. Please wait"
- name: "SCS HA Install: SAPInst"
ansible.builtin.shell: |
umask {{ custom_umask | default('022') }} ;
./sapinst SAPINST_INPUT_PARAMETERS_URL={{ dir_params }}/{{ sap_inifile }} \
SAPINST_EXECUTE_PRODUCT_ID={{ bom.product_ids.scs_ha }} \
SAPINST_SKIP_DIALOGS=true \
SAPINST_START_GUISERVER=false \
SAPINST_USE_HOSTNAME={{ scs_virtual_hostname }} \
IS_HOST_LOCAL_USING_STRING_COMPARE=true
args:
chdir: "{{ target_media_location }}/SWPM"
creates: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_scs.txt"
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
TMPDIR: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}"
register: scs_installation
failed_when: scs_installation.rc > 0
when: node_tier == 'scs'
rescue:
# ToDO: cleanup file systems on failed install.
# until then we validate if certain files and folders exist and take
# actions based on them
- name: "RESCUE - SCS HA Install: Check '/usr/sap/<SAPSID>/SYS/exe/uc/linuxx86_64' exists"
ansible.builtin.stat:
path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64'
register: stat_sys_exe_uc
when: node_tier == 'scs'
- name: "RESCUE - SCS HA Install: Check '/usr/sap/<SAPSID>/SYS/exe/uc/linuxx86_64' is empty"
ansible.builtin.find:
path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64'
patterns: "*"
file_type: directory
register: find_sys_exe_uc_result
when:
- node_tier == 'scs'
- stat_sys_exe_uc.stat.exists
# At this stage the DIR_CT_RUN,'/usr/sap/<SAPSID>/SYS/exe/uc/linuxx86_64'
# is expected to be empty so we delete it.
# nw.directoryIsNotEmptyUnattended
- name: "RESCUE - SCS HA Install: Show installation result"
ansible.builtin.debug:
var: scs_installation
when: scs_installation is defined
- name: "RESCUE - SCS HA Install: Cleanup '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64'"
ansible.builtin.file:
path: "/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64"
state: absent
when:
- node_tier == 'scs'
- find_sys_exe_uc_result is defined
- find_sys_exe_uc_result | length > 0
- name: "RESCUE - SCS HA Install: SCS - Assign ownership"
ansible.builtin.file:
path: "{{ item.path }}"
owner: "{{ sid_to_be_deployed.sid | lower }}adm"
group: sapsys
recurse: true
state: directory
loop:
- { path: '/sapmnt/{{ sid_to_be_deployed.sid | upper }}' }
- { path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS' }
- { path: '/usr/sap/{{ sid_to_be_deployed.sid | upper }}/{{ instance_type }}{{ scs_instance_number }}' }
when: node_tier == 'scs'
# Add IS_HOST_LOCAL_USING_STRING_COMPARE=true to fix The host with the
# name <host> is not a valid virtual host on the local host
# SAP Note# 2279110
- name: "RESCUE - SCS HA Install: SAPINST"
ansible.builtin.shell: |
umask {{ custom_umask | default('022') }} ;
./sapinst SAPINST_INPUT_PARAMETERS_URL={{ dir_params }}/{{ sap_inifile }} \
SAPINST_EXECUTE_PRODUCT_ID={{ bom.product_ids.scs_ha }} \
SAPINST_SKIP_DIALOGS=true \
SAPINST_START_GUISERVER=false \
SAPINST_USE_HOSTNAME={{ scs_virtual_hostname }} \
IS_HOST_LOCAL_USING_STRING_COMPARE=true
args:
chdir: "{{ target_media_location }}/SWPM"
creates: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_scs.txt"
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
TMPDIR: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}"
register: scs_installation
failed_when: scs_installation.rc > 0
when: node_tier == 'scs'
- name: "SCS HA Install: Installation failure results"
block:
- name: "SCS HA Install: Installation results (debug)"
ansible.builtin.debug:
var: scs_installation
verbosity: 2
- name: "SCS HA Install: Save installation results"
ansible.builtin.set_fact:
scs_installation_succeeded: false
- name: "SCS HA Install: Installation results"
ansible.builtin.fail:
msg: SCS HA installation failed"
when: scs_installation.rc > 0
- name: "SCS HA Install: Installation results"
block:
- name: "SCS HA Install: Installation results"
ansible.builtin.debug:
msg: "SCS HA Installation succeeded"
- name: "SCS HA Install: Save installation results"
ansible.builtin.set_fact:
scs_installation_succeeded: true
- name: "SCS HA Install: Cleanup ini file {{ ansible_hostname }}"
ansible.builtin.file:
path: "{{ dir_params }}/{{ sap_inifile }}"
state: absent
- name: "SCS HA Install: flag"
ansible.builtin.file:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_scs.txt"
state: touch
mode: 0755
when: scs_installation.rc == 0
when:
- node_tier == 'scs'
- not scs_installed.stat.exists
- name: "SCS Install status"
block:
- name: "SCS HA Install: Status"
ansible.builtin.debug:
msg: "SCS is already installed"
- name: "SCS HA Install: return value"
ansible.builtin.set_fact:
scs_already_installed: true
when:
- node_tier == 'scs'
- scs_installed.stat.exists
- name: "SCS HA Install: ENSA1 set defaults"
ansible.builtin.set_fact:
ensa1: false
when: ensa1 is not defined
- name: "SCS HA Install: ENSA2 set defaults"
ansible.builtin.set_fact:
ensa2: false
when: ensa2 is not defined
- name: "SCS HA Install: Enqueue Server Setup"
block:
- name: "SCSERS - Get the variable to determine ENSA version"
become_user: "{{ sid_to_be_deployed.sid | lower }}adm"
become: true
ansible.builtin.shell: "{{ sapcontrolscs_command }} -host {{ scs_virtual_hostname }} -function GetProcessList"
environment:
PATH: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64:/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/run:/home/{{ sid_to_be_deployed.sid | lower }}adm
DIR_LIBRARY: /usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/run
LD_LIBRARY_PATH: /usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/run:/usr/sap/{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
vars:
allow_world_readable_tmpfiles: true
ansible_python_interpreter: "{{ python_version }}"
register: enq_server
failed_when: enq_server.rc > 3
changed_when: false
# enserver, EnqueueServer
- name: "SCS HA Install: Is ENSA1"
ansible.builtin.set_fact:
ensa1: "{{ enq_server.stdout_lines | select('search', 'enserver') | length > 0 }}"
# logic added to identify java based installations
- name: "SCS HA Install: Is ENSA1 - JAVA"
ansible.builtin.set_fact:
ensa1: "{{ enq_server.stdout_lines | select('search', 'enrepserver') | length > 0 }}"
when:
- not ensa1
# enq_server, Enqueue Server 2
- name: "SCS HA Install: Is ENSA2"
ansible.builtin.set_fact:
ensa2: "{{ enq_server.stdout_lines | select('search', 'enq_server') | length > 0 }}"
- name: "SCS HA Install: Print the value of ENSA1/ENSA2"
ansible.builtin.debug:
msg:
- "ENSA1: {{ ensa1 }}"
- "ENSA2: {{ ensa2 }}"
rescue:
- name: "SCS HA Install: Set default to ENSA2 for HANA if message server is down"
ansible.builtin.set_fact:
ensa2: true
when: platform == 'HANA'
- name: "SCS HA Install: Set default to ENSA1 for AnyDB if message server is down"
ansible.builtin.set_fact:
ensa1: true
when: platform != 'HANA'
when:
- inventory_hostname == primary_instance_name
- name: "SCS HA Install: Set default to ENSA2 for HANA if message server is down"
ansible.builtin.set_fact:
ensa2: true
when:
- platform == 'HANA'
- scs_bom_instance_type == 'ABAP'
- not ensa1
- not ensa2
- inventory_hostname == primary_instance_name
- name: "SCS HA Install: Set default to ENSA for HANA (JAVA) if message server is down"
ansible.builtin.set_fact:
ensa1: true
when:
- platform == 'HANA'
- scs_bom_instance_type == 'JAVA'
- not ensa1
- not ensa2
- inventory_hostname == primary_instance_name
- name: "SCS HA Install: Set default to ENSA1 for AnyDB if message server is down"
ansible.builtin.set_fact:
ensa1: true
when:
- platform != 'HANA'
- not ensa1
- not ensa2
- inventory_hostname == primary_instance_name
- name: "SCS HA Install: Print the value of ENSA1/ENSA2"
ansible.builtin.debug:
msg:
- "ENSA1: {{ ensa1 }}"
- "ENSA2: {{ ensa2 }}"
...
# /*---------------------------------------------------------------------------8
# | END |
# +------------------------------------4--------------------------------------*/