Skip to content

Commit 7b7eb0e

Browse files
authored
Merge pull request #114 from marcelmamula/validation
sap_vm_provision: Add variable validations
2 parents 48824f6 + 76c604f commit 7b7eb0e

File tree

11 files changed

+741
-15
lines changed

11 files changed

+741
-15
lines changed
Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
11
---
2-
3-
#### Provision host/s for Deployment of SAP Software (as part of an SAP Software Solution Scenario e.g. SAP S/4HANA Distributed HA) ####
4-
5-
- name: Begin execution
2+
# Block is required for 'delegate_facts'.
3+
- name: Main Block
64
delegate_to: "{{ sap_vm_provision_execution_host }}"
75
delegate_facts: false # keep facts with the original play hosts, not the delegated host
86
block:
97

10-
- name: Execute to target {{ sap_vm_provision_iac_platform }} using {{ sap_vm_provision_iac_type }}
11-
ansible.builtin.include_tasks: "{{ 'platform_' + sap_vm_provision_iac_type }}/{{ sap_vm_provision_iac_platform }}/execute_main.yml"
12-
when: not sap_vm_provision_iac_post_deployment is defined or not sap_vm_provision_iac_post_deployment
8+
- name: Block with simplified task file variable
9+
vars:
10+
__sap_vm_provision_task_file: "{{ 'platform_' + sap_vm_provision_iac_type }}/{{ sap_vm_provision_iac_platform }}"
11+
block:
1312

13+
#### Validate required variables ####
14+
- name: Validate required variables for platform {{ sap_vm_provision_iac_platform }} using {{ sap_vm_provision_iac_type }}
15+
ansible.builtin.include_tasks:
16+
file: validate_variables.yml
1417

15-
#### Post Deployment of SAP - tasks for GCP, IBM Cloud, MS Azure ####
1618

17-
- name: Begin execution
18-
delegate_to: "{{ sap_vm_provision_execution_host }}"
19-
delegate_facts: false # keep facts with the original play hosts, not the delegated host
20-
block:
19+
#### Provision host/s for Deployment of SAP Software (as part of an SAP Software Solution Scenario e.g. SAP S/4HANA Distributed HA) ####
20+
- name: Provision hosts to platform {{ sap_vm_provision_iac_platform }} using {{ sap_vm_provision_iac_type }}
21+
ansible.builtin.include_tasks:
22+
file: "{{ __sap_vm_provision_task_file }}/execute_main.yml"
23+
when:
24+
- sap_vm_provision_iac_post_deployment is not defined or not sap_vm_provision_iac_post_deployment
25+
2126

