testing new proxmox logic
This commit is contained in:
18
roles/proxmox_preflight/defaults/main.yml
Normal file
18
roles/proxmox_preflight/defaults/main.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
# =============================================================================
|
||||
# proxmox_preflight — defaults
|
||||
# =============================================================================
|
||||
|
||||
# Minimum number of nodes that must be online before proceeding
|
||||
preflight_min_nodes_online: 1
|
||||
|
||||
# Abort if any node is offline (set false to warn only)
|
||||
preflight_abort_on_offline_node: true
|
||||
|
||||
# Quorum check via pvecm (SSH)
|
||||
preflight_check_quorum: true
|
||||
|
||||
# API connection (inherited from inventory)
|
||||
# api_host, api_port, api_user, api_token_id, api_token_secret
|
||||
api_port: 8006
|
||||
validate_certs: false
|
||||
11
roles/proxmox_preflight/meta/main.yml
Normal file
11
roles/proxmox_preflight/meta/main.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
galaxy_info:
|
||||
role_name: proxmox_preflight
|
||||
author: ansible-msp
|
||||
description: "MSP Proxmox automation — proxmox_preflight"
|
||||
min_ansible_version: "2.15"
|
||||
platforms:
|
||||
- name: Debian
|
||||
versions:
|
||||
- bookworm
|
||||
dependencies: []
|
||||
113
roles/proxmox_preflight/tasks/main.yml
Normal file
113
roles/proxmox_preflight/tasks/main.yml
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
# =============================================================================
|
||||
# proxmox_preflight — tasks
|
||||
# Determines: standalone vs cluster, node health, quorum, CEPH state
|
||||
# Sets facts: proxmox_is_cluster, proxmox_cluster_nodes, proxmox_node_count
|
||||
# =============================================================================
|
||||
|
||||
# ── Detect standalone vs cluster ──────────────────────────────────────────────
|
||||
- name: "Preflight | Detect cluster membership"
|
||||
ansible.builtin.command: pvecm status
|
||||
register: pvecm_status
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: "Preflight | Set cluster mode fact"
|
||||
ansible.builtin.set_fact:
|
||||
proxmox_is_cluster: "{{ pvecm_status.rc == 0 }}"
|
||||
delegate_to: localhost
|
||||
|
||||
- name: "Preflight | Log topology"
|
||||
ansible.builtin.debug:
|
||||
msg: >-
|
||||
Node {{ inventory_hostname }} is running in
|
||||
{{ 'CLUSTER' if proxmox_is_cluster else 'STANDALONE' }} mode.
|
||||
|
||||
# ── Standalone path ───────────────────────────────────────────────────────────
|
||||
- name: "Preflight | Standalone | Verify host is reachable"
|
||||
ansible.builtin.ping:
|
||||
when: not proxmox_is_cluster
|
||||
|
||||
- name: "Preflight | Standalone | Health check passed"
|
||||
ansible.builtin.debug:
|
||||
msg: "Standalone node {{ inventory_hostname }} is reachable — preflight passed."
|
||||
when: not proxmox_is_cluster
|
||||
|
||||
# ── Cluster path ──────────────────────────────────────────────────────────────
|
||||
- name: "Preflight | Cluster | Check quorum"
|
||||
ansible.builtin.command: pvecm status
|
||||
register: quorum_check
|
||||
changed_when: false
|
||||
failed_when: "'Quorate' not in quorum_check.stdout"
|
||||
when: proxmox_is_cluster and preflight_check_quorum
|
||||
run_once: true
|
||||
|
||||
- name: "Preflight | Cluster | Get all node info via API"
|
||||
community.proxmox.proxmox_node_info:
|
||||
api_host: "{{ api_host }}"
|
||||
api_user: "{{ api_user }}"
|
||||
api_token_id: "{{ api_token_id }}"
|
||||
api_token_secret: "{{ api_token_secret }}"
|
||||
api_port: "{{ api_port }}"
|
||||
validate_certs: "{{ validate_certs }}"
|
||||
register: proxmox_all_nodes
|
||||
delegate_to: localhost
|
||||
run_once: true
|
||||
when: proxmox_is_cluster
|
||||
|
||||
- name: "Preflight | Cluster | Set node list facts"
|
||||
ansible.builtin.set_fact:
|
||||
proxmox_cluster_nodes: "{{ proxmox_all_nodes.proxmox_nodes }}"
|
||||
proxmox_node_count: "{{ proxmox_all_nodes.proxmox_nodes | length }}"
|
||||
proxmox_online_nodes: >-
|
||||
{{ proxmox_all_nodes.proxmox_nodes
|
||||
| selectattr('status', 'equalto', 'online')
|
||||
| list }}
|
||||
proxmox_offline_nodes: >-
|
||||
{{ proxmox_all_nodes.proxmox_nodes
|
||||
| rejectattr('status', 'equalto', 'online')
|
||||
| list }}
|
||||
delegate_to: localhost
|
||||
run_once: true
|
||||
when: proxmox_is_cluster
|
||||
|
||||
- name: "Preflight | Cluster | Warn about offline nodes"
|
||||
ansible.builtin.debug:
|
||||
msg: >-
|
||||
WARNING: The following nodes are offline:
|
||||
{{ proxmox_offline_nodes | map(attribute='node') | list }}
|
||||
when:
|
||||
- proxmox_is_cluster
|
||||
- proxmox_offline_nodes | length > 0
|
||||
run_once: true
|
||||
|
||||
- name: "Preflight | Cluster | Abort if offline nodes detected"
|
||||
ansible.builtin.fail:
|
||||
msg: >-
|
||||
Preflight failed — {{ proxmox_offline_nodes | length }} node(s) are offline:
|
||||
{{ proxmox_offline_nodes | map(attribute='node') | list }}.
|
||||
Set preflight_abort_on_offline_node=false to proceed anyway.
|
||||
when:
|
||||
- proxmox_is_cluster
|
||||
- preflight_abort_on_offline_node
|
||||
- proxmox_offline_nodes | length > 0
|
||||
run_once: true
|
||||
|
||||
- name: "Preflight | Cluster | Verify minimum online node count"
|
||||
ansible.builtin.fail:
|
||||
msg: >-
|
||||
Only {{ proxmox_online_nodes | length }} node(s) online.
|
||||
Minimum required: {{ preflight_min_nodes_online }}.
|
||||
when:
|
||||
- proxmox_is_cluster
|
||||
- proxmox_online_nodes | length < preflight_min_nodes_online | int
|
||||
run_once: true
|
||||
|
||||
- name: "Preflight | Cluster | Health check passed"
|
||||
ansible.builtin.debug:
|
||||
msg: >-
|
||||
Cluster preflight OK —
|
||||
{{ proxmox_online_nodes | length }}/{{ proxmox_node_count }} nodes online,
|
||||
quorum confirmed.
|
||||
when: proxmox_is_cluster
|
||||
run_once: true
|
||||
Reference in New Issue
Block a user