deploy/ansible/roles-sap/windows/3.3-bom-processing/tasks/bom_processor.yaml (111 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. --- # /*----------------------------------------------------------------------------8 # | | # | BOM Validation role | # | | # | Assumptions | # | target_media_location exists on disk | # | | # | Inputs: | # | target_media_location Default xxxx | # | download_directory | # | bom_name | # | sapbits_location_base_path | # | sapbits_bom_files | # | sapbits_sas_token | # | sapbits_access_key | # | S_user | # | S_password: | # | download_directory: Default xxxx | # | | # |Locals: | # | _bom | # | item | # | result | # | | # | BOM Fields: | # | download | # | archive | # | permissions | # | | # | | # | Steps: | # | 01) Register BOM | # | 02) Create static download directories # | 03) Create dynamic extract directories # | 04) Download media from bom # | 05) Extract files - SAPCAR # | 06) Extract files - UNRAR # | 07) Extract files - UNZIP # | 08) Purge BOM file from Ansible Controller - TBD # +------------------------------------4--------------------------------------*/ - name: "3.3 BoM Processing: - Register BoM" ansible.builtin.include_role: name: roles-sap/windows/3.3.1-bom-utility tasks_from: bom-register vars: inventory_dir: "{{ download_directory }}/bom" task_prefix: "BOM Processing: " sa_enabled: true # 02) Create static download directories - name: "3.3 BoM Processing: - Create SAP download directories" ansible.windows.win_dsc: resource_name: File DestinationPath: "{{ item.path }}" Type: Directory Ensure: Present loop: - path: '{{ target_media_location_windows }}\tmp' - path: '{{ target_media_location_windows }}\downloads' - path: '{{ target_media_location_windows }}\download_basket' # 03) Create dynamic extract directories - name: "3.3 BoM Processing: - Create BOM directories" ansible.windows.win_dsc: resource_name: File DestinationPath: '{{ target_media_location_windows }}\{{ item.extractDir }}' Type: Directory Ensure: Present loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.extractDir is defined - item.extractDir | type_debug != 'NoneType' - item.extractDir | length > 0 # Download Files # ------------------<DEBUGGING>------------------- - name: "3.3 BoM Processing: - List files and check if dynamic BOM download was performed successfully." block: - name: "Check if the item has dynamic property" ansible.builtin.fail: msg: "INSTALL:0023:Error while donwloading BOM contents. Invalid BOM structure detected." when: - item.download is undefined or item.download - item.dynamic is defined or item.archive is undefined loop: "{{ bom.materials.media | flatten(levels=1) }}" - name: "3.3 BoM Processing: - List files" ansible.builtin.debug: msg: - "URL : {{ sapbits_location_base_path }}/{{ sapbits_bom_files }}/archives/{{ item.archive }}\ {% if sapbits_sas_token is not undefined %}?{{ sapbits_sas_token }}{% endif %}" - "DEST: {{ target_media_location }}/{% if item.filename is undefined %}{{ item.archive }}{% else %}{{ item.filename }}{% endif %}" - "MODE: {% if item.permissions is undefined %}0644{% else %}{{ item.permissions }}{% endif %}" verbosity: 2 loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.download is undefined or item.download # ------------------</DEBUGGING>------------------ - name: "3.3 BoM Processing: - Creates temporary download directory" ansible.windows.win_tempfile: path: C:\resource state: directory - name: "3.3 BoM Processing: - Download Files {{ distribution_id }}" ansible.windows.win_get_url: url: "{{ sapbits_location_base_path }}/{{ sapbits_bom_files }}/archives/{{ item.archive | string | trim }}\ {% if sapbits_sas_token is not undefined %}?{{ sapbits_sas_token }}{% endif %}" dest: '{{ target_media_location_windows }}\{% if item.path is undefined %}downloads{% else %}{{ item.path }}{% endif %}\{% if item.filename is undefined %}{{ item.archive }}{% else %}{{ item.filename }}{% endif %}' checksum: "{% if item.checksum is defined %}{{ item.checksum | upper }}{% endif %}" checksum_algorithm: "sha256" validate_certs: true register: result until: result is succeeded retries: 2 delay: 5 loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.download is undefined or item.download # 05) Extract files - SAPCAR - name: "3.3 BoM Processing: - Extract File, SAPCAR" ansible.windows.win_shell: '{{ target_media_location_windows }}\downloads\SAPCAR -manifest SIGNATURE.SMF -xf {{ target_media_location_windows }}\{% if item.path is undefined %}downloads{% else %}{{ item.path }}{% endif %}\{% if item.filename is undefined %}{{ item.archive }}{% else %}{{ item.filename }}{% endif %}' args: chdir: '{{ target_media_location_windows }}\{{ item.extractDir }}' creates: '{ target_media_location_windows }}\{{ item.extractDir }}\{% if item.creates is defined %}{{ item.creates }}{% else %}NOT_DEFINED{% endif %}' loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.extract is not undefined - item.extract - ( item.filename is undefined and (item.archive |regex_search('[^.]+(?=\\.*$)')|upper=="SAR") ) or ( item.filename is defined and (item.filename|regex_search('[^.]+(?=\\.*$)')|upper=="SAR") ) # # 06) Extract files - UNRAR # - name: "3.3 BoM Processing: - Extract File, UNRAR" # ansible.builtin.command: unrar x "{{ target_media_location }}/{% if item.path is undefined %}downloads{% else %}{{ item.path }}{% endif %}/\ # {% if item.filename is undefined %}{{ item.archive }}{% else %}{{ item.filename }}{% endif %}" # args: # chdir: "{{ target_media_location }}/{{ item.extractDir }}" # creates: "{{ target_media_location }}/{{ item.extractDir }}/\ # {% if item.creates is defined %}{{ item.creates }}{% else %}NOT_DEFINED{% endif %}" # loop: "{{ bom.materials.media | flatten(levels=1) }}" # when: # - item.extract is not undefined # - item.extract # - ( item.filename is undefined and (item.archive |regex_search('[^.]+(?=\\.*$)')|upper=="RAR") ) or # ( item.filename is defined and (item.filename|regex_search('[^.]+(?=\\.*$)')|upper=="RAR") ) # 07) Extract files - UNZIP - name: "3.3 BoM Processing: - Extract File, UNZIP" ansible.windows.win_dsc: resource_name: Archive Ensure: Present Path: '{{ target_media_location_windows }}\{% if item.path is undefined %}downloads{% else %}{{ item.path }}{% endif %}\{% if item.filename is undefined %}{{ item.archive }}{% else %}{{ item.filename }}{% endif %}' Destination: '{{ target_media_location_windows }}\{{ item.extractDir }}' loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.extract is not undefined - item.extract - ( item.filename is undefined and (item.archive |regex_search('[^.]+(?=\\.*$)')|upper=="ZIP") ) or ( item.filename is defined and (item.filename|regex_search('[^.]+(?=\\.*$)')|upper=="ZIP") ) # 08) Extract files - EXE - name: "3.3 BoM Processing: - Extract File, EXE" ansible.builtin.include_tasks: "process_exe_archives.yaml" loop: "{{ bom.materials.media | flatten(levels=1) }}" when: - item.extract is defined - item.extract - ( item.filename is undefined and (item.archive |regex_search('[^.]+(?=\\.*$)')|upper=="EXE") ) or ( item.filename is defined and (item.filename|regex_search('[^.]+(?=\\.*$)')|upper=="EXE") ) # -------------------------------------+---------------------------------------8 # # Description: Process BOM dependencies. # Call BOM processor, passing dependent BOM names. # - name: "3.3 BoM Processing: - Process dependent BOMs" ansible.builtin.include_tasks: "bom_processor.yaml" vars: bom_name: "{{ bom_dependency.name }}" loop: "{{ bom.materials.dependencies | flatten(levels=1) }}" loop_control: loop_var: bom_dependency when: - bom.materials.dependencies is defined - bom.materials.dependencies|length>0 # -------------------------------------+---------------------------------------8 # # 08) Purge BOM file from Ansible Controller # - name: "Ensure {{ bom_name }} is absent" # ansible.builtin.file: # path: "{{ inventory_dir }}/{{ bom_name }}.yaml" # state: absent # delegate_to: localhost # -------------------------------------+---------------------------------------8 ...