Created
March 10, 2026 07:19
-
-
Save bachmanity1/8020eac9355832b827ecfeee32547496 to your computer and use it in GitHub Desktop.
Check if Ceph hosts are fully removed (daemons, host list, crush map)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| set -euo pipefail | |
| HOST_FILE="" | |
| HOSTS=() | |
| usage() { | |
| echo "Usage: $0 [--file <hosts-file>] [hostname ...]" | |
| echo "" | |
| echo "Verifies that hosts are fully removed: no daemons, not in host list, not in crush map." | |
| exit 1 | |
| } | |
| die() { echo "ERROR: $*" >&2; exit 1; } | |
| [[ $# -lt 1 ]] && usage | |
| [[ "$1" == "--help" || "$1" == "-h" ]] && usage | |
| while [[ $# -gt 0 ]]; do | |
| case "$1" in | |
| --file|-f) HOST_FILE="$2"; shift 2 ;; | |
| --help|-h) usage ;; | |
| *) HOSTS+=("$1"); shift ;; | |
| esac | |
| done | |
| if [[ -n "$HOST_FILE" ]]; then | |
| [[ -f "$HOST_FILE" ]] || die "file not found: $HOST_FILE" | |
| while IFS= read -r line; do | |
| line="${line%%#*}" | |
| line="$(echo "$line" | xargs)" | |
| [[ -n "$line" ]] && HOSTS+=("$line") | |
| done < "$HOST_FILE" | |
| fi | |
| [[ ${#HOSTS[@]} -eq 0 ]] && die "no hosts specified" | |
| # orch uses FQDN (hostname.n3r), crush uses short hostname | |
| orch_name() { echo "${1}.n3r"; } | |
| crush_name() { echo "${1%.n3r}"; } | |
| orch_hosts=$(ceph orch host ls) | |
| crush_tree=$(ceph osd crush tree) | |
| failed=() | |
| for hostname in "${HOSTS[@]}"; do | |
| orch_h=$(orch_name "$hostname") | |
| crush_h=$(crush_name "$hostname") | |
| ok=true | |
| # Check no daemons running | |
| daemon_count=$(ceph orch ps "$orch_h" 2>&1 | grep -c "$orch_h" || true) | |
| if [[ "$daemon_count" -gt 0 ]]; then | |
| echo "FAIL: [$hostname] $daemon_count daemon(s) still running" | |
| ok=false | |
| else | |
| echo "OK: [$hostname] no daemons running" | |
| fi | |
| # Check host removed from orch | |
| if echo "$orch_hosts" | grep -q "$orch_h"; then | |
| echo "FAIL: [$hostname] still in host list" | |
| ok=false | |
| else | |
| echo "OK: [$hostname] removed from host list" | |
| fi | |
| # Check removed from crush map | |
| if echo "$crush_tree" | grep -q "host $crush_h"; then | |
| echo "FAIL: [$hostname] still in crush map" | |
| ok=false | |
| else | |
| echo "OK: [$hostname] removed from crush map" | |
| fi | |
| [[ "$ok" == false ]] && failed+=("$hostname") | |
| echo "" | |
| done | |
| if [[ ${#failed[@]} -gt 0 ]]; then | |
| die "${#failed[@]} host(s) not fully removed: ${failed[*]}" | |
| fi | |
| echo "=== All ${#HOSTS[@]} host(s) verified as removed ===" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment