Skip to content
Merged
181 changes: 181 additions & 0 deletions roles/common/tasks/verify-host.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
# Copyright (c) 2026, Itential, Inc
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
---
# Common host verification tasks
# This task file expects the following variables to be set:
# - component_name: Name of the component being verified (e.g., "Redis", "Platform", "MongoDB")
# - hw_specs_var_name: Name of the hardware specs variable (e.g., "redis_hw_specs", "platform_hw_specs")

- name: Assert that required platform_release variable is defined
ansible.builtin.assert:
that: platform_release is defined
fail_msg: "platform_release must be defined in the inventory"

- name: Assert that required env variable is defined
ansible.builtin.assert:
that: env is defined
fail_msg: "platform_release must be defined in the inventory"

- name: Announce Intention
ansible.builtin.debug:
msg: "Validating {{ env }} host {{ inventory_hostname }} for {{ component_name }} installation..."

- name: Gather host information
itential.deployer.gather_host_information:
register: host_info

- name: Extract OS information
ansible.builtin.set_fact:
os: "{{ host_info.os }}"

# OS and Architecture validation
- name: Check OS compatibility
ansible.builtin.set_fact:
os_valid: >-
{{
(os.distribution == 'RedHat' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'Rocky' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'OracleLinux' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'Amazon' and ansible_distribution_major_version == '2023')
}}

- name: Assert that this is a supported OS
ansible.builtin.assert:
that: "{{ os_valid }} == true"
fail_msg: "{{ os.distribution }} {{ os.distribution_version }} is not a supported OS!"
success_msg: "OS validation passed!"
quiet: true

- name: Check architecture compatibility
ansible.builtin.set_fact:
arch_valid: "{{ os.architecture in ['x86_64', 'aarch64'] }}"

- name: Assert that this is a supported Architecture
ansible.builtin.assert:
that: "{{ arch_valid }} == true"
fail_msg: "{{ os.architecture }} is not a supported architecture!"
success_msg: "Architecture validation passed!"
quiet: true

- name: Initialize validation errors list
ansible.builtin.set_fact:
validation_errors: []

- name: Get root partition size
ansible.builtin.set_fact:
root_disk_size_gb: "{{ (ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_total') | first / 1024 / 1024 / 1024) | round(2) }}"
when: ansible_mounts | selectattr('mount', 'equalto', '/') | list | length > 0

- name: Validate hardware specs against requirements
ansible.builtin.set_fact:
hardware_validation:
required:
cpu_count: "{{ vars[hw_specs_var_name][env].cpu_count if vars[hw_specs_var_name] != 'none' else 'N/A' }}"
ram_size_gb: "{{ vars[hw_specs_var_name][env].ram_size if vars[hw_specs_var_name] != 'none' else 'N/A' }}"
disk_size_gb: "{{ vars[hw_specs_var_name][env].disk_size if vars[hw_specs_var_name] != 'none' else 'N/A' }}"
actual:
cpu_count: "{{ ansible_processor_vcpus }}"
ram_size_gb: "{{ (ansible_memtotal_mb / 1024) | round(2) }}"
disk_size_gb: "{{ root_disk_size_gb | default('N/A') }}"
validation:
cpu_valid: "{{ (env == 'none') or (ansible_processor_vcpus >= vars[hw_specs_var_name][env].cpu_count) }}"
ram_valid: "{{ (env == 'none') or ((ansible_memtotal_mb / 1024) >= vars[hw_specs_var_name][env].ram_size) }}"
disk_valid: "{{ (env == 'none') or ((root_disk_size_gb | default(0) | float) >= vars[hw_specs_var_name][env].disk_size) }}"
all_valid: "{{ (env == 'none') or ((ansible_processor_vcpus >= vars[hw_specs_var_name][env].cpu_count) and ((ansible_memtotal_mb / 1024) >= vars[hw_specs_var_name][env].ram_size) and ((root_disk_size_gb | default(0) | float) >= vars[hw_specs_var_name][env].disk_size)) }}"

- name: Validate CPU Count
ansible.builtin.assert:
that: hardware_validation.validation.cpu_valid | bool
fail_msg: "CPU validation failed!"
quiet: true
ignore_errors: true
register: cpu_validation

- name: Add CPU error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['CPU: ' ~ hardware_validation.required.cpu_count ~ ' required, ' ~ hardware_validation.actual.cpu_count ~ ' found'] }}"
when: cpu_validation is failed

