Add Proxmox VE hostname/FQDN changer script

Proxmox VE 호스트명/FQDN 안전 변경 스크립트 추가:
- 현재 설정 확인 및 백업 기능
- 호스트명/도메인 입력 검증
- /etc/hostname, /etc/hosts 자동 수정
- hostnamectl 적용
- Proxmox 서비스 재시작
- 인증서 자동 재발급
- 변경사항 검증 및 롤백 가이드
- 대화형 UI로 안전한 변경 지원

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
시골약사 2025-11-14 06:00:31 +00:00
parent 912410ba90
commit ffa955a64f

383
pve-host-changer.sh Normal file
View File

@ -0,0 +1,383 @@
#!/bin/bash
#
# Proxmox VE 호스트명/FQDN 수정 스크립트
# 작성일: 2025-11-14
# 용도: Proxmox 설치 후 안전하게 호스트명 및 FQDN 변경
#
set -e
# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
# 설정 변수
NEW_HOSTNAME=""
NEW_DOMAIN=""
NEW_FQDN=""
HOST_IP=""
# 로그 함수
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${CYAN}╰─► ${NC}$1"
}
# 배너 출력
print_banner() {
clear
echo -e "${MAGENTA}"
cat << "EOF"
╔═══════════════════════════════════════════════════════════════╗
║ ║
║ Proxmox VE 호스트명/FQDN 변경 스크립트 ║
║ 안전하게 호스트명을 변경합니다 ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
EOF
echo -e "${NC}"
echo ""
}
# Root 권한 확인
check_root() {
if [ "$EUID" -ne 0 ]; then
log_error "이 스크립트는 root 권한이 필요합니다."
log_info "다음 명령으로 실행하세요: sudo $0"
exit 1
fi
}
# Proxmox VE 확인
check_proxmox() {
if [ ! -f /etc/pve/storage.cfg ]; then
log_error "Proxmox VE가 설치되어 있지 않습니다."
exit 1
fi
log_success "Proxmox VE 확인 완료"
}
# 현재 설정 표시
show_current_config() {
log_info "현재 호스트명 설정:"
echo ""
echo " FQDN: $(hostname -f)"
echo " 호스트명: $(hostname)"
echo " IP 주소: $(hostname -I | awk '{print $1}')"
echo ""
log_info "현재 /etc/hostname 내용:"
cat /etc/hostname | sed 's/^/ /'
echo ""
log_info "현재 /etc/hosts 내용:"
cat /etc/hosts | sed 's/^/ /'
echo ""
}
# 사용자 입력 받기
get_user_input() {
echo ""
log_info "새로운 호스트명 정보를 입력하세요."
echo ""
# 새 호스트명 입력
while true; do
read -p "$(echo -e ${CYAN}새 호스트명${NC}) (예: p0001-pve): " NEW_HOSTNAME
if [ -n "$NEW_HOSTNAME" ]; then
# 호스트명 검증 (알파벳, 숫자, 하이픈만 허용)
if [[ "$NEW_HOSTNAME" =~ ^[a-zA-Z0-9-]+$ ]]; then
break
else
log_error "호스트명은 알파벳, 숫자, 하이픈(-)만 사용 가능합니다."
fi
else
log_error "호스트명은 필수입니다."
fi
done
# 도메인 입력
while true; do
read -p "$(echo -e ${CYAN}도메인${NC}) (예: pharmq.kr): " NEW_DOMAIN
if [ -n "$NEW_DOMAIN" ]; then
# 도메인 검증 (기본적인 형식 체크)
if [[ "$NEW_DOMAIN" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
break
else
log_error "올바른 도메인 형식이 아닙니다. (예: example.com)"
fi
else
log_error "도메인은 필수입니다."
fi
done
# FQDN 구성
NEW_FQDN="${NEW_HOSTNAME}.${NEW_DOMAIN}"
# IP 주소 자동 감지
HOST_IP=$(hostname -I | awk '{print $1}')
log_info "감지된 IP 주소: ${HOST_IP}"
read -p "$(echo -e ${CYAN}IP 주소 변경${NC}) [엔터로 ${HOST_IP} 사용]: " input_ip
if [ -n "$input_ip" ]; then
HOST_IP="$input_ip"
fi
echo ""
log_info "변경 요약:"
echo " 현재 FQDN: $(hostname -f)"
echo " 새 FQDN: ${NEW_FQDN}"
echo " 현재 호스트명: $(hostname)"
echo " 새 호스트명: ${NEW_HOSTNAME}"
echo " IP 주소: ${HOST_IP}"
echo ""
log_warning "⚠️ 주의사항:"
echo " 1. 클러스터 구성된 노드는 신중하게 변경하세요"
echo " 2. DNS에 ${NEW_FQDN}${HOST_IP} 레코드 등록 권장"
echo " 3. 인증서가 자동으로 재발급됩니다"
echo ""
read -p "$(echo -e ${YELLOW}이 설정으로 변경하시겠습니까?${NC}) (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
log_info "작업 취소됨"
exit 0
fi
}
# 백업 생성
create_backup() {
log_step "현재 설정 백업 중..."
BACKUP_DIR="/root/hostname_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp /etc/hostname "$BACKUP_DIR/hostname.bak"
cp /etc/hosts "$BACKUP_DIR/hosts.bak"
log_success "백업 완료: ${BACKUP_DIR}"
echo ""
}
# /etc/hostname 수정
update_hostname_file() {
log_step "/etc/hostname 수정 중..."
echo "$NEW_HOSTNAME" > /etc/hostname
log_success "/etc/hostname 수정 완료"
}
# /etc/hosts 수정
update_hosts_file() {
log_step "/etc/hosts 수정 중..."
# 기존 127.0.1.1 라인 제거 및 새 설정 추가
cat > /etc/hosts << EOF
127.0.0.1 localhost.localdomain localhost
${HOST_IP} ${NEW_FQDN} ${NEW_HOSTNAME}
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOF
log_success "/etc/hosts 수정 완료"
}
# hostnamectl 적용
apply_hostnamectl() {
log_step "hostnamectl로 호스트명 적용 중..."
hostnamectl set-hostname "$NEW_HOSTNAME"
log_success "hostnamectl 적용 완료"
}
# Proxmox 서비스 재시작
restart_proxmox_services() {
log_step "Proxmox 서비스 재시작 중..."
systemctl restart pveproxy
systemctl restart pvedaemon
log_success "Proxmox 서비스 재시작 완료"
}
# 인증서 재발급
renew_certificate() {
log_step "인증서 재발급 중..."
echo ""
# 기존 인증서 백업
if [ -f /etc/pve/local/pveproxy-ssl.pem ]; then
cp /etc/pve/local/pveproxy-ssl.pem "$BACKUP_DIR/pveproxy-ssl.pem.bak" 2>/dev/null || true
fi
if [ -f /etc/pve/local/pveproxy-ssl.key ]; then
cp /etc/pve/local/pveproxy-ssl.key "$BACKUP_DIR/pveproxy-ssl.key.bak" 2>/dev/null || true
fi
# 인증서 재발급
pvecm updatecerts -f 2>/dev/null || pvenode cert renew 2>&1
sleep 2
systemctl restart pveproxy
echo ""
log_success "인증서 재발급 완료"
}
# 변경 사항 확인
verify_changes() {
log_step "변경 사항 확인 중..."
echo ""
CURRENT_FQDN=$(hostname -f)
CURRENT_HOSTNAME=$(hostname)
if [ "$CURRENT_FQDN" = "$NEW_FQDN" ] && [ "$CURRENT_HOSTNAME" = "$NEW_HOSTNAME" ]; then
log_success "호스트명 변경 성공!"
echo " FQDN: ${CURRENT_FQDN}"
echo " 호스트명: ${CURRENT_HOSTNAME}"
else
log_warning "호스트명이 완전히 적용되지 않았습니다."
echo " 예상 FQDN: ${NEW_FQDN}"
echo " 현재 FQDN: ${CURRENT_FQDN}"
echo " 예상 호스트명: ${NEW_HOSTNAME}"
echo " 현재 호스트명: ${CURRENT_HOSTNAME}"
echo ""
log_info "시스템 재부팅 후 완전히 적용됩니다."
fi
echo ""
}
# 다음 단계 안내
print_next_steps() {
echo ""
echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 호스트명 변경 완료! ║${NC}"
echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}"
echo ""
log_info "다음 단계:"
echo ""
echo "1. 시스템 재부팅 (권장):"
echo " reboot"
echo ""
echo "2. DNS에 A 레코드 등록 (선택사항):"
echo " ${NEW_FQDN}${HOST_IP}"
echo ""
echo "3. Proxmox Web UI 접속:"
echo " https://${HOST_IP}:8006"
echo " https://${NEW_FQDN}:8006"
echo ""
echo "4. 인증서 경고 발생 시:"
echo " 브라우저에서 예외 추가 또는 Let's Encrypt 인증서 발급"
echo " pvenode acme account register default mail@example.com"
echo " pvenode acme cert order"
echo ""
echo "5. 설정 롤백 (필요시):"
echo " cp ${BACKUP_DIR}/hostname.bak /etc/hostname"
echo " cp ${BACKUP_DIR}/hosts.bak /etc/hosts"
echo " reboot"
echo ""
log_info "백업 위치: ${BACKUP_DIR}"
echo ""
}
# 메인 실행
main() {
print_banner
# 권한 확인
check_root
# Proxmox 확인
check_proxmox
echo ""
# 현재 설정 표시
show_current_config
# 사용자 입력
get_user_input
# 백업 생성
create_backup
# 호스트명 변경
update_hostname_file
update_hosts_file
apply_hostnamectl
echo ""
# Proxmox 서비스 재시작
restart_proxmox_services
echo ""
# 인증서 재발급
renew_certificate
echo ""
# 변경 사항 확인
verify_changes
# 다음 단계 안내
print_next_steps
}
# 도움말
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Proxmox VE 호스트명/FQDN 변경 스크립트"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "사용법: $0"
echo ""
echo "이 스크립트는:"
echo " 1. 현재 호스트명/FQDN 설정 백업"
echo " 2. /etc/hostname, /etc/hosts 수정"
echo " 3. hostnamectl로 호스트명 적용"
echo " 4. Proxmox 서비스 재시작"
echo " 5. 인증서 자동 재발급"
echo ""
echo "실행 예시:"
echo " bash $0"
echo ""
echo "주의사항:"
echo " - 단독 노드(Single node)에서는 안전하게 변경 가능"
echo " - 클러스터 구성 시 신중하게 진행 필요"
echo " - 변경 후 시스템 재부팅 권장"
echo ""
exit 0
fi
# 스크립트 실행
main