#!/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