deploy/ansible/playbook_05_02_sap_pas_install.yaml (336 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. --- # /*---------------------------------------------------------------------------8 # | | # | Prepare for SAP PAS Install | # | | # +------------------------------------4--------------------------------------*/ - hosts: localhost name: "PAS Installation Playbook: - Initialization" gather_facts: true vars_files: - vars/ansible-input-api.yaml # API Input template with defaults tasks: - name: "PAS Installation Playbook: - Create Progress folder" ansible.builtin.file: path: "{{ _workspace_directory }}/.progress" state: directory mode: 0755 - name: "PAS Installation Playbook: - Remove pas-install-done flag" ansible.builtin.file: path: "{{ _workspace_directory }}/.progress/pas-install-done" state: absent - name: "PAS Installation Playbook: - Set pas fact" ansible.builtin.set_fact: tier: pas - name: "PAS Installation Playbook: - Read/Create passwords" ansible.builtin.include_role: name: roles-misc/0.1-passwords public: true tags: - 0.1-passwords - name: "OS configuration playbook: - Read password" ansible.builtin.include_role: name: roles-misc/0.1-passwords tasks_from: windows.yaml public: true when: platform == "SQLSERVER" tags: - 0.1-win-passwords - name: "PAS Installation Playbook: - Read/Create key vault secrets" ansible.builtin.include_role: name: roles-misc/0.2-kv-secrets public: true vars: operation: fencing tags: - 0.2-kv-secrets - name: "PAS Installation Playbook: - Read storage account details" ansible.builtin.include_role: name: roles-misc/0.3.sap-installation-media-storage-details public: true vars: tier: pas tags: - kv-sap-installation-media-storage-details # /*---------------------------------------------------------------------------8 # | | # | Playbook for SAP OS USERS and Groups Creation | # | | # +------------------------------------4--------------------------------------*/ - hosts: "{{ sap_sid | upper }}_PAS" name: SAP Generic OS Groups and User Creation serial: 1 remote_user: "{{ orchestration_ansible_user }}" gather_facts: true # Important to collect hostvars information vars_files: - vars/ansible-input-api.yaml # API Input template with defaults tasks: - name: "PAS Installation Playbook: Define this SID" ansible.builtin.set_fact: this_sid: { 'sid': '{{ sap_sid | upper }}', 'dbsid_uid': '{{ hdbadm_uid }}', 'sidadm_uid': '{{ UIDs[ platform ].uid }}', 'ascs_inst_no': '{{ scs_instance_number }}', 'pas_inst_no': '{{ pas_instance_number }}', 'app_inst_no': '{{ app_instance_number }}' } - name: "PAS Installation Playbook: - Set 'pas' tier facts" ansible.builtin.set_fact: all_sids: "{% if MULTI_SIDS is defined %}{{ MULTI_SIDS }}{% else %}{{ all_sids | default([]) + [this_sid] }}{% endif %}" - name: "Generic Users and Groups for SAP Installation" ansible.builtin.include_role: name: roles-sap-os/2.5-sap-users tasks_from: user_nw.yaml apply: tags: - 2.5-sap-users become: true become_user: root vars: scs_instance_number: "{{ sid_to_be_deployed.ascs_inst_no }}" tier: generic main_password: "{{ hostvars.localhost.sap_password }}" sapbits_location_base_path: "{{ hostvars.localhost.sapbits_location_base_path }}" sapbits_sas_token: "{{ hostvars.localhost.sapbits_sas_token }}" loop: "{{ all_sids }}" loop_control: loop_var: sid_to_be_deployed when: - ansible_os_family != "Windows" tags: - 2.5-sap-users # /*---------------------------------------------------------------------------8 # | | # | Playbook for SAP PAS Install | # | | # +------------------------------------4--------------------------------------*/ - hosts: "{{ sap_sid | upper }}_PAS : {{ sap_sid | upper }}_SCS : {{ sap_sid | upper }}_DB" name: "PAS Installation Playbook" remote_user: "{{ orchestration_ansible_user }}" gather_facts: true # Important to collect hostvars information vars_files: - vars/ansible-input-api.yaml # API Input template with defaults # -------------------------------------+---------------------------------------8 # # Build the list of tasks to be executed in order here. # # -------------------------------------+---------------------------------------8 tasks: - name: "PAS Installation Playbook: - Set 'pas' tier facts" ansible.builtin.set_fact: tier: pas main_password: "{{ hostvars.localhost.sap_password }}" sapbits_location_base_path: "{{ hostvars.localhost.sapbits_location_base_path }}" sapbits_sas_token: "{{ hostvars.localhost.sapbits_sas_token }}" pas_file_path: INSTALL/DISTRIBUTED/ABAP/APP1 always_upload_jinja_templates: false sa_enabled: true tags: - always - name: "PAS Installation Playbook: Define this SID" ansible.builtin.set_fact: this_sid: { 'sid': '{{ sap_sid | upper }}', 'dbsid_uid': '{{ hdbadm_uid }}', 'sidadm_uid': '{{ UIDs[ platform ].uid }}', 'ascs_inst_no': '{{ scs_instance_number }}', 'pas_inst_no': '{{ pas_instance_number }}', 'app_inst_no': '{{ app_instance_number }}' } - name: "PAS Installation Playbook: Define list of SIDs" ansible.builtin.set_fact: all_sids: "{% if MULTI_SIDS is defined %}{{ MULTI_SIDS }}{% else %}{{ all_sids | default([]) + [this_sid] }}{% endif %}" when: - "'pas' in supported_tiers" # -------------------------------------+---------------------------------------8 # Role: 5.2-PAS Installation # # Description: # # -------------------------------------+---------------------------------------8 - name: "PAS Installation Playbook: - Run PAS Installation on Linux" when: - "'pas' in supported_tiers" - ansible_os_family != "Windows" become: true block: - name: "PAS Installation Playbook: - Assertions" block: - name: "PAS Installation Playbook: - Show instance numbers" ansible.builtin.debug: msg: - "pas_instance_number: {{ pas_instance_number }}" - "scs_instance_number: {{ scs_instance_number }}" - name: "PAS Installation Playbook: - Assert instance numbers" ansible.builtin.assert: that: - "pas_instance_number is defined" - "scs_instance_number != pas_instance_number" fail_msg: "Please ensure that the scs_instance_number is different from the pas_instance_number" when: (ansible_play_hosts_all | length) <= 2 - name: Run the PAS installation Playbook block: - 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: "PAS Installation playbook: - Determine if part of high availablity deployment" ansible.builtin.set_fact: is_ha: "{{ database_high_availability | default(false) }}" tags: - always - name: "PAS Installation playbook: - Ensure the kernel parameters are set" ansible.builtin.include_role: name: roles-os/1.9-kernelparameters when: is_ha tags: - 1.9-kernelparameters - name: "PAS Installation Playbook - Install: Include 2.6-sap-mounts role" ansible.builtin.include_role: name: roles-sap-os/2.6-sap-mounts tags: - 2.6-sap-mounts - name: "PAS Installation Playbook: - Install SAPInst" ansible.builtin.include_role: name: roles-sap/5.2-pas-install vars: instance_number: "{% if pas_instance_number is defined %}{{ pas_instance_number }}{% else %}00{% endif %}" loop: "{{ all_sids }}" loop_control: loop_var: sid_to_be_deployed - name: "PAS Installation Playbook: - Create pas-install-done flag" delegate_to: localhost become: false ansible.builtin.file: path: "{{ _workspace_directory }}/.progress/pas-install-done" state: touch mode: 0755 when: - pas_already_installed is defined or (pas_installation.rc is defined and pas_installation.rc == 0) always: - name: "PAS Installation Playbook: - Get the Error lines from installation output" ansible.builtin.set_fact: error_lines: "{{ error_lines | default([]) + [item] }}" with_items: "{{ pas_installation.stdout_lines }}" when: - pas_installation.stdout_lines is defined - '"ERROR" in item' - name: "PAS Installation Playbook: - Run post installation routines" ansible.builtin.include_role: name: roles-sap/7.0.0-post-install vars: suffix: "_PAS" prefix: "{{ bom.product_ids.pas.replace('.', '/').replace('/ABAP', '').replace('/PD', '').split(':')[1] }}" path: 'INSTALL/DISTRIBUTED/{{ pas_bom_instance_type }}/APP1' tier: 'pas' this_sid: "{{ sid_to_be_deployed.sid | upper }}" work_log_component_name: "D{{ pas_instance_number }}" loop: "{{ all_sids }}" loop_control: loop_var: sid_to_be_deployed - name: "PAS Installation Playbook: - Show errors from PAS installation" ansible.builtin.debug: msg: "{{ error_lines }}" when: - error_lines is defined tags: - 5.2-pas-install - name: "PAS Installation Playbook: - Run PAS Installation on Windows" when: - "'pas' in supported_tiers" - ansible_os_family == "Windows" block: - name: "PAS Installation Playbook: - Assertions" block: - name: "PAS Installation Playbook: - Show instance numbers" ansible.builtin.debug: msg: - "pas_instance_number: {{ pas_instance_number }}" - "scs_instance_number: {{ scs_instance_number }}" - "{{ ansible_play_hosts_all | length }} hosts in inventory" - name: "PAS Installation Playbook: - Assert instance numbers" ansible.builtin.assert: that: - "pas_instance_number is defined" - "scs_instance_number != pas_instance_number" fail_msg: "Please ensure that the scs_instance_number is different from the pas_instance_number" when: (ansible_play_hosts_all | length) <= 2 - name: "PAS Installation Playbook: - Ensure Sharing Data Folder" ansible.builtin.include_role: name: roles-sap-os/windows/2.3-sap-exports tags: - 2.3-sap-exports vars: winadm_password: "{{ hostvars.localhost.winadm_password }}" domain_service_password: "{{ hostvars.localhost.adsvc_password }}" domain_service_account: "{{ hostvars.localhost.adsvc_account }}" domain_user_password: "{{ hostvars.localhost.winadm_password }}" sql_svc_account: "{% if hostvars.localhost.sqlsvc_account is defined %}{{ hostvars.localhost.sqlsvc_account }}{% else %}{{ win_sql_svc_account }}{% endif %}" tier: app_tier - name: Run the PAS installation Playbook block: - name: "PAS Installation - Add packages" ansible.builtin.include_role: name: roles-os/windows/1.4-packages tags: - 1.4-packages vars: winadm_password: "{{ hostvars.localhost.winadm_password }}" domain_service_password: "{{ hostvars.localhost.adsvc_password }}" domain_service_account: "{{ hostvars.localhost.adsvc_account }}" domain_user_password: "{{ hostvars.localhost.winadm_password }}" tier: app_tier - name: "PAS Installation Playbook: - Install using SAPInst" ansible.builtin.include_role: name: roles-sap/windows/5.2-pas-install vars: instance_number: "{% if pas_instance_number is defined %}{{ pas_instance_number }}{% else %}00{% endif %}" domain_user_password: "{{ hostvars.localhost.winadm_password }}" svc_password: "{{ hostvars.localhost.svcadm_password }}" loop: "{{ all_sids }}" loop_control: loop_var: sid_to_be_deployed - name: "PAS Installation Playbook: - Create pas-install-done flag" delegate_to: localhost become: false ansible.builtin.file: path: "{{ _workspace_directory }}/.progress/pas-install-done" state: touch mode: 0755 when: - pas_already_installed is defined or (pas_installation.rc is defined and pas_installation.rc == 0) always: - name: "PAS Installation Playbook: - Get the Error lines from installation output" ansible.builtin.set_fact: error_lines: "{{ error_lines | default([]) + [item] }}" with_items: "{{ pas_installation.stdout_lines }}" when: - pas_installation.stdout_lines is defined - '"ERROR" in item' - pas_installation.rc > 0 - name: "PAS Installation Playbook: - Run post installation routines" ansible.builtin.include_role: name: roles-sap/windows/7.0.0-post-install vars: suffix: "_PAS" tier: 'pas' - name: "PAS Installation Playbook: - Show errors from PAS installation" ansible.builtin.debug: msg: "{{ error_lines }}" when: - error_lines is defined - name: "SCS Install: Rename sapinst_logs Folder with TimeStamp" ansible.windows.win_shell: | Rename-Item -Path .\sapinst_logs -NewName "sapinst_logs_$(get-date -f yyyy_MM_dd_HH_mm_ss)" args: chdir: '{{ log_dir_windows }}' removes: '{{ log_dir_windows }}\sapinst_logs' register: sapinst_log_name failed_when: sapinst_log_name.rc > 0 when: - ansible_os_family == "Windows" tags: - 5.2-pas-install # /*---------------------------------------------------------------------------8 # | | # | Playbook for Reseting the DB2 parameters | # | 2570458 - DB6: Depooling report RUTPOADAPT fails with SQL -912 | # +------------------------------------4--------------------------------------*/ - hosts: "{{ sap_sid | upper }}_DB" name: "Resetting the DB2 LOCK escalationparameters" serial: 1 gather_facts: true vars_files: - vars/ansible-input-api.yaml # API Input template with defaults tasks: # 2570458 - DB6: Depooling report RUTPOADAPT fails with SQL -912 - name: "Check if LOCK variable is set for PAS" ansible.builtin.stat: path: /etc/sap_deployment_automation/lock_escalation_false.txt register: db2_lock_escalation when: - platform == "DB2" # 2570458 - DB6: Depooling report RUTPOADAPT fails with SQL -912 - name: "Set LOCK variable for PAS" become: true become_user: db2{{ db_sid | lower }} ansible.builtin.shell: db2set DB2_AVOID_LOCK_ESCALATION= args: executable: /bin/csh when: - platform == "DB2" - db2_lock_escalation.stat.exists