106 lines
3.8 KiB
YAML
106 lines
3.8 KiB
YAML
---
|
|
# playbooks/proxmox/replace_proxmox_node_interactive.yml
|
|
# Interactive wrapper for proxmox node replacement workflow.
|
|
#
|
|
# Usage:
|
|
# ansible-playbook -i inventory/hosts.ini playbooks/proxmox/replace_proxmox_node_interactive.yml
|
|
|
|
- name: Interactive Proxmox physical node replacement
|
|
hosts: localhost
|
|
gather_facts: false
|
|
|
|
vars_prompt:
|
|
- name: replacement_project_name
|
|
prompt: "Project name"
|
|
private: false
|
|
default: "node-replacement-{{ lookup('pipe', 'date +%Y%m%d') }}"
|
|
|
|
- name: replacement_old_logical_host
|
|
prompt: "Logical host identity to preserve (example: pve01)"
|
|
private: false
|
|
default: "pve01"
|
|
|
|
- name: replacement_old_ip
|
|
prompt: "Current logical host IP"
|
|
private: false
|
|
default: "10.0.0.201"
|
|
|
|
- name: replacement_new_physical_host
|
|
prompt: "Physical donor host to take over identity (example: pve04)"
|
|
private: false
|
|
default: "pve04"
|
|
|
|
- name: replacement_new_physical_ip
|
|
prompt: "Current donor host IP"
|
|
private: false
|
|
default: "10.0.0.204"
|
|
|
|
- name: replacement_swarm_manager_name
|
|
prompt: "Swarm manager identity tied to the logical host"
|
|
private: false
|
|
default: "swarm-manager-1"
|
|
|
|
- name: replacement_swarm_worker_name
|
|
prompt: "Swarm worker identity tied to the logical host"
|
|
private: false
|
|
default: "swarm-worker-1"
|
|
|
|
- name: replacement_execute_cutover
|
|
prompt: "Enable execution mode? (true/false)"
|
|
private: false
|
|
default: "false"
|
|
|
|
- name: replacement_phase2_rebuild_and_rejoin
|
|
prompt: "Run phase 2 rebuild and swarm rejoin? (true/false)"
|
|
private: false
|
|
default: "false"
|
|
|
|
- name: replacement_phase3_identity_cutover
|
|
prompt: "Run phase 3 source-of-truth cutover? (true/false)"
|
|
private: false
|
|
default: "false"
|
|
|
|
- name: replacement_phase4_validate_cutover
|
|
prompt: "Run phase 4 validation gates? (true/false)"
|
|
private: false
|
|
default: "true"
|
|
|
|
- name: replacement_overwrite_existing_vmids
|
|
prompt: "Allow overwrite of conflicting VMIDs on target host? (true/false)"
|
|
private: false
|
|
default: "false"
|
|
|
|
- name: replacement_poweroff_old_host
|
|
prompt: "Power off old logical host at the end? (true/false)"
|
|
private: false
|
|
default: "false"
|
|
|
|
- name: replacement_confirm_phrase
|
|
prompt: "Confirmation phrase for execution mode (must be EXECUTE_NODE_REPLACEMENT)"
|
|
private: false
|
|
default: ""
|
|
|
|
pre_tasks:
|
|
- name: Normalize interactive boolean inputs
|
|
ansible.builtin.set_fact:
|
|
replacement_execute_cutover: "{{ replacement_execute_cutover | bool }}"
|
|
replacement_phase2_rebuild_and_rejoin: "{{ replacement_phase2_rebuild_and_rejoin | bool }}"
|
|
replacement_phase3_identity_cutover: "{{ replacement_phase3_identity_cutover | bool }}"
|
|
replacement_phase4_validate_cutover: "{{ replacement_phase4_validate_cutover | bool }}"
|
|
replacement_overwrite_existing_vmids: "{{ replacement_overwrite_existing_vmids | bool }}"
|
|
replacement_poweroff_old_host: "{{ replacement_poweroff_old_host | bool }}"
|
|
|
|
- name: Show interactive replacement selections
|
|
ansible.builtin.debug:
|
|
msg:
|
|
- "Project: {{ replacement_project_name }}"
|
|
- "Logical identity: {{ replacement_old_logical_host }} ({{ replacement_old_ip }})"
|
|
- "Donor physical host: {{ replacement_new_physical_host }} ({{ replacement_new_physical_ip }})"
|
|
- "Swarm identities: {{ replacement_swarm_manager_name }}, {{ replacement_swarm_worker_name }}"
|
|
- "Execute cutover: {{ replacement_execute_cutover }}"
|
|
- "Phases: 2={{ replacement_phase2_rebuild_and_rejoin }}, 3={{ replacement_phase3_identity_cutover }}, 4={{ replacement_phase4_validate_cutover }}"
|
|
- "Poweroff old host: {{ replacement_poweroff_old_host }}"
|
|
|
|
roles:
|
|
- role: proxmox_node_replacement
|