- name: Validate memory amount
ansible.builtin.assert:
that: hardware_validation.validation.ram_valid | bool
fail_msg: "Memory validation failed!"
quiet: true
ignore_errors: true
register: memory_validation

- name: Add memory error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['RAM: ' ~ hardware_validation.required.ram_size_gb ~ 'GB required, ' ~ hardware_validation.actual.ram_size_gb ~ 'GB found'] }}"
when: memory_validation is failed

- name: Validate disk size
ansible.builtin.assert:
that: hardware_validation.validation.disk_valid | bool
fail_msg: "Disk validation failed!"
quiet: true
ignore_errors: true
register: disk_validation

- name: Add disk error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['Disk: ' ~ hardware_validation.required.disk_size_gb ~ 'GB required, ' ~ hardware_validation.actual.disk_size_gb ~ 'GB found'] }}"
when: disk_validation is failed

- name: Print host information
ansible.builtin.debug:
msg: "{{ host_info }}"

# Check for proxy
- name: Check for proxy settings in environment variables
ansible.builtin.shell: set -o pipefail && env | grep -i proxy
register: env_proxy
failed_when: false
changed_when: false

- name: Check for proxy settings in /etc/environment
ansible.builtin.shell: set -o pipefail && grep -i proxy /etc/environment
register: etc_env_proxy
failed_when: false
changed_when: false

- name: Check for proxy settings in /etc/profile.d
ansible.builtin.shell: set -o pipefail && grep -ri proxy /etc/profile.d/
register: profiled_proxy
failed_when: false
changed_when: false

- name: Display all proxy findings
ansible.builtin.debug:
msg:
- "Environment variables: {{ env_proxy.stdout_lines | default([]) }}"
- "/etc/environment: {{ etc_env_proxy.stdout_lines | default([]) }}"
- "/etc/profile.d: {{ profiled_proxy.stdout_lines | default([]) }}"

- name: Assert that there are no proxy settings
ansible.builtin.assert:
that:
- env_proxy.stdout_lines | length == 0
- etc_env_proxy.stdout_lines | length == 0
- profiled_proxy.stdout_lines | length == 0
fail_msg: "A Proxy was detected!"
quiet: true
ignore_errors: true
register: proxy_validation

# Display results
- name: Display failed validation results
ansible.builtin.debug:
msg: "{{ validation_errors }}"
when: cpu_validation is failed or memory_validation is failed or disk_validation is failed

# Assert that none of the tests failed
- name: Verify that all tests passed
ansible.builtin.assert:
that:
- "cpu_validation is not failed"
- "memory_validation is not failed"
- "disk_validation is not failed"
- "proxy_validation is not failed"
fail_msg: "See above, assertions not passed! ✗"
success_msg: "All assertions passed! ✓"
132 changes: 8 additions & 124 deletions roles/mongodb/tasks/verify-mongodb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
---

- name: Announce Intention
ansible.builtin.debug:
msg: "Validating {{ env }} host {{ inventory_hostname }} for MongoDB installation..."

- name: Load Itential Platform release default variables
ansible.builtin.include_vars:
file: "{{ item }}"
Expand All @@ -14,124 +10,12 @@
- "platform-release-{{ platform_release | string | split('.') | first }}.yml"
- "platform-release-undefined.yml"

- name: Gather host information
itential.deployer.gather_host_information:
register: host_info

- name: Extract OS information
ansible.builtin.set_fact:
os: "{{ host_info.os }}"

# OS and Architecture validation
- name: Check OS compatibility
ansible.builtin.set_fact:
os_valid: >-
{{
(os.distribution == 'RedHat' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'Rocky' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'OracleLinux' and ansible_distribution_major_version in ['8', '9']) or
(os.distribution == 'Amazon' and ansible_distribution_major_version == '2023')
}}

- name: Assert that this is a supported OS
ansible.builtin.assert:
that: "{{ os_valid }} == true"
fail_msg: "{{ os.distribution }} {{ os.distribution_version }} is not a supported OS!"
success_msg: "OS validation passed!"
quiet: true

- name: Check architecture compatibility
ansible.builtin.set_fact:
arch_valid: "{{ os.architecture in ['x86_64', 'aarch64'] }}"

