deploy/ansible/roles-sap/5.1-dbload/tasks/main.yaml (424 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# /*---------------------------------------------------------------------------8
# | |
# | SAP: Register BOM |
# | SAP DBLOAD: deploy DBLOAD Parameter file install template |
# | SAP DBLOAD: Install |
# | |
# +------------------------------------4--------------------------------------*/
---
- name: "DBLoad: - Set dbload facts"
ansible.builtin.set_fact:
sap_inifile: "{{ bom_base_name }}-dbload-{{ sid_to_be_deployed.sid | lower }}-{{ ansible_hostname }}.params"
sap_inifile_template: "dbload-inifile-param.j2"
dir_params: "{{ tmp_directory }}/.params"
pas_virtual_hostname: "{{ custom_pas_virtual_hostname | default(virtual_host, true) }}"
- name: "DBLoad: - 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/{{ sap_sid | upper }}' }
- name: "DBLoad: - reset"
ansible.builtin.file:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_dbload.txt"
state: absent
when: reinstall
# Returns bom object
- name: "DBLoad: - 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: "DBLoad: "
sa_enabled: true
- name: "DBLoad: Default instance type"
ansible.builtin.set_fact:
instance_type: "ASCS"
when: bom.InstanceType is not defined
- name: "DBLoad: register instance type"
ansible.builtin.set_fact:
instance_type: >-
{%- set _instance_type = 'ASCS' -%}
{%- if bom.InstanceType == 'JAVA' -%}
{%- set _instance_type = 'SCS' -%}
{%- elif bom.InstanceType == 'ABAP' -%}
{%- set _instance_type = 'ASCS' -%}
{%- else -%}
{%- set _instance_type = 'ASCS' -%}
{%- endif -%}
{{- _instance_type -}}
public: true
when: bom.InstanceType is defined
- name: "DBLoad: register application type"
ansible.builtin.set_fact:
application_type: "{% if instance_type == 'SCS' %}JAVA{% else %}ABAP{% endif %}"
- name: "DBLoad: - Set the product ID"
ansible.builtin.set_fact:
product_id: "{{ bom.product_ids.dbl }}"
- name: "DBLoad: - Set dbload path"
ansible.builtin.set_fact:
db_load_path: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}/sapinst_instdir/{{ product_id.replace('.', '/').replace('/' + application_type, '').split(':')[1] }}/INSTALL/DISTRIBUTED/{{ application_type }}/DB"
- name: "DBLoad: Check if DBLoad has been tried on this server"
ansible.builtin.stat:
path: "{{ db_load_path }}"
register: dbload_performed
- name: "DBLoad Install: Set Schema Name"
when:
- platform == "HANA"
ansible.builtin.include_role:
name: "roles-db/4.0.4-hdb-schema"
public: true
- name: "DBLoad: Check if install is performed"
block:
- name: "DBLoad: Find the installationSuccesfullyFinished.dat (SAPINST)"
ansible.builtin.find:
paths: "{{ db_load_path }}"
file_type: file
patterns: 'installationSuccesfullyFinished.dat'
recurse: false
register: dbload_performed_according_to_sapinst
- name: "DBLoad: show"
ansible.builtin.debug:
var: dbload_performed_according_to_sapinst
verbosity: 2
when: dbload_performed.stat.exists
- name: "DBLoad: flag"
ansible.builtin.file:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_dbload.txt"
state: touch
mode: 0755
when:
- dbload_performed_according_to_sapinst is defined
- dbload_performed_according_to_sapinst.matched == 1
when:
- dbload_performed.stat.exists
- name: "DBLoad: - check if DBLoad is performed for {{ sid_to_be_deployed.sid | upper }}"
ansible.builtin.stat:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_dbload.txt"
register: dbload_installed
- name: "DBLoad: register variables"
ansible.builtin.set_fact:
dbl_bom_instance_type: "{% if bom.InstanceType is defined %}{{ bom.InstanceType }}{% else %}ABAP{% endif %}"
public: true
# *====================================4=======================================8
# SAP DBLOAD: Install
# 2230669 - System Provisioning Using a Parameter Input File
#
# *====================================4=======================================8
- name: "DBLoad: - Run"
block:
- name: "DBLoad: - Set the SCS Server name list"
ansible.builtin.set_fact:
scs_server_temp: "{{ scs_server_temp | default([]) + [item] }}"
with_items:
- "{{ query('inventory_hostnames', '{{ sap_sid | upper }}_SCS') }}"
- "{{ query('inventory_hostnames', '{{ sap_sid | upper }}_DB') }}"
- name: "DBLoad: - Set the DB Server name list"
ansible.builtin.set_fact:
db_server_temp: "{{ db_server_temp | default([]) + [item] }}"
with_items:
- "{{ query('inventory_hostnames', '{{ sid_to_be_deployed.sid | upper }}_DB') }}"
- name: "Backward Compatibility - Check required Database HA variables"
ansible.builtin.set_fact:
database_high_availability: "{{ db_high_availability | default(false) }}"
when:
- db_high_availability is defined
- database_high_availability is not defined
- name: "DBLoad: Calculate virtual host name when running scale out"
ansible.builtin.set_fact:
db_virtualhost_temp: >-
{%- set _host_name = hostvars[db_server_temp | first]['virtual_host'] -%}
{%- if database_scale_out and not database_high_availability -%}
{%- set _host_name = sap_sid | lower ~ db_sid | lower ~ 'db' ~ db_instance_number ~ 'so' -%}
{%- endif -%}
{{- _host_name -}}
- name: "DBLoad: Display temporary database virtual host name"
ansible.builtin.debug:
msg: "DB Virtual Host: {{ db_virtualhost_temp }}"
- name: "DBLoad: - Set the server facts"
ansible.builtin.set_fact:
scs_server: "{% if scs_high_availability %}{{ sid_to_be_deployed.sid | lower }}scs{{ scs_instance_number }}cl1{% else %}{{ hostvars[scs_server_temp | first]['virtual_host'] }}{% endif %}"
db_virtual_hostname: "{{ db_virtualhost_temp | default(hostvars[db_server_temp | first]['virtual_host'], true) }}"
- name: "DBLoad: Display database virtual host name"
ansible.builtin.debug:
msg: "DB Virtual Host: {{ db_virtual_hostname }}"
- name: "DBLoad: check media exists"
ansible.builtin.stat:
path: "{{ target_media_location }}/SWPM/sapinst"
register: sapinst_found
- name: "ErrorHandling"
ansible.builtin.fail:
msg: "INSTALL:0005:Unable to find sapinst, please check that the installation media is mounted"
when: not sapinst_found.stat.exists
- name: "DBLoad: - DB Server name list"
ansible.builtin.set_fact:
db_server: "{{ db_server | default([]) + [item] }}"
with_items:
- "{{ query('inventory_hostnames', '{{ sap_sid | upper }}_DB') }}"
- name: "DBLoad: - Check if the backup disk exists on DB Server"
ansible.builtin.set_fact:
backupdisks_count: >-
{{ disks | selectattr('host', 'defined') |
selectattr('host', 'equalto', db_server[0]) |
selectattr('type', 'equalto', 'backup') |
map(attribute='type') | sort | unique |
list | length | int }}
- name: "DBLoad: - Set the hana backup facts"
ansible.builtin.set_fact:
backup_path: "{% if (backupdisks_count | int) == 0 %}/hana/data/backup{% else %}{{ hana_backup_path }}{% endif %}"
- name: "Hana backup directory"
ansible.builtin.debug:
msg:
- "DB Server: {{ db_server[0] }}"
- "Backup disk count: {{ backupdisks_count | int }}"
- "HANA Backup path: {{ hana_backup_path }}"
- "Backup path: {{ backup_path }}"
- name: "DBLoad: - 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:
hana_backup_path: "{{ backup_path }}"
hana_schema: "{% if schema_name is defined %}{{ schema_name }}{% else %}omit{% endif %}"
param_directory: "{{ dir_params }}"
sap_db_hostname: "{{ custom_db_virtual_hostname | default(db_virtual_hostname, true) }}"
sap_profile_dir: "/sapmnt/{{ sid_to_be_deployed.sid | upper }}/profile"
sap_scs_hostname: "{{ custom_scs_virtual_hostname | default(scs_server, true) }}"
sap_sid: "{{ sid_to_be_deployed.sid }}"
sidadm_uid: "{{ sid_to_be_deployed.sidadm_uid }}"
- name: "DBLoad: Get ini file"
ansible.builtin.slurp:
src: "{{ dir_params }}/{{ sap_inifile }}"
register: profilefile
- name: "DBLoad: Inifile"
ansible.builtin.debug:
msg: "{{ profilefile['content'] | b64decode }}"
verbosity: 4
- name: "DBLoad: install variables"
ansible.builtin.debug:
msg:
- "INSTALLED: {{ dbload_installed.stat.exists }}"
- "INIFILE: {{ sap_inifile }}"
- "PRODUCT ID: {{ product_id }}"
- "INSTANCE: {{ db_instance_number }}"
- "SCSHOST: {{ custom_scs_virtual_hostname | default(scs_server, true) }}"
- "DBHOST: {{ custom_db_virtual_hostname | default(db_virtual_hostname, true) }}"
- "SID: {{ sid_to_be_deployed.sid | upper }}"
# Import this task only if the tier is ora.
- name: "DBLoad: import oracle tasks"
ansible.builtin.import_tasks: oracle.yaml
when:
- node_tier == "oracle-multi-sid"
- name: "Create temp directory for sid"
ansible.builtin.file:
path: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}"
state: directory
mode: 0755
- name: "DBLoad: progress"
ansible.builtin.debug:
msg: "Starting DBLoad for {{ sid_to_be_deployed.sid | upper }}. Please wait"
- name: "DBLoad: - run SAPInst"
ansible.builtin.shell: |
umask {{ custom_umask | default('022') }} ;
./sapinst SAPINST_INPUT_PARAMETERS_URL={{ dir_params }}/{{ sap_inifile }} \
SAPINST_EXECUTE_PRODUCT_ID={{ product_id }} \
SAPINST_SKIP_DIALOGS=true \
SAPINST_START_GUISERVER=false
args:
chdir: "{{ target_media_location }}/SWPM"
creates: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_dbload.txt"
environment:
TMPDIR: "{{ tmp_directory }}/{{ sid_to_be_deployed.sid | upper }}"
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
register: dbload_results
async: 7200
poll: 0
- name: "DBLoad Install -Wait for asynchronous job to end and rescue"
block:
- name: "DBLoad Install -Wait for asynchronous job to end"
ansible.builtin.async_status:
jid: "{{ dbload_results.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: "{% if dbload_retry_count is defined %}{{ dbload_retry_count }}{% else %}120{% endif %}"
delay: 60
when: dbload_results.ansible_job_id is defined
rescue:
- name: "Capturing the modified message for message server being offline"
ansible.builtin.set_fact:
modified_error_message: "{{ job_result.stdout | try_get_error_code(task_tag='dbload', failure='messageserver_offline') }}"
- name: "Capturing the modified message for database being offline"
ansible.builtin.set_fact:
modified_error_message: "{{ modified_error_message | try_get_error_code(task_tag='dbload', failure='db_offline') }}"
- name: "Debug: Modified error message"
ansible.builtin.debug:
msg: "Modified error message: {{ modified_error_message }}"
when: modified_error_message != job_result.stdout
- name: "Error Handling: Fail with the modified error message "
ansible.builtin.fail:
msg: "{{ modified_error_message }}"
- name: "DBLoad: Results"
ansible.builtin.debug:
msg:
- "DBLoad : {{ dbload_results }}"
- "Job result: {{ job_result }}"
- name: "DBLoad: Results"
ansible.builtin.debug:
var: dbload_results
when:
- job_result is defined
- job_result.rc > 0
- name: "DBLoad: Cleanup ini file {{ ansible_hostname }}"
ansible.builtin.file:
path: "{{ dir_params }}/{{ sap_inifile }}"
state: absent
- name: "DBLoad: - set completion flag"
ansible.builtin.file:
path: "/etc/sap_deployment_automation/{{ sid_to_be_deployed.sid | upper }}/sap_deployment_dbload.txt"
state: touch
mode: 0755
when:
- job_result.rc is defined
- job_result.rc == 0
- name: "DBLoad: results"
ansible.builtin.debug:
msg: "DBLoad succeeded"
when:
- job_result.rc is defined
- job_result.rc == 0
# # Import this task only if the tier is ora.
# - import_tasks: "oracle-postprocessing.yaml"
# when:
# - node_tier in ["oracle","oracle-asm"]
- name: "DBLoad Install: Set Schema Name"
when:
- platform == "HANA"
ansible.builtin.include_role:
name: "roles-db/4.0.4-hdb-schema"
public: true
- name: "Backward Compatibility - Check required Database HA variables"
ansible.builtin.set_fact:
database_high_availability: "{{ db_high_availability | default(false) }}"
when:
- db_high_availability is defined
- database_high_availability is not defined
- name: "DBLoad: Get hdbuserstore path"
become: true
become_user: "root"
when:
- database_high_availability
- platform == 'HANA'
ansible.builtin.find:
paths: "/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64/hdbclient/,/usr/sap/{{ sid_to_be_deployed.sid }}/hdbclient"
file_type: file
patterns: 'hdbuserstore'
recurse: true
register: hdbuserstore_file
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
vars:
allow_world_readable_tmpfiles: true
- name: "DBLoad: Set hdbuserstore path"
when:
- database_high_availability
- platform == 'HANA'
- hdbuserstore_file is defined
- hdbuserstore_file | length > 0
ansible.builtin.set_fact:
hdbuserstore_path: "{{ hdbuserstore_file.files[0].path }}"
db_lb_virtual_host: "{{ sid_to_be_deployed.sid | lower }}{{ db_sid | lower }}db{{ db_instance_number }}cl.{{ sap_fqdn }}"
- name: "DBLoad: show hdbuserstore path"
when:
- database_high_availability
- platform == 'HANA'
ansible.builtin.debug:
var: hdbuserstore_path
verbosity: 2
- name: "DBLoad: Set DB Virtual Host name ({{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }})"
become: true
become_user: "{{ sid_to_be_deployed.sid | lower }}adm"
when:
- database_high_availability
- platform == 'HANA'
- hdbuserstore_path is defined
ansible.builtin.shell: |
{{ hdbuserstore_path }} -H {{ pas_virtual_hostname }} SET DEFAULT {{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }}:3{{ db_instance_number }}13@{{ db_sid | upper }} {{ schema_name }} {{ main_password }}
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
TMPDIR: "{{ hdbuserstore_path }}"
ssfs_connect: "1"
register: hdbuserstore
vars:
allow_world_readable_tmpfiles: true
- name: "DBLoad: Set DB Virtual Host name ({{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }})"
become: true
become_user: "root"
when:
- database_high_availability
- platform == 'HANA'
- hdbuserstore_path is defined
ansible.builtin.shell: |
{{ hdbuserstore_path }} SET DEFAULT {{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }}:3{{ db_instance_number }}13@{{ db_sid | upper }} {{ schema_name }} {{ main_password }}
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
TMPDIR: "{{ hdbuserstore_path }}"
ssfs_connect: "1"
register: hdbuserstore
vars:
allow_world_readable_tmpfiles: true
when:
- not dbload_installed.stat.exists
# Import this task only if the tier is ora.
- name: "Oracle post processing"
ansible.builtin.import_tasks: "oracle-postprocessing.yaml"
when:
- node_tier in ["oracle","oracle-asm"]
- name: "DBLoad: - status"
when: dbload_installed.stat.exists
block:
- name: "DBLoad: - status"
ansible.builtin.debug:
msg: "DBLoad is already performed ({{ sid_to_be_deployed.sid | upper }})"
- name: "DBLoad: - return value"
ansible.builtin.set_fact:
dbload_already_performed: true
- name: "Backward Compatibility - Check required Database HA variables"
ansible.builtin.set_fact:
database_high_availability: "{{ db_high_availability | default(false) }}"
when:
- db_high_availability is defined
- database_high_availability is not defined
- name: "DBLoad: Get hdbuserstore path"
become: true
become_user: "root"
when:
- database_high_availability
- platform == 'HANA'
ansible.builtin.find:
paths: "/usr/sap/{{ sid_to_be_deployed.sid | upper }}/SYS/exe/uc/linuxx86_64/hdbclient/,/usr/sap/{{ sid_to_be_deployed.sid }}/hdbclient"
file_type: file
patterns: 'hdbuserstore'
recurse: true
register: hdbuserstore_file
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
- name: "DBLoad: Set hdbuserstore path"
when:
- database_high_availability
- platform == 'HANA'
- hdbuserstore_file is defined
- hdbuserstore_file | length > 0
ansible.builtin.set_fact:
hdbuserstore_path: "{{ hdbuserstore_file.files[0].path }}"
db_lb_virtual_host: "{{ sid_to_be_deployed.sid | lower }}{{ db_sid | lower }}db{{ db_instance_number }}cl.{{ sap_fqdn }}"
- name: "DBLoad: show hdbuserstore path"
when:
- database_high_availability
- platform == 'HANA'
ansible.builtin.debug:
var: hdbuserstore_path
verbosity: 2
- name: "DBLoad: Set DB Virtual Host name ({{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }})"
become: true
become_user: "root"
when:
- database_high_availability
- platform == 'HANA'
- hdbuserstore_path is defined
ansible.builtin.shell: |
{{ hdbuserstore_path }} -H {{ pas_virtual_hostname }} SET DEFAULT {{ custom_db_virtual_hostname | default(db_lb_virtual_host, true) }}:3{{ db_instance_number }}13@{{ db_sid | upper }} {{ hana_schema }} {{ main_password }}
environment:
SAPSYSTEMNAME: "{{ sid_to_be_deployed.sid | upper }}"
TMPDIR: "{{ hdbuserstore_path }}"
ssfs_connect: "1"
register: hdbuserstore
vars:
allow_world_readable_tmpfiles: true
...
# /*---------------------------------------------------------------------------8
# | END |
# +------------------------------------4--------------------------------------*/