From ffa955a64f98b6da523cc1959c792ab797d03891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=9C=EA=B3=A8=EC=95=BD=EC=82=AC?= Date: Fri, 14 Nov 2025 06:00:31 +0000 Subject: [PATCH] Add Proxmox VE hostname/FQDN changer script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Proxmox VE 호스트명/FQDN 안전 변경 스크립트 추가: - 현재 설정 확인 및 백업 기능 - 호스트명/도메인 입력 검증 - /etc/hostname, /etc/hosts 자동 수정 - hostnamectl 적용 - Proxmox 서비스 재시작 - 인증서 자동 재발급 - 변경사항 검증 및 롤백 가이드 - 대화형 UI로 안전한 변경 지원 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- pve-host-changer.sh | 383 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 pve-host-changer.sh diff --git a/pve-host-changer.sh b/pve-host-changer.sh new file mode 100644 index 0000000..581f0a7 --- /dev/null +++ b/pve-host-changer.sh @@ -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