deploy/ansible/roles-sap/0.1-bom-validator/tasks/bom_download.yaml (228 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
---
# -------------------------------------+---------------------------------------8
# Step: 01
# Description: Initialize facts
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Download {{ bom_media_entry.archive }}"
ansible.builtin.set_fact:
task_prefix: bom_download # set the fact so it is globally availabe
proceed: true
vars:
task_prefix: bom_download # make the fact locally available
# Step: 01 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+-----------------------------------------8
# Step: 02
# Description: Informational
#
- name: "{{ task_prefix }} - Informational"
ansible.builtin.debug:
var: bom_media_entry
verbosity: 1
- name: "{{ task_prefix }} - Informational"
ansible.builtin.debug:
msg: |-
check_storage_account: {{ check_storage_account }}
verbosity: 1
# Step: 02 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 03
# Description:
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Check Storage Account for {{ bom_media_entry.archive }}"
when:
- check_storage_account | bool
- sa_enabled
- allowSharedKeyAccess
block:
# -----------------------------------+-----------------------------------------8
# Step: 03-01
# Description:
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Check is file {{ bom_media_entry.archive }} is already downloaded"
ansible.builtin.uri:
url: "{{ sapbits_location_base_path }}/{{ sapbits_bom_files }}/archives/{{ bom_media_entry.archive }}{% if sapbits_sas_token is not undefined %}?{{ sapbits_sas_token }}{% endif %}"
status_code: [200, 403, 404, 409]
method: HEAD
register: blob_exists
- name: "{{ task_prefix }} - Informational"
ansible.builtin.debug:
var: blob_exists
verbosity: 1
# Step: 03-01 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 03-02
# Description: Validate the url status. Fail if authentication fails
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Authentication error {{ bom_media_entry.archive }}"
ansible.builtin.fail:
msg: "Authentication error, please check the SAS token"
when: blob_exists.status == 403
# Step: 03-02 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 03-03
# Description:
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Set Fact {{ bom_media_entry.archive }}"
ansible.builtin.set_fact:
proceed: false
when: blob_exists.status != 404
# Step: 03-03 - END
# -------------------------------------+---------------------------------------8
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Check Storage Account for {{ bom_media_entry.archive }}"
when:
- check_storage_account | bool
- sa_enabled
- not allowSharedKeyAccess
block:
# -----------------------------------+-----------------------------------------8
# Step: 03-01
# Description:
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Check is file {{ bom_media_entry.archive }} is already downloaded"
ansible.builtin.command: >-
az storage blob show
--account-name {{ account }}
--container-name {{ sapbits_location_base_path.rpartition('//')[2].split('/')[1] }}
--auth-mode login
--name {{ sapbits_bom_files }}/archives/{{ bom_media_entry.archive }}
--query name --output tsv
delegate_to: localhost
register: azresult
ignore_errors: true
- name: "{{ task_prefix }} - Informational"
ansible.builtin.debug:
var: azresult
verbosity: 2
# Step: 03-01 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 03-02 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 03-03
# Description:
#
- name: "{{ task_prefix }} - BOM: {{ bom_name }} Set Fact {{ bom_media_entry.archive }}"
ansible.builtin.set_fact:
proceed: false
when: azresult.rc == 0
# Step: 03-03 - END
# -------------------------------+---------------------------------------------8
# Step: 03 - END
# -------------------------------------+---------------------------------------------8
# -------------------------------------+---------------------------------------------8
# Step: 04
# Description: Informational check of the proceed parameter.
#
- name: "{{ task_prefix }} - Informational check of the proceed parameter"
ansible.builtin.assert:
that:
- "proceed"
success_msg: |-
Download for file {{ bom_media_entry.archive }}: ENABLED
Downloading...
proceed: {{ proceed }}
fail_msg: |-
Download for file {{ bom_media_entry.archive }}: DISABLED
Skipping download...
proceed: {{ proceed }}
failed_when: false
# Step: 04 - END
# -----------------------------------+-----------------------------------------8
# -----------------------------------+-----------------------------------------8
# Step: 05
# Description:
#
- name: "BOM: Download File {{ bom_media_entry.archive }}"
block:
# -----------------------------------+-----------------------------------------8
# Step: 05-01
# Description:
#
- name: "BOM: {{ bom_name }} Download File"
block:
# -------------------------------+---------------------------------------------8
# Step: 05-01-01
# Description:
#
- name: "BOM: {{ bom_name }} Download File {{ bom_media_entry.archive }}"
ansible.builtin.get_url:
url: "{{ bom_media_entry.url | string | trim }}"
dest: "{{ download_directory }}/files/{{ bom_media_entry.archive }}"
tmp_dest: "{{ download_directory }}/tmp"
url_username: "{{ s_user }}"
url_password: "{{ s_password }}"
force_basic_auth: true
http_agent: 'SAP Software Download'
timeout: 60
mode: 0644
become: "{{ bom_processing_become }}"
register: result
until: result is succeeded or not result.changed
retries: 2
delay: 1
no_log: false
rescue:
# -------------------------------+---------------------------------------------8
# Step: 05-01-01-on-failure-01
# Description:
#
- name: "BOM: Ensure URL is correct"
ansible.builtin.set_fact:
file_url: "{{ bom_media_entry.url | lower | urlsplit('scheme') }}://{{ bom_media_entry.url | lower | urlsplit('hostname') }}/{{ bom_media_entry.url | lower | urlsplit('path') | replace('\"', '') }}"
# Step: 05-01-01-on-failure-01 - END
# ---------------------------+-------------------------------------------------8
# -----------------------------------+-----------------------------------------8
# Step: 05-01-01-on-failure-02
# Description:
#
- name: "BOM: Ensure URL is correct"
ansible.builtin.debug:
msg:
- "file_url: '{{ file_url }}"
# Step: 05-01-01-on-failure-02 - END
# ---------------------------+-------------------------------------------------8
# ---------------------------+-------------------------------------------------8
# Step: 05-01-01-on-failure-03
# Description:
#
- name: "BOM: {{ bom_name }} Download File {{ bom_media_entry.archive }}"
ansible.builtin.get_url:
url: "{{ file_url | trim }}"
dest: "{{ download_directory }}/files/{{ bom_media_entry.archive }}"
tmp_dest: "{{ download_directory }}/tmp"
url_username: "{{ s_user }}"
url_password: "{{ s_password }}"
force_basic_auth: true
http_agent: 'SAP Software Download'
timeout: 60
mode: 0644
# become: "{{ bom_processing_become }}"
# become_user: root
register: result
no_log: false
# failed_when: false
# Step: 05-01-01-on-failure-03 - END
# ---------------------------+-------------------------------------------------8
# Step: 05-01-01 - END
# ---------------------------+-------------------------------------------------8
# Step: 05-01 - END
# -----------------------------------+-----------------------------------------8
# -----------------------------------+-----------------------------------------8
# Step: 05-02
# Description:
#
- name: "BOM: {{ bom_name }} Download File {{ bom_media_entry.archive }}"
ansible.builtin.debug:
var: result
verbosity: 1
# Step: 05-02 - END
# -----------------------------------+-----------------------------------------8
# -----------------------------------+-----------------------------------------8
# Step: 05-03
# Description: Checksum block
#
- name: "BOM: Create checksums"
block:
# -------------------------------+---------------------------------------------8
# Step: 05-03-01
# Description:
#
- name: "BOM: Verify Files"
ansible.builtin.stat:
path: "{{ result.dest }}"
checksum_algorithm: sha256
register: fs_check
- name: "BOM: Show"
ansible.builtin.debug:
var: fs_check
verbosity: 1
- name: "BOM: Show"
ansible.builtin.debug:
var: create_checksums
verbosity: 1
# Step: 05-03-01 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 05-03-02
# Description:
#
- name: "block"
block:
# ---------------------------+-------------------------------------------------8
# Step: 05-03-02-01
# Description:
#
# # MKD - Interesting change to task, but ultimately leaves room for error.
# # It can identify an incorrectly indentented line and insert a line
# # after with a fixed indentation that breakes the yaml structure.
# # This was noticed in a merge conflict during resolution prior to a
# # pull request for the dynamic bom
# - name: "BOM: Line"
# ansible.builtin.blockinfile:
# path: "{{ bom_file }}"
# # regexp: ' archive: {{ item.archive }}'
# insertafter: '^\s*archive:\s*{{ item.archive }}'
# block: " checksum: {{ fs_check.stat.checksum }}"
# marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.archive }}"
# when:
# - fs_check is defined
# - create_checksums is defined
# - bom_file is defined
- name: "BOM: Line"
ansible.builtin.blockinfile:
path: "{{ bom_file }}"
insertafter: ' archive: {{ bom_media_entry.archive }}'
block: " checksum: {{ fs_check.stat.checksum }}"
marker: "# {mark} ANSIBLE MANAGED BLOCK {{ bom_media_entry.archive }}"
when:
- fs_check is defined
- create_checksums is defined
- bom_file is defined
# Step: 05-03-02-01 - END
# ---------------------------+-------------------------------------------------8
# ---------------------------+-------------------------------------------------8
# Step: 05-03-02-02
# Description:
#
- name: "BOM: Remove marker"
ansible.builtin.lineinfile:
path: "{{ bom_file }}"
regexp: '# BEGIN ANSIBLE MANAGED BLOCK {{ bom_media_entry.archive }}'
state: absent
- name: "BOM: Remove marker"
ansible.builtin.lineinfile:
path: "{{ bom_file }}"
regexp: '# END ANSIBLE MANAGED BLOCK {{ bom_media_entry.archive }}'
state: absent
# Step: 05-03-02-02 - END
# ---------------------------+-------------------------------------------------8
when:
- bom_media_entry.checksum is defined
- bom_media_entry.checksum | bool is not true
# Step: 05-03-02 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 05-03-03
# Description: Update in memory BOM
#
- name: "block"
block:
# ---------------------------+-------------------------------------------------8
# Step: 05-03-03-01
# Description:
#
- name: "Update BOM"
ansible.builtin.set_fact:
bom: "{{ bom_update }}"
vars:
bom_update: "{#- -#}{% set _ = bom.materials.media[bom_media_index].update({'checksum': fs_check.stat.checksum}) -%} {{ bom }}"
# Step: 05-03-03-01 - END
# ---------------------------+-------------------------------------------------8
# ---------------------------+-------------------------------------------------8
# Step: 05-03-03-02
# Description:
#
- name: "BOM: Show"
ansible.builtin.debug:
var: bom.materials.media[bom_media_index]
verbosity: 1
# Step: 05-03-03-02 - END
# ---------------------------+-------------------------------------------------8
when:
- create_checksums is defined
# Step: 05-03-03 - END
# -------------------------------+---------------------------------------------8
when:
- bom_media_entry.checksum is not defined
# Step: 05-03 - END
# -----------------------------------+-----------------------------------------8
# -----------------------------------+-----------------------------------------8
# Step: 05-04
# Description:
#
- name: "Upload file"
block:
# 03) Upload files to Azure
# TODO - put this in a block
# -------------------------------+---------------------------------------------8
# Step: 05-04-01
# Description:
#
- name: "BOM: {{ bom_name }} Upload File {{ bom_media_entry.archive }} using SAS keys"
when:
- allowSharedKeyAccess
- sapbits_sas_token is defined
ansible.builtin.command: >-
az storage blob upload
--account-name {{ account }}
--sas-token {{ sapbits_sas_token }}
--container-name {{ container }}
--name {{ bom_media_entry.archive }}
--file {{ result.dest }}
--if-none-match "*"
--no-progress
delegate_to: localhost
register: azresult
ignore_errors: true
failed_when:
- azresult.rc != 0
- azresult.stderr is defined
- azresult.stderr.find("BlobAlreadyExists") == -1
- name: "BOM: {{ bom_name }} Upload File {{ bom_media_entry.archive }}"
when:
- not allowSharedKeyAccess
ansible.builtin.command: >-
az storage blob upload
--account-name {{ account }}
--container-name {{ container }}
--auth-mode login
--name {{ bom_media_entry.archive }}
--file {{ result.dest }}
--if-none-match "*"
--no-progress
delegate_to: localhost
register: azresult
ignore_errors: true
failed_when:
- azresult.rc != 0
- azresult.stderr is defined
- azresult.stderr.find("BlobAlreadyExists") == -1
# Step: 05-04-01 - END
# -------------------------------+---------------------------------------------8
# -------------------------------+---------------------------------------------8
# Step: 05-04-02
# Description:
#
- name: "BOM: {{ bom_name }} Remove File {{ bom_media_entry.archive }}"
# become: true
ansible.builtin.file:
dest: "{{ download_directory }}/files/{{ bom_media_entry.archive }}"
state: absent
# Step: 05-04-02 - END
# -------------------------------+---------------------------------------------8
when:
- sa_enabled
# Step: 05-04 - END
# -----------------------------------+-----------------------------------------8
when: proceed
# Step: 05 - END
# -------------------------------------+---------------------------------------8
...
# /*---------------------------------------------------------------------------8
# | END |
# +------------------------------------4--------------------------------------*/