InfraPlatform

RHEL Image Builder - configuration customizing (3)

IT오이시이 2026. 9. 18. 07:50
728x90

RHEL Image Builder 기반 배포 커스트마이징

RHEL Image Builder 기반 배포에서는 서버가 첫 부팅(First Boot)을 할 때 수작업(IP 설정, 계정 등록, /etc/hosts 수정, 서비스 점검 등)이 완전히 자동으로 수행되도록 이미지 내부 또는 부팅 시점에 주입하는 방식을 사용합니다.

이를 해결하기 위한 4가지 핵심 메커니즘과 구현 방법을 정리해 드립니다.

1. 이미지 빌드 시점 내장 (Image Builder Blueprint 활용)

부팅 후에도 바뀌지 않는 고정 항목(계정, SSH 키, 기본 설정 파일 등)은 Image Builder 청사진(Blueprint) 단계에서 이미지에 아예 구워 넣습니다.

# 1. 사용자 계정 및 SSH Public Key 자동 등록

[[customizations.user]]
name = "deployer"
description = "DevOps Deployment Account"
groups = ["wheel"]
ssh_keys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... devops-key"]


# 2. hosts 파일 및 기본 네트워크/시스템 환경 설정 파일 주입

[[customizations.files]]
path = "/etc/hosts"
mode = "0644"
user = "root"
group = "root"
data = """
127.0.0.1   localhost
192.168.1.10 api.internal.local
192.168.1.11 db.internal.local
"""


# 3. 필수 기본 서비스 자동 활성화

[customizations.services]
enabled = ["nginx", "firewalld", "cloud-init"]


2. 동적 IP & 환경별 설정: cloud-init / Kickstart 활용

서버마다 달라지는 IP 주소, 호스트명, 환경별 변수는 부팅 시 메타데이터를 읽어 자동 적용하는 표준 도구인 cloud-init이나 Kickstart를 활용합니다.

🔹 Cloud-Init 활용 (클라우드 / VMware 환경)
AWS나 OpenStack, VMware 환경에서는 VM 생성 시 user-data를 전달하면 부팅하면서 최초 1회 실행됩니다.

#cloud-config

# 1. 호스트명 및 IP/네트워크 설정

hostname: web-prod-app01
fqdn: web-prod-app01.internal.local


# 2. 동적 IP 설정 (정적 IP가 필요한 경우)

write_files:
  - path: /etc/sysconfig/network-scripts/ifcfg-eth0
    content: |
      DEVICE=eth0
      BOOTPROTO=static
      IPADDR=192.168.1.50
      NETMASK=255.255.255.0
      GATEWAY=192.168.1.1
      ONBOOT=yes


# 3. 최초 부팅 시 실행할 수작업 명령 자동화

runcmd:
  - systemctl restart network
  - systemctl restart nginx


🔹 Kickstart 내장 (베어메탈 / 온프레미스 엣지 ISO)

RHEL 10 Image Builder의 신규 기능인 Kickstart 임베딩을 사용하면 ISO 이미지 자체에 파티션과 IP 구성 스크립트를 포함할 수 있습니다.


3. 작동 상태 확인 및 헬스체크: First-boot Systemd Unit

서버 부팅 직후 서비스가 정상 작동하는지 자동 검증하고, 정상일 때만 인프라에 등록되도록 최초 부팅 전용 서비스(One-shot Systemd Unit)를 구성합니다.

1. 1회성 헬스체크 스크립트 작성

   /etc/systemd/system/first-boot-check.service
   [Unit]
Description=First Boot Status Check and Registration
After=network-online.target nginx.service
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/first-boot-check.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target



2. 검증 및 결과 자동 통보 스크립트

   /usr/local/bin/first-boot-check.sh
   #!/bin/bash

# Nginx 포트(80) 및 로컬 API 응답 점검
HTTP_STATUS=$(curl -o /null -s -w "%{http_code}" http://localhost/health)

if [ "$HTTP_STATUS" -eq 200 ]; then
    echo "Web Service Healthy"
    # Slack 또는 로드밸런서/중앙 관리 도구에 정상 부팅 신호(Heartbeat) 전송
    curl -X POST -H 'Content-type: application/json' --data '{"text":"Web Server Boot Succeeded: '$(hostname)'"}' https://hooks.slack.com/...
    
    # 다시 부팅할 땐 실행되지 않도록 서비스 비활성화
    systemctl disable first-boot-check.service
else
    echo "Health Check Failed!" >&2
    exit 1
fi

4. 수작업 항목별 처리 방식 요약

| 기존 수작업 항목 | Image Builder 기반 처리 방안 | 적용되는 도구 |
|---|---|---|
| 계정 생성 & SSH 키 | Blueprint 설정에 등록하여 이미지 빌드 시 미리 생성 | customizations.user |
| /etc/hosts 설정 | Blueprint 설정에 파일 내용 주입 | customizations.files |
| 네트워크 IP 할당 | DHCP 자동 할당 권장 또는 cloud-init user-data로 정적 IP 주입 | cloud-init / Kickstart |
| 서비스 활성화 | Blueprint에서 부팅 시 enabled 서비스 등록 | customizations.services |
| 부팅 상태 확인 | Systemd first-boot 스크립트가 헬스체크 후 슬랙/모니터링 알림 | Systemd + curl 스크립트 |


💡 핵심 정리
Redhat Image Builder 환경에서는 "서버에 접속해서 하는 수작업"을 전면 배제합니다.

* 정적인 설정(계정, 공통 hosts, 기본 패키지) ➔ Image Builder Blueprint에 내장

* 동적인 설정(IP, 호스트명) ➔ Cloud-init 메타데이터로 부팅 시 주입

* 검증 작업 ➔ 부팅 자동 헬스체크 스크립트 실행

728x90
반응형