deploy/ansible/roles-sap/0.1-bom-validator/tasks/pre_checks.yaml (264 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
---
# -------------------------------------+---------------------------------------8
#
# Description: Validation for Prerequisites
#
# 01) bom_base_name must be provided
# 02) deployer_kv_name or
# kv_name if defined, check for s_user and s_password
# else s_user and s_password must be provided
# 04) s_user provided or recovered from KV
# 05) s_password provided or recovered from KV
# 06) download_directory
# sapbits_sas_token
# sapbits_access_key
# sapbits_bom_files
# target_media_location
# sapbits_location_base_path
# -------------------------------------+---------------------------------------8
# Step: 01
# Description: Validation for bom_base_name
#
# Information:
# type_debug values for testing:
# - undefined = AnsibleUndefined
# - null = NoneType
# - text = AnsibleUnicode
# - boolean = bool
#
- name: "(pre_checks.yaml) - Validate required variable is present and not empty (bom_base_name)"
ansible.builtin.assert:
that:
- "bom_base_name is defined" # Has the variable been defined
- "bom_base_name | type_debug != 'NoneType'" # is not null
- "bom_base_name | trim | length > 1" # and given a value
success_msg: |-
bom_base_name: {{ bom_base_name }}
fail_msg: |-
Please ensure that the details are provided for:
- bom_base_name
# Step: 01 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 02
# Description: KeyVault Access
# If neither deployer_kv_name or kv_name are defined, then skip.
# Otherwise fetch:
# - s_user
# - s_password
# from KeyVault when they are not already defined.
#
- name: "(pre_checks.yaml) - KeyVault validation block..."
block:
- name: "(pre_checks.yaml) - {{ task_prefix }} - Informational"
ansible.builtin.debug:
msg: |-
Entering KV Block...
verbosity: 1
# -------------------------------------+---------------------------------------8
# Step: 02-01
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Set deployer keyvault name"
ansible.builtin.set_fact:
kv_name: "{{ deployer_kv_name }}"
when: deployer_kv_name is defined
# Step: 02-01 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 02-02
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Load the keyvault secrets"
ansible.builtin.include_role:
name: roles-misc/0.2-kv-secrets
public: true
vars:
tier: bom
# tags:
# - 0.2-kv-secrets
# Step: 02-02 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 02-03
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Set kv_enabled: true"
ansible.builtin.set_fact:
kv_enabled: true
when:
- "kv_name is defined" # Has the variable been defined
- "kv_name | type_debug != 'NoneType'" # is not null
- "kv_name | trim | length > 1" # and given a value
# Step: 02-03 - END
# -------------------------------------+---------------------------------------8
vars:
task_prefix: KeyVault validation block
when:
- ( ( kv_name is defined and kv_name | trim | length > 1 ) or
( deployer_kv_name is defined and deployer_kv_name | trim | length > 1 ) )
# - ( ( s_user is undefined or s_user | trim | length < 1 ) or
# ( s_password is undefined or s_password | trim | length < 1 ) )
# Step: 02 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 03
# Description: Informational check of the kv_name parameter.
#
- name: "(pre_checks.yaml) - Informational check of the kv_name parameter"
ansible.builtin.assert:
that:
- "kv_name is defined" # Has the variable been defined
- "kv_name | type_debug != 'NoneType'" # is not null
- "kv_name | trim | length != 0" # and given a value
success_msg: |-
KeyVault access: ENABLED
kv_enabled: {{ kv_enabled }}
fail_msg: |-
KeyVault access: DISABLED
kv_enabled: {{ kv_enabled }}
If this is undesired, please set:
- deployer_kv_name
failed_when: false
# Step: 03 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 04
# Description: Validation for s_user
#
- name: "(pre_checks.yaml) - Check that the S-User is present and not empty (s_user)"
ansible.builtin.assert:
that:
- "s_user is defined" # Has the variable been defined
- "s_user | type_debug != 'NoneType'" # is not null
- "s_user | string | length != 0 " # and given a value
success_msg: |-
s_user: {{ s_user | default('NOT DEFINED') }}
fail_msg: |-
Please ensure that the details are provided for:
- s_user
either as a parameter or in the deployer key vault
# Step: 04 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 05
# Description: Validate that s_password parameter has been given a value
#
- name: "(pre_checks.yaml) - Check that the S-User password is present and not empty (s_password)"
ansible.builtin.assert:
that:
- "s_password is defined" # Has the variable been defined
- "s_password | type_debug != 'NoneType'" # is not null
- "s_password | string | length != 0 " # and given a value
success_msg: |-
s_password: ***********
fail_msg: |-
Please ensure that the details are provided for:
- s_password
either as a parameter or in the deployer key vault
# Step: 05 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 06
# Description: Validation for download_directory
# This is the location used when downloading files from SAP. This
# is an intermediary location to stage files before upload to SA.
# Default: ~/tmp/downloads
#
- name: "(pre_checks.yaml) - Check that the Download Directory is present and not empty (download_directory)"
ansible.builtin.assert:
that:
- "download_directory is defined" # Has the variable been defined
- "download_directory | type_debug != 'NoneType'" # is not null
- "download_directory | trim | length > 1" # and given a value
success_msg: |-
download_directory: {{ download_directory | default('NOT DEFINED') }}
fail_msg: |-
Please ensure that the details are provided for:
- download_directory
# Step: 06 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 07
# Description: Create BOM download directories".
#
# TODO: allow for concurrancy by using unique tmp directory dtructure.
#
- name: "(pre_checks.yaml) - Prepare download directory"
block:
# -------------------------------------+---------------------------------------8
# Step: 07-01
# Description: Ensure download_directory exists
#
- name: "{{ task_prefix }} - Create BOM download directories"
become: "{{ bom_processing_become }}"
become_user: root
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: 0755
owner: "{{ orchestration_ansible_user if bom_processing_become else omit }}"
delegate_to: localhost
loop:
- "{{ download_directory }}"
- "{{ download_directory }}/tmp"
- "{{ download_directory }}/files"
- "{{ download_directory }}/bom"
# Step: 07-01 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 07-02
# Description: Create test file
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - BoM Initial file"
ansible.builtin.copy:
dest: "{{ download_directory }}/readme.md"
content: "This is the container with the SAP media"
mode: 0644
register: readme_file
delegate_to: localhost
# Step: 07-02 - END
# -------------------------------------+---------------------------------------8
vars:
task_prefix: Prepare download directory block
when:
- download_directory
# Step: 07 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 08
# Description: Storage Account Access
# If neither deployer_kv_name or kv_name are defined, then skip.
# Otherwise fetch:
# - sapbits_location_base_path
# - sapbits_access_key
# - sapbits_sas_token
# from KeyVault when they are not already defined.
#
- name: "(pre_checks.yaml) - Storage Account validation block"
block:
- name: "(pre_checks.yaml) - {{ task_prefix }} - Informational"
ansible.builtin.debug:
msg: |-
Entering Storage Account Block...
verbosity: 1
# -------------------------------------+---------------------------------------8
# Step: 08-01
# Description: Validate sapbits_bom_files
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Validate required variable is present and not empty (sapbits_bom_files)"
ansible.builtin.assert:
that:
- "sapbits_bom_files is defined" # Has the variable been defined
- "sapbits_bom_files | trim | length != 0" # and given a value
success_msg: |-
sapbits_bom_files: {{ sapbits_bom_files | default('NOT DEFINED') }}
fail_msg: |-
Please ensure that the details are provided for:
- sapbits_bom_files
# Step: 08-01 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 08-02
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Load the storage account details"
ansible.builtin.include_role:
name: roles-misc/0.3.sap-installation-media-storage-details
public: true
tags:
- 0.3.sap-installation-media-storage-details
# Step: 08-02 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 08-03
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Validate required variable is present and not empty (sapbits_location_base_path)"
ansible.builtin.assert:
that:
- "sapbits_location_base_path is defined" # Has the variable been defined
- "sapbits_location_base_path | trim | length != 0" # and given a value
success_msg: |-
sapbits_location_base_path: {{ sapbits_location_base_path | default('NOT DEFINED') }}
fail_msg: |-
Please ensure that the details are provided for:
- sapbits_location_base_path
either as a parameter or in the deployer key vault
# Step: 08-03 - END
# -------------------------------------+---------------------------------------8
vars:
task_prefix: Storage Account validation block
when:
- ( ( kv_name is defined and kv_name | trim | length > 1 ) or
( deployer_kv_name is defined and deployer_kv_name | trim | length > 1 ) )
# Step: 08 - END
# -------------------------------------+---------------------------------------8
- name: "(pre_checks.yaml) - {{ task_prefix }} - Get account information"
ansible.builtin.command: >-
az account show --query user --output yaml
vars:
task_prefix: Storage Account validation
delegate_to: localhost
register: azresult
ignore_errors: true
changed_when: false
- name: "(pre_checks.yaml) - {{ task_prefix }} - Show account information"
ansible.builtin.debug:
var: azresult
# -------------------------------------+---------------------------------------8
# Step: 09
# Description:
#
- name: "(pre_checks.yaml) - Set SAS Token"
ansible.builtin.set_fact:
sapbits_sas_token: "{{ sapbits_access_key }}"
no_log: true # censor output of secret
when:
- sapbits_access_key is defined
- sapbits_sas_token is not defined
# Step: 09 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 10
# Description:
#
- name: "(pre_checks.yaml) - Set sa_enabled: true"
ansible.builtin.set_fact:
sa_enabled: true
when:
- "sapbits_location_base_path is defined" # Has the variable been defined
- "sapbits_location_base_path | trim | length != 0" # and given a value
- not allowSharedKeyAccess or (sapbits_sas_token is defined and (sapbits_sas_token | trim | length != 0))
# - "sapbits_access_key is defined" # Has the variable been defined
# - "sapbits_access_key | trim | length != 0" # and given a value
# - "sapbits_sas_token is defined" # Has the variable been defined
# - "sapbits_sas_token | trim | length != 0" # and given a value
# Step: 10 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 11
# Description:
#
- name: "(pre_checks.yaml) - {{ task_prefix }} - Check storage account container when using SAS Token"
ansible.builtin.command: >-
az storage blob upload
--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 }}/archives
--name readme.md
--file {{ readme_file.dest }}
--if-none-match "*"
--no-progress
vars:
task_prefix: Storage Account validation
delegate_to: localhost
register: azresult
ignore_errors: true
changed_when: false
failed_when:
- azresult.rc != 0
- azresult.stderr is defined
- azresult.stderr.find("BlobAlreadyExists") == -1
no_log: true # censor output of secret
when:
- sa_enabled
- allowSharedKeyAccess
- name: "(pre_checks.yaml) - {{ task_prefix }} - Check storage account container"
ansible.builtin.command: >-
az storage blob upload
--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 }}/archives
--name readme.md
--file {{ readme_file.dest }}
--if-none-match "*"
--no-progress
vars:
task_prefix: Storage Account validation
delegate_to: localhost
register: azresult
ignore_errors: true
changed_when: false
failed_when:
- azresult.rc != 0
- azresult.stderr is defined
- azresult.stderr.find("BlobAlreadyExists") == -1
no_log: true # censor output of secret
when:
- sa_enabled
- not allowSharedKeyAccess
# Step: 11 - END
# -------------------------------------+---------------------------------------8
# -------------------------------------+---------------------------------------8
# Step: 12
# Description: Informational check of Storage Account parameters.
#
# - sapbits_location_base_path
# - sapbits_access_key
# - sapbits_sas_token
- name: "(pre_checks.yaml) - Informational check of Storage Account parameters"
ansible.builtin.assert:
that:
- "sapbits_location_base_path is defined" # Has the variable been defined
- "sapbits_location_base_path | trim | length != 0" # and given a value
success_msg: |-
Storage Account access ENABLED
sa_enabled: {{ sa_enabled }}
fail_msg: |-
Storage Account access DISABLED
sa_enabled: {{ sa_enabled }}
failed_when: false
- name: "Storage account information"
ansible.builtin.debug:
msg: # Best method for formatting output with Azure Devops Logs
- "Storage account_name: {{ account_name }}"
- "allowSharedKeyAccess: {{ allowSharedKeyAccess }}"
- name: "(pre_checks.yaml) - Informational check of Storage Account parameters"
when: allowSharedKeyAccess
ansible.builtin.assert:
that:
- "sapbits_access_key is defined" # Has the variable been defined
- "sapbits_access_key | trim | length != 0" # and given a value
- "sapbits_sas_token is defined" # Has the variable been defined
- "sapbits_sas_token | trim | length != 0" # and given a value
success_msg: |-
Storage Account access ENABLED
sa_enabled: {{ sa_enabled }}
fail_msg: |-
Storage Account access DISABLED
sa_enabled: {{ sa_enabled }}
failed_when: false
# Step: 12 - END
# -------------------------------------+---------------------------------------8
...
# /*---------------------------------------------------------------------------8
# | END |
# +------------------------------------4--------------------------------------*/