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>
384 lines
11 KiB
Bash
384 lines
11 KiB
Bash
#!/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
|