deploy/ansible/roles-sap/0.1-bom-validator/tasks/main.yaml (147 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # /*---------------------------------------------------------------------------8 # | | # | Role to process the BOM | # | | # +------------------------------------4--------------------------------------*/ # Description: Downloads the files specified in BOM file from SAP to the # ansible controller and uploads them to the storage account. # # # Objects: # External: # bom_base_name - Name of BOM # new_bom_name - Default: <bom_base_name>-<bom_suffix> # sapbits_location_base_path - URL of Blob Storage # sapbits_access_key - KV # sapbits_sas_token - calculated SAS Token # Defaults: # bom_suffix - customer # download_directory - Path to the download location on the ansible controller. # default: ~/tmp/download # sapbits_bom_files - path to the root of the sap file store in the SA. # default: sapfiles # # Internal: # result - object to store the results of a task execution # # Created: # bom - object containing the specified BOM # # -------------------------------------+---------------------------------------8 # Test Cases: # # +----------------+--------------+ # | | Dependancies | # | | +-------+---------+ # | | | Storage Account | # | | | +-------------+ # | | | | Key Vault | # +----------------+------+---+---+---------+ # |Dynamic BOM | NONE | | | Pass # | | NONE | | X | # | | NONE | X | | Pass # | | NONE | X | X | # | |------+---+---| # | | HANA | | | Pass # | | HANA | | X | # | | HANA | X | | Pass # | | HANA | X | X | # | |------+---+---| # # # -------------------------------------+---------------------------------------8 # Reviews: # # # -------------------------------------+---------------------------------------8 --- # When Fact: pause = true - name: "TROUBLESHOOTING: " ansible.builtin.pause: prompt: "Press enter to continue..." echo: true when: - pause | default(false) # When Fact: pause is True, then wait for ENTER key # - name: "Informational" # ansible.builtin.debug: # msg: |- # Informational facts: # Ansible version = {{ ansible_version.string }} # Ansible Python version = {{ ansible_python_version }} # verbosity: 1 # - name: "Install Collections" # ansible.builtin.command: >- # ansible-galaxy collection install ansible.netcommon:5.1.2 # - name: "Show Installed Collections" # ansible.builtin.command: >- # env # register: envOutput # - name: "Informational" # ansible.builtin.debug: # var: envOutput # verbosity: 1 # - name: "Show Installed Collections" # ansible.builtin.command: >- # ansible-galaxy collection list # register: galaxyOutput # - name: "Informational" # ansible.builtin.debug: # var: galaxyOutput # verbosity: 1 # -------------------------------------+---------------------------------------8 # Step: 01 # Description: Initialize Facts - Start out with KeyVault and Storage Account # access disabled. # - name: "Initialize facts" ansible.builtin.set_fact: kv_enabled: false sa_enabled: false - name: "Informational" ansible.builtin.debug: msg: |- Initialize facts: kv_enabled = {{ kv_enabled }} - Use Key Vault sa_enabled = {{ sa_enabled }} - Use Storage Account verbosity: 1 # Step: 01 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 02 # Description: Call validation for Prerequisites # - name: "Execute Pre-checks Task" ansible.builtin.import_tasks: pre_checks.yaml # Step: 02 - END # -------------------------------------+---------------------------------------8 # # -------------------------------------+---------------------------------------8 # # Step: 03 # # Description: # # # - name: "Set tier to preparation" # ansible.builtin.set_fact: # tier: preparation # # Step: 03 - END # # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 04 # Description: Call BOM processor, passing BOM name. # account and container vars are never used if sa_enabled is False # - name: "0.1 BoM Validator: - Process main BOM" ansible.builtin.include_tasks: bom_validator.yaml vars: account: "{{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }}" container: "{{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/archives" bom_name: "{{ bom_base_name }}" upload: true # Step: 04 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 05 # Description: Save BOM and Media list for consolidation # - name: "0.1 BoM Validator: - Save BOM {{ bom_base_name }} as Dictionary" ansible.builtin.set_fact: root_bom: "{{ bom }}" root_media_list: "{{ bom.materials.media | flatten(levels=1) }}" # Step: 05 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 06 # Description: Call BOM processor, passing dependent BOM names. # account and container vars are never used if sa_enabled is False # - name: "0.1 BoM Validator: - Process dependent BoMs in a loop" ansible.builtin.include_tasks: bom_validator.yaml vars: account: "{{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }}" container: "{{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/archives" bom_name: "{{ bom_dependency.name }}" upload: false register: dependent_bom_collection loop: "{{ bom.materials.dependencies | flatten(levels=1) }}" loop_control: loop_var: bom_dependency when: - bom.materials.dependencies is defined - bom.materials.dependencies | length>0 # Step: 06 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 07 # Description: Deduplicate entries in consolidated BOM Media list # - name: "0.1 BOM Validator: - Filter combined BoM" ansible.builtin.set_fact: root_media_list: "{{ root_media_list | unique(attribute='archive') | list }}" # Step: 07 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 08 # Description: Create consolidated BOM # - name: "0.1 BOM Validator: - Assemble combined BoM" ansible.builtin.set_fact: new_bom: "{{ lookup('template', 'bom.j2') }}" - name: "Informational" ansible.builtin.debug: var: new_bom verbosity: 1 # Step: 08 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 09 # Description: Aggregate BOM files - Loop through all BOM directories used and # build consolidated BOM directory. # - name: "main: - Informational" ansible.builtin.debug: var: aggregated_bom_directories verbosity: 1 - name: "main: - Aggregate BOM files" ansible.builtin.include_tasks: aggregate_bom.yaml loop: "{{ aggregated_bom_directories }}" loop_control: loop_var: bom_dir # - name: "0.1 BOM Validator: - remove BoM" # # become: true # # become_user: root # delegate_to: localhost # ansible.builtin.file: # path: "{{ download_directory }}/bom/{{ bom_base_name }}.yaml" # state: absent # - name: "0.1 BOM Validator: - write combined BoM" # # become: true # # become_user: root # delegate_to: localhost # ansible.builtin.copy: # content: "{{ new_bom }}" # dest: "{{ download_directory }}/bom/{{ bom_base_name }}{{ bom_suffix }}.yaml" # mode: 0644 # force: true # Step: 09 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 10 # Description: Upload New Customer BOM to Storage Account # - name: "BOM Upload" when: - sa_enabled block: # -------------------------------------+---------------------------------------8 # Step: 10-01 # Description: # - name: "0.1 BoM Validator: - delete combined BoM using SAS Token" ansible.builtin.command: >- az storage blob delete --account-name {{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }} --sas-token {{ sapbits_sas_token }} --container-name {{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/boms/{{ new_bom_name }} --name {{ bom_base_name }}.yaml delegate_to: localhost register: azresult changed_when: false failed_when: - azresult.rc != 0 - azresult.stderr is defined - azresult.stderr.find("BlobNotFound") == -1 when: allowSharedKeyAccess - name: "0.1 BoM Validator: - delete combined BoM" ansible.builtin.command: >- az storage blob delete --account-name {{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }} --auth-mode login --container-name {{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/boms/{{ new_bom_name }} --name {{ bom_base_name }}.yaml delegate_to: localhost register: azresult changed_when: false failed_when: - azresult.rc != 0 - azresult.stderr is defined - azresult.stderr.find("BlobNotFound") == -1 when: not allowSharedKeyAccess # Step: 10-01 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 10-02 # Description: # - name: "0.1 BoM Validator: - Upload combined BoM using SAS Token" ansible.builtin.command: >- az storage blob upload-batch --account-name {{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }} --sas-token {{ sapbits_sas_token }} --destination {{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/boms/{{ new_bom_name }} --source {{ download_directory }}/bom/{{ new_bom_name }} --overwrite True --if-none-match "*" --no-progress delegate_to: localhost register: azresult changed_when: false failed_when: - azresult.rc != 0 - azresult.stderr is defined - azresult.stderr.find("BlobAlreadyExists") == -1 when: allowSharedKeyAccess - name: "0.1 BoM Validator: - Upload combined BoM" ansible.builtin.command: >- az storage blob upload-batch --account-name {{ sapbits_location_base_path.rpartition('//')[2].split('.')[0] }} --auth-mode login --destination {{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}/{{ sapbits_bom_files }}/boms/{{ new_bom_name }} --source {{ download_directory }}/bom/{{ new_bom_name }} --overwrite True --if-none-match "*" --no-progress delegate_to: localhost register: azresult changed_when: false failed_when: - azresult.rc != 0 - azresult.stderr is defined - azresult.stderr.find("BlobAlreadyExists") == -1 when: not allowSharedKeyAccess # Step: 10-02 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 10-03 # Description: # - name: "Remove temporary directory" ansible.builtin.file: path: "{{ download_directory }}/bom/{{ new_bom_name }}" state: absent # Step: 10-03 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 10-04 # Description: # - name: "Show Storage Account BOM folder path" ansible.builtin.debug: msg: "{{ sapbits_location_base_path }}/{{ sapbits_bom_files }}/boms/{{ new_bom_name }}" # Step: 10-04 - END # -------------------------------------+---------------------------------------8 # Step: 10 - END # -------------------------------------+---------------------------------------8 # -------------------------------------+---------------------------------------8 # Step: 11 # Description: When Storage Account access is disabled, show local path. # - name: "Show local BOM folder path" ansible.builtin.debug: msg: "{{ download_directory }}/bom/{{ new_bom_name }}" when: - not sa_enabled # Step: 11 - END ... # /*---------------------------------------------------------------------------8 # | END | # +------------------------------------4--------------------------------------*/