Files
ansible_proxmox_VM/tasks/preflight-checks.yml

135 lines
4.1 KiB
YAML

---
# preflight-checks.yml - Validate environment before running main tasks
- name: "[PREFLIGHT] Check if running on Proxmox host"
ansible.builtin.stat:
path: "/etc/pve/nodes"
register: pve_nodes
failed_when: not pve_nodes.stat.exists
changed_when: false
- name: "[PREFLIGHT] Verify qm command is available"
ansible.builtin.command: which qm
changed_when: false
failed_when: false
register: qm_check
- name: "[PREFLIGHT] Fail if qm not found"
ansible.builtin.fail:
msg: "qm command not found. This role requires Proxmox VE to be installed."
when: qm_check.rc != 0
- name: "[PREFLIGHT] Check if user can run qm commands"
ansible.builtin.command: qm --help
become: true
changed_when: false
register: qm_version
- name: "[PREFLIGHT] Display Proxmox version"
ansible.builtin.debug:
msg: "Proxmox Version: {{ qm_version.stdout }}"
- name: "[PREFLIGHT] Verify storage pool exists"
ansible.builtin.command: "pvesm status {{ storage }}"
changed_when: false
failed_when: false
register: storage_check
- name: "[PREFLIGHT] Fail if storage not found"
ansible.builtin.fail:
msg: "Storage pool '{{ storage }}' not found. Available pools: run 'pvesm status'"
when: storage_check.rc != 0
- name: Combine SSH public keys into one file
ansible.builtin.copy:
dest: '{{ ssh_keys_file }}'
content: |
{% for key in ssh_public_keys %}
{{ key }}
{% endfor %}
mode: '0644'
- name: "[PREFLIGHT] Check SSH key file exists"
ansible.builtin.stat:
path: "{{ ssh_keys_file | expanduser }}"
register: ssh_key_file
failed_when: not ssh_key_file.stat.exists
changed_when: false
# - name: "[PREFLIGHT] Check SSH key file exists"
# ansible.builtin.stat:
# path: "{{ ssh_key_path | expanduser }}"
# register: ssh_key_file
# failed_when: not ssh_key_file.stat.exists
# changed_when: false
- name: "[PREFLIGHT] Validate VM ID is unique"
ansible.builtin.command: "test ! -f /etc/pve/qemu-server/{{ vm_id }}.conf"
changed_when: false
failed_when: false
register: vm_id_check
- name: "[PREFLIGHT] Warn if VM ID already exists"
ansible.builtin.debug:
msg: "WARNING: VM ID {{ vm_id }} already exists. It will be skipped or updated."
when: vm_id_check.rc != 0
- name: "[PREFLIGHT] Validate clone IDs are unique"
ansible.builtin.command: "test ! -f /etc/pve/qemu-server/{{ item.id }}.conf"
changed_when: false
failed_when: false
loop: "{{ clones }}"
register: clone_id_checks
when: create_clones | default(false)
- name: "[PREFLIGHT] Warn if any clone IDs already exist"
ansible.builtin.debug:
msg: "WARNING: Clone ID {{ item.item.id }} already exists and will be skipped."
loop: "{{ clone_id_checks.results }}"
when: item.rc != 0 and create_clones | default(false)
- name: "[PREFLIGHT] Validate IP address format for clones"
ansible.builtin.assert:
that:
- "item.ip | ipaddr"
fail_msg: "Invalid IP address for clone {{ item.id }}: {{ item.ip }}"
loop: "{{ clones }}"
when: create_clones | default(false)
- name: "[PREFLIGHT] Validate static IP address format (if not DHCP)"
ansible.builtin.assert:
that:
- "ip_address | ipaddr"
fail_msg: "Invalid static IP address: {{ ip_address }}"
when: ip_mode == 'static'
- name: "[PREFLIGHT] Validate gateway IP address"
ansible.builtin.assert:
that:
- "gateway | ipaddr"
fail_msg: "Invalid gateway IP address: {{ gateway }}"
- name: "[PREFLIGHT] Validate DNS servers"
ansible.builtin.assert:
that:
- "item | ipaddr"
fail_msg: "Invalid DNS server IP: {{ item }}"
loop: "{{ dns }}"
when: dns is defined and dns | length > 0
- name: "[PREFLIGHT] Check snippets storage exists"
ansible.builtin.stat:
path: "/var/lib/vz/snippets"
register: snippets_dir
failed_when: not snippets_dir.stat.exists
changed_when: false
- name: "[PREFLIGHT] Summary - All checks passed"
ansible.builtin.debug:
msg: |
✓ Proxmox environment validated
✓ Storage pool '{{ storage }}' available
✓ SSH key found at {{ ssh_key_path }}
✓ VM ID {{ vm_id }} is available
✓ Ready to create VM: {{ hostname }}