22-
- name: Execute Post Deployment tasks for SAP on target {{ sap_vm_provision_iac_platform }} using {{ sap_vm_provision_iac_type }}
23-
ansible.builtin.include_tasks: "{{ 'platform_' + sap_vm_provision_iac_type }}/{{ sap_vm_provision_iac_platform }}/post_deployment_execute.yml"
24-
when: sap_vm_provision_iac_post_deployment is defined and sap_vm_provision_iac_post_deployment
27+
#### Post Deployment of SAP - tasks for GCP, IBM Cloud, MS Azure ####
28+
- name: Execute Post Deployment tasks on platform {{ sap_vm_provision_iac_platform }} using {{ sap_vm_provision_iac_type }}
29+
ansible.builtin.include_tasks:
30+
file: "{{ 'platform_' + sap_vm_provision_iac_type }}/{{ sap_vm_provision_iac_platform }}/post_deployment_execute.yml"
31+
when:
32+
- sap_vm_provision_iac_post_deployment is defined
33+
- sap_vm_provision_iac_post_deployment
34+
# Execute only for files that are present
35+
- (role_path ~ '/tasks/' ~ __sap_vm_provision_task_file ~ '/post_deployment_execute.yml') is file
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
#### Validate required variables ####
3+
# This file servers starting point for validation of all required variables. Validation order:
4+
# 1. Mandatory shared variables.
5+
# 2. Specific to 'sap_vm_provision_iac_type', if file exists.
6+
# 3. Specific to 'sap_vm_provision_iac_platform', if file exists.
7+
# 4. Specific to bastion, if 'sap_vm_provision_bastion_execution' is true.
8+
9+
# Lookup if variable is defined is using default 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED',
10+
# which is required to ensure compatibility between ansible-core versions.
11+
12+
- name: Assert that the variable 'sap_vm_provision_iac_type' is defined and valid
13+
ansible.builtin.assert:
14+
that:
15+
- sap_vm_provision_iac_type is defined
16+
- sap_vm_provision_iac_type is string
17+
- sap_vm_provision_iac_type in ['ansible', 'ansible_to_terraform']
18+
fail_msg: |
19+
The variable 'sap_vm_provision_iac_type' is undefined or invalid.
20+
Available options: ansible, ansible_to_terraform
21+
22+
- name: Assert that the variable 'sap_vm_provision_iac_platform' is defined and valid
23+
ansible.builtin.assert:
24+
that:
25+
- sap_vm_provision_iac_platform is defined
26+
- sap_vm_provision_iac_platform is string
27+
- sap_vm_provision_iac_platform in ['aws_ec2_vs', 'gcp_ce_vm', 'msazure_vm', 'ibmcloud_powervs', 'ibmcloud_vs', 'ibmpowervm_vm', 'kubevirt_vm', 'ovirt_vm', 'vmware_vm']
28+
fail_msg: |
29+
The variable 'sap_vm_provision_iac_platform' is undefined or invalid.
30+
Available options: aws_ec2_vs, gcp_ce_vm, msazure_vm, ibmcloud_powervs, ibmcloud_vs, ibmpowervm_vm, kubevirt_vm, ovirt_vm, vmware_vm
31+
32+
33+
- name: Block to validate host_specifications_dictionary
34+
vars:
35+
__sap_vm_provision_host_dictionary_name: "{{ 'sap_vm_provision_' ~ sap_vm_provision_iac_platform ~ '_host_specifications_dictionary' }}"
36+
# no_log: true
37+
block:
38+
- name: Assert that the variable {{ __sap_vm_provision_host_dictionary_name }} is defined and valid
39+
ansible.builtin.assert:
40+
that:
41+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name) is defined
42+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name) is mapping
43+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name) | length > 0
44+
fail_msg: |
45+
The variable {{ __sap_vm_provision_host_dictionary_name }} is undefined or invalid.
46+
It must be a non-empty dictionary.
47+
48+
- name: Assert that the variable 'sap_vm_provision_host_specification_plan' is defined and valid
49+
ansible.builtin.assert:
50+
that:
51+
- sap_vm_provision_host_specification_plan is defined
52+
- sap_vm_provision_host_specification_plan is string
53+
- sap_vm_provision_host_specification_plan | trim | length > 0
54+
fail_msg: |
55+
The variable 'sap_vm_provision_host_specification_plan' is undefined or invalid.
56+
It must be a non-empty string.
57+
58+
- name: Assert that the value of variable 'sap_vm_provision_host_specification_plan' is present in a dictionary
59+
ansible.builtin.assert:
60+
that:
61+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name)[sap_vm_provision_host_specification_plan] is defined
62+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name)[sap_vm_provision_host_specification_plan] is mapping
63+
- lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name)[sap_vm_provision_host_specification_plan] | length > 0
64+
fail_msg: |
65+
The value of variable 'sap_vm_provision_host_specification_plan' is not present in a dictionary {{ __sap_vm_provision_host_dictionary_name }}.
66+
67+
- name: Set fact with content of the key 'sap_vm_provision_host_specification_plan'
68+
ansible.builtin.set_fact:
69+
__sap_vm_provision_host_dictionary_name:
70+
"{{ lookup('ansible.builtin.vars', __sap_vm_provision_host_dictionary_name)[sap_vm_provision_host_specification_plan] }}"
71+
72+
73+
# Validation specific to 'sap_vm_provision_iac_type'
74+
- name: Include task for validation of {{ sap_vm_provision_iac_type }} variables
75+
ansible.builtin.include_tasks:
76+
file: "validations/platform_{{ sap_vm_provision_iac_type }}.yml"
77+
when:
78+
- (role_path ~ '/tasks/validations/platform_' ~ sap_vm_provision_iac_type ~ '.yml') is file
79+
80+
81+
# Validation specific to 'sap_vm_provision_iac_platform'
82+
- name: Include task for validation of {{ sap_vm_provision_iac_platform }} variables
83+
ansible.builtin.include_tasks:
84+
file: "validations/{{ sap_vm_provision_iac_platform }}.yml"
85+
when:
86+
- (role_path ~ '/tasks/validations/' ~ sap_vm_provision_iac_platform ~ '.yml') is file
87+
88+
89+
# Validation specific to bastion
90+
- name: Include task for validation of bastion variables
91+
ansible.builtin.include_tasks:
92+
file: "validations/bastion.yml"
93+
when: sap_vm_provision_bastion_execution
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
#### Validate required variables for specific 'sap_vm_provision_iac_platform ####
3+
4+
- name: Assert that string variables are valid for {{ sap_vm_provision_iac_platform }}
5+
ansible.builtin.assert:
6+
that:
7+
- lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') != 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED'
8+
- lookup('ansible.builtin.vars', item) is string
9+
- lookup('ansible.builtin.vars', item) | trim | length > 0
10+
fail_msg: |
11+
{% if lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') == 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED' %}
12+
The variable '{{ item }}' is undefined.
13+
{% elif lookup('ansible.builtin.vars', item) is not string %}
14+
The variable '{{ item }}' is not a String.
15+
{% else %}
16+
The variable '{{ item }}' is empty.
17+
{% endif %}
18+
loop:
19+
- sap_vm_provision_aws_access_key
20+
- sap_vm_provision_aws_secret_access_key
21+
- sap_vm_provision_aws_region
22+
- sap_vm_provision_aws_vpc_availability_zone
23+
- sap_vm_provision_aws_vpc_subnet_id
24+
- sap_vm_provision_aws_ec2_vs_host_os_image
25+
26+
27+
- name: Assert that string variables are valid for {{ sap_vm_provision_iac_platform }} using 'ansible'
28+
ansible.builtin.assert:
29+
that:
30+
- lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') != 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED'
31+
- lookup('ansible.builtin.vars', item) is string
32+
- lookup('ansible.builtin.vars', item) | trim | length > 0
33+
fail_msg: |
34+
{% if lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') == 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED' %}
35+
The variable '{{ item }}' is undefined.
36+
{% elif lookup('ansible.builtin.vars', item) is not string %}
37+
The variable '{{ item }}' is not a String.
38+
{% else %}
39+
The variable '{{ item }}' is empty.
40+
{% endif %}
41+
loop:
42+
- sap_vm_provision_aws_vpc_sg_names
43+
- sap_vm_provision_aws_key_pair_name_ssh_host_public_key
44+
- sap_vm_provision_aws_placement_resource_name
45+
- sap_vm_provision_aws_ha_iam_role
46+
- sap_vm_provision_aws_ha_iam_instance_profile
47+
when:
48+
- sap_vm_provision_iac_type == 'ansible'
49+
50+
51+
- name: Assert that boolean variables are valid for {{ sap_vm_provision_iac_platform }}
52+
ansible.builtin.assert:
53+
that:
54+
- lookup('ansible.builtin.vars', __sap_vm_provision_loop_bool_var, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') != 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED'
55+
- lookup('ansible.builtin.vars', __sap_vm_provision_loop_bool_var) is boolean
56+
- lookup('ansible.builtin.vars', __sap_vm_provision_loop_bool_var) | trim | length > 0
57+
fail_msg: |
58+
{% if lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') == 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED' %}
59+
The variable '{{ __sap_vm_provision_loop_bool_var }}' is undefined.
60+
{% elif lookup('ansible.builtin.vars', item) is not boolean %}
61+
The variable '{{ __sap_vm_provision_loop_bool_var }}' is not a Boolean.
62+
{% else %}
63+
The variable '{{ __sap_vm_provision_loop_bool_var }}' is empty.
64+
{% endif %}
65+
loop:
66+
- sap_vm_provision_aws_vpc_subnet_create_boolean
67+
- sap_vm_provision_aws_placement_strategy_spread
68+
- sap_vm_provision_aws_dns_overwrite
69+
vars:
70+
__sap_vm_provision_loop_bool_var: "{{ item }}"
71+
72+
73+
- name: Block to validate host_specifications_dictionary
74+
vars:
75+
__sap_vm_provision_os_image_dictionary_name: "{{ 'sap_vm_provision_' ~ sap_vm_provision_iac_platform ~ '_host_os_image_dictionary' }}"
76+
__sap_vm_provision_os_image_name: "{{ 'sap_vm_provision_' ~ sap_vm_provision_iac_platform ~ '_host_os_image' }}"
77+
__sap_vm_provision_os_image_value: "{{ lookup('ansible.builtin.vars', __sap_vm_provision_os_image_name) }}"
78+
block:
79+
- name: Assert that the variable {{ __sap_vm_provision_os_image_dictionary_name }} is defined and valid
80+
ansible.builtin.assert:
81+
that:
82+
- lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name) is defined
83+
- lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name) is mapping
84+
- lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name) | length > 0
85+
fail_msg: |
86+
The variable {{ __sap_vm_provision_os_image_dictionary_name }} is undefined or invalid.
87+
It must be a non-empty dictionary.
88+
89+
- name: Assert that the value of variable {{ __sap_vm_provision_os_image_name }} is present in a dictionary
90+
ansible.builtin.assert:
91+
that:
92+
- lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name)[__sap_vm_provision_os_image_value] is defined
93+
- lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name)[__sap_vm_provision_os_image_value] | length > 0
94+
fail_msg: |
95+
Invalid value '{{ __sap_vm_provision_os_image_value }}' provided for the variable '{{ __sap_vm_provision_os_image_name }}'.
96+
Available options: {{ lookup('ansible.builtin.vars', __sap_vm_provision_os_image_dictionary_name).keys() | list | join(', ') }}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
#### Validate required variables for bastion ####
3+
# Note: 'ansible_to_terraform' uses bastion, but not all variables
4+
5+
- name: Assert that string variables are valid for bastion
6+
ansible.builtin.assert:
7+
that:
8+
- lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') != 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED'
9+
- lookup('ansible.builtin.vars', item) is string
10+
- lookup('ansible.builtin.vars', item) | trim | length > 0
11+
fail_msg: |
12+
{% if lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') == 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED' %}
13+
The variable '{{ item }}' is undefined.
14+
{% elif lookup('ansible.builtin.vars', item) is not string %}
15+
The variable '{{ item }}' is not a String.
16+
{% else %}
17+
The variable '{{ item }}' is empty.
18+
{% endif %}
19+
loop:
20+
- sap_vm_provision_bastion_public_ip
21+
- sap_vm_provision_bastion_user
22+
- sap_vm_provision_ssh_bastion_private_key_file_path
23+
when:
24+
- sap_vm_provision_iac_type == 'ansible'
25+
26+
27+
- name: Assert that string or integer variables are valid for bastion
28+
ansible.builtin.assert:
29+
that:
30+
- lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') != 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED'
31+
- lookup('ansible.builtin.vars', item) is string or lookup('ansible.builtin.vars', item) is integer
32+
- lookup('ansible.builtin.vars', item) | trim | length > 0
33+
fail_msg: |
34+
{% if lookup('ansible.builtin.vars', item, default='SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED') == 'SAP_VM_PROVISION_UNDEFINED_VARIABLE_DETECTED' %}
35+
The variable '{{ item }}' is undefined.
36+
{% elif lookup('ansible.builtin.vars', item) is not string and lookup('ansible.builtin.vars', item) is not integer %}
37+
The variable '{{ item }}' is not a String or an Integer.
38+
{% else %}
39+
The variable '{{ item }}' is empty.
40+
{% endif %}
41+
loop:
42+
- sap_vm_provision_bastion_ssh_port
43+
when:
44+
- sap_vm_provision_iac_type == 'ansible'

0 commit comments

Comments
 (0)