- name: Assert that this is a supported Architecture
ansible.builtin.assert:
that: "{{ arch_valid }} == true"
fail_msg: "{{ os.architecture }} is not a supported architecture!"
success_msg: "Architecture validation passed!"
quiet: true

- name: Initialize validation errors list
ansible.builtin.set_fact:
validation_errors: []

- name: Get root partition size
ansible.builtin.set_fact:
root_disk_size_gb: "{{ (ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_total') | first / 1024 / 1024 / 1024) | round(2) }}"
when: ansible_mounts | selectattr('mount', 'equalto', '/') | list | length > 0

- name: Validate hardware specs against requirements
ansible.builtin.set_fact:
hardware_validation:
required:
cpu_count: "{{ mongodb_hw_specs[env].cpu_count if mongodb_hw_specs != 'none' else 'N/A' }}"
ram_size_gb: "{{ mongodb_hw_specs[env].ram_size if mongodb_hw_specs != 'none' else 'N/A' }}"
disk_size_gb: "{{ mongodb_hw_specs[env].disk_size if mongodb_hw_specs != 'none' else 'N/A' }}"
actual:
cpu_count: "{{ ansible_processor_vcpus }}"
ram_size_gb: "{{ (ansible_memtotal_mb / 1024) | round(2) }}"
disk_size_gb: "{{ root_disk_size_gb | default('N/A') }}"
validation:
cpu_valid: "{{ (env == 'none') or (ansible_processor_vcpus >= mongodb_hw_specs[env].cpu_count) }}"
ram_valid: "{{ (env == 'none') or ((ansible_memtotal_mb / 1024) >= mongodb_hw_specs[env].ram_size) }}"
disk_valid: "{{ (env == 'none') or ((root_disk_size_gb | default(0) | float) >= mongodb_hw_specs[env].disk_size) }}"
all_valid: "{{ (env == 'none') or ((ansible_processor_vcpus >= mongodb_hw_specs[env].cpu_count) and ((ansible_memtotal_mb / 1024) >= mongodb_hw_specs[env].ram_size) and ((root_disk_size_gb | default(0) | float) >= mongodb_hw_specs[env].disk_size)) }}"

- name: Validate CPU Count
ansible.builtin.assert:
that: hardware_validation.validation.cpu_valid | bool
fail_msg: "CPU validation failed!"
quiet: true
ignore_errors: true
register: cpu_validation

- name: Add CPU error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['CPU: ' ~ hardware_validation.required.cpu_count ~ ' required, ' ~ hardware_validation.actual.cpu_count ~ ' found'] }}"
when: cpu_validation is failed

- name: Validate memory amount
ansible.builtin.assert:
that: hardware_validation.validation.ram_valid | bool
fail_msg: "Memory validation failed!"
quiet: true
ignore_errors: true
register: memory_validation

- name: Add memory error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['RAM: ' ~ hardware_validation.required.ram_size_gb ~ 'GB required, ' ~ hardware_validation.actual.ram_size_gb ~ 'GB found'] }}"
when: memory_validation is failed

- name: Validate disk size
ansible.builtin.assert:
that: hardware_validation.validation.disk_valid | bool
fail_msg: "Disk validation failed!"
quiet: true
ignore_errors: true
register: disk_validation

- name: Add disk error to list
ansible.builtin.set_fact:
validation_errors: "{{ validation_errors + ['Disk: ' ~ hardware_validation.required.disk_size_gb ~ 'GB required, ' ~ hardware_validation.actual.disk_size_gb ~ 'GB found'] }}"
when: disk_validation is failed

- name: Print host information
ansible.builtin.debug:
msg: "{{ host_info }}"

# Display results
- name: Display failed validation results
ansible.builtin.debug:
msg: "{{ validation_errors }}"
when: cpu_validation is failed or memory_validation is failed or disk_validation is failed
- name: Verify MongoDB host requirements
ansible.builtin.include_role:
name: common
tasks_from: verify-host
vars:
component_name: "MongoDB"
hw_specs_var_name: "mongodb_hw_specs"

# Assert that none of the tests failed
- name: Verify that all tests passed
ansible.builtin.assert:
that:
- "cpu_validation is not failed"
- "memory_validation is not failed"
- "disk_validation is no failed"
fail_msg: "See above, assertions not passed! ✗"
success_msg: "All assertions passed! ✓"
# mongodb specific verification tasks go here...
Loading