186 lines
5.6 KiB
Bash
186 lines
5.6 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Comprehensive Ceph diagnostic script
|
||
|
|
# Run on R630-01 as root
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
echo "=========================================="
|
||
|
|
echo "Ceph Cluster Diagnostic"
|
||
|
|
echo "=========================================="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if running as root
|
||
|
|
if [ "$EUID" -ne 0 ]; then
|
||
|
|
echo -e "${RED}ERROR: Please run as root${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 1. Ceph Cluster Health ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
echo "Ceph Health:"
|
||
|
|
ceph health 2>&1 || echo -e "${RED}Cannot get health${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "Ceph Health Detail:"
|
||
|
|
ceph health detail 2>&1 | head -20 || echo -e "${RED}Cannot get health detail${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}ceph command not found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 2. Ceph Monitor Status ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
echo "Monitor Status:"
|
||
|
|
ceph mon stat 2>&1 || echo -e "${RED}Cannot get monitor status${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "Monitor Dump:"
|
||
|
|
ceph mon dump 2>&1 | head -30 || echo -e "${RED}Cannot get monitor dump${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}ceph command not found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 3. Ceph OSD Status ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
echo "OSD Tree:"
|
||
|
|
ceph osd tree 2>&1 || echo -e "${RED}Cannot get OSD tree${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "OSD Details:"
|
||
|
|
ceph osd df 2>&1 || echo -e "${RED}Cannot get OSD details${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}ceph command not found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 4. Bootstrap Keyring Check ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
echo "Standard location (/var/lib/ceph/bootstrap-osd/):"
|
||
|
|
if [ -d "/var/lib/ceph/bootstrap-osd" ]; then
|
||
|
|
ls -la /var/lib/ceph/bootstrap-osd/ 2>/dev/null || echo "Directory exists but empty"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}Directory does not exist${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Proxmox location (/etc/pve/priv/):"
|
||
|
|
if [ -d "/etc/pve/priv" ]; then
|
||
|
|
ls -la /etc/pve/priv/ceph.client.bootstrap-osd.keyring 2>/dev/null || echo -e "${YELLOW}Bootstrap keyring not found${NC}"
|
||
|
|
echo "All Ceph keyrings in /etc/pve/priv/:"
|
||
|
|
ls -la /etc/pve/priv/ceph* 2>/dev/null || echo "No Ceph keyrings found"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}/etc/pve/priv does not exist${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Bootstrap client in auth list:"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
ceph auth list 2>&1 | grep -i bootstrap || echo -e "${YELLOW}No bootstrap client found${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}ceph command not found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 5. Ceph Services Status ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
echo "Ceph Target:"
|
||
|
|
systemctl status ceph.target --no-pager 2>&1 | head -10 || echo "Service not found"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Ceph Monitor Services:"
|
||
|
|
systemctl list-units --type=service | grep ceph-mon || echo "No monitor services found"
|
||
|
|
for mon in $(systemctl list-units --type=service | grep ceph-mon | awk '{print $1}'); do
|
||
|
|
echo " $mon:"
|
||
|
|
systemctl status $mon --no-pager 2>&1 | head -5
|
||
|
|
done
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Ceph OSD Services:"
|
||
|
|
systemctl list-units --type=service | grep ceph-osd | head -5 || echo "No OSD services found"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 6. Network Connectivity ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
echo "Ceph Monitor Ports:"
|
||
|
|
netstat -tlnp 2>/dev/null | grep 6789 || ss -tlnp 2>/dev/null | grep 6789 || echo "No listeners on port 6789"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Monitor Addresses (from mon dump):"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
MON_ADDRS=$(ceph mon dump 2>/dev/null | grep -E "addr|rank" | head -10)
|
||
|
|
if [ ! -z "$MON_ADDRS" ]; then
|
||
|
|
echo "$MON_ADDRS"
|
||
|
|
echo ""
|
||
|
|
echo "Testing connectivity to monitors:"
|
||
|
|
echo "$MON_ADDRS" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+' | while read addr; do
|
||
|
|
ip=$(echo $addr | cut -d: -f1)
|
||
|
|
port=$(echo $addr | cut -d: -f2)
|
||
|
|
echo -n " Testing $ip:$port ... "
|
||
|
|
if timeout 2 bash -c "echo > /dev/tcp/$ip/$port" 2>/dev/null; then
|
||
|
|
echo -e "${GREEN}✓ Reachable${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}✗ Not reachable${NC}"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}Cannot get monitor addresses${NC}"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo -e "${RED}ceph command not found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 7. Proxmox Ceph Integration ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
echo "pveceph command:"
|
||
|
|
which pveceph || echo -e "${YELLOW}pveceph not found${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if command -v pveceph &> /dev/null; then
|
||
|
|
echo "pveceph status:"
|
||
|
|
pveceph status 2>&1 || echo "pveceph status failed"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}=== 8. Ceph Configuration ===${NC}"
|
||
|
|
echo "-----------------------------------"
|
||
|
|
echo "Ceph config file:"
|
||
|
|
if [ -f "/etc/ceph/ceph.conf" ]; then
|
||
|
|
echo " /etc/ceph/ceph.conf exists"
|
||
|
|
cat /etc/ceph/ceph.conf 2>/dev/null | head -20
|
||
|
|
elif [ -f "/etc/pve/ceph.conf" ]; then
|
||
|
|
echo " /etc/pve/ceph.conf exists"
|
||
|
|
cat /etc/pve/ceph.conf 2>/dev/null | head -20
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}No Ceph config file found${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Ceph cluster name:"
|
||
|
|
if command -v ceph &> /dev/null; then
|
||
|
|
ceph --version 2>&1 || true
|
||
|
|
# Try to get cluster name
|
||
|
|
ceph config dump 2>&1 | grep "cluster" | head -5 || true
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "=========================================="
|
||
|
|
echo -e "${GREEN}Diagnostic Complete${NC}"
|
||
|
|
echo "=========================================="
|
||
|
|
echo ""
|
||
|
|
echo "Summary of findings:"
|
||
|
|
echo " - Review Ceph health status above"
|
||
|
|
echo " - Check bootstrap keyring locations"
|
||
|
|
echo " - Verify monitor connectivity"
|
||
|
|
echo " - Check if pveceph is available"
|
||
|
|
echo ""
|
||
|
|
|