개요
현업에서 서버 담당자로 일하다 보면 "이 단순 반복 작업을 어떻게 자동화할 수 있을까?" 하는 고민, 다들 한 번쯤 해보셨을 텐데요.
특히 Jira 같은 이슈 트래킹 시스템에 서버 구축과 같은 요청이 들어오면, OS 설치부터 초기 설정, 그리고 까다로운 파티션 구성까지 마법처럼 착착 진행되는 자동화 시스템은 많은 엔지니어의 로망이 아닐까 싶습니다.
이러한 궁금증을 직접 해소해보기 위하여, Pnetlab을 사용해 Jira 티켓 기반의 서버 OS 설치 자동화 과정을 직접 구축해보려고 합니다.
Part 1: 큰 그림 짜보기
본격적인 실습에 앞서, 자동화가 어떤 구조로 이루어질 지 알아보겠습니다.
가장 핵심은 뭐다? "요구사항에 맞게 시스템을 준비하고 설정하는 과정" 을 자동화하는 거죠.
[자동화 워크플로우 다이어그램]
[JSON 파일: 요청 데이터]
│
▼
[프로비저닝 서버] ───────┐
DHCP + TFTP + HTTP │
Kickstart 템플릿 생성 │
│ │ PXE 부팅 트래픽
▼ │
┌──────────────────────┘
│
[대상 서버 VM #1] [대상 서버 VM #2]
PXE 부팅 PXE 부팅
OS 자동 설치 OS 자동 설치
구축 순서는 다음과 같습닏다.
1. 요청 접수 (Jira 티켓)
사용자가 Jira에 OS
, IP
, 호스트명
, 파티션 정보
등 서버 스펙을 담아 티켓을 생성하면, 웹훅(Webhook) 을 통하여 프로비저닝 서버로 알림이 갑니다. (이번 실습에서는 지라 구축까지는 어려움이 있기에, 이 티켓을 JSON 파일로만 시뮬레이션할 겁니다.)
2. 설치 준비 (프로비저닝 서버)
알림을 받은 서버는 Jira 티켓의 정보를 분석해, 해당 서버만을 위한 맞춤형 자동 설치 응답 파일(Kickstart) 을 동적으로 생성합니다. 동시에 PXE 부팅에 필요한 파일들을 준비합니다.
3. 자동 설치 (신규 서버)
IDC에 입고된 신규 서버의 전원을 켜면, 서버는 네트워크로 부팅(PXE Boot)을 시도합니다. 이후 프로비저닝 서버의 안내에 따라 OS 설치 이미지를 받고, 미리 생성된 응답 파일(Kickstart)의 지시대로 모든 설치 과정을 스스로 진행합니다.
4. 결과 보고
설치가 완료되면, 프로비저닝 서버는 다시 Jira API를 호출해 티켓 상태를 '완료'로 변경하고 결과를 보고합니다.
Part 2: 랩 구축하기
실습은 Pnetlab 소프트웨어를 진행할 겁니다.
실습에 앞서 진행해줘야 할 부분이 있습니다.
✅ Step 1: '깡통 서버' 만들기 (Bare-Metal 노드 생성)
자동 설치를 실습하려면 OS가 없는 깨끗한 상태의 서버가 1대 필요합니다.
해당 서버가 뭐가 될까요? 바로 PXE 부팅을 통해 OS가 자동으로 설치가 되는 Target 서버 가 됩니다.
이를 위해 qemu-img
명령을 통해서 비어 있는 가상 하드 디스크를 생성해주고, 이를 linux-blank
라는 이름의 새 템플릿으로 만들어주겠습니다.
해당 작업은 Pnetlab 서버 터미널로 접근하여 실행해주시면 됩니다.
# 'linux-blank' 라는 이름의 새 템플릿 폴더를 만들고, 그 안에 40GB짜리 빈 디스크 파일을 생성합니다.
mkdir -p /opt/unetlab/addons/qemu/linux-blank/
qemu-img create -f qcow2 /opt/unetlab/addons/qemu/linux-blank/virtioa.qcow2 40G
💡 Tip: 파티션을 여러 개 나눠야 하므로 디스크 크기를 40G 정도로 넉넉하게 잡았습니다.
그리고 파일 권한을 수정하여서 Pnetlab이 해당 템플릿을 인식하게 해줘야 합니다. (이거 안하면 노드 추가 안됩니다.)
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
✅ Step 2: 프로비저닝 서버 설정
pxe-server
에 접근해서 필요한 설정들을 만들어주겠습니다.
1. 필수 패키지 설치
sudo apt update
sudo apt install -y isc-dhcp-server tftpd-hpa apache2 python3 python3-jinja2
2. DHCP 서버 설정 (/etc/dhcp/dhcpd.conf
)
pxe-target
서버에 IP와 부팅 정보를 알려줄 DHCP 서버를 위한 설정을 작성해주겠습니다.
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.200;
next-server 192.168.0.10; # TFTP 서버 IP (내 자신)
filename "pxelinux.0"; # 부팅 로더 파일
}
💡 next-server 와 filename 이 PXE 부팅의 핵심 설정입니다! IP는 본인 환경에 맞게 수정하세요.
3. TFTP/HTTP 서버 파일 준비하기
HTTP: CentOS 설치 파일 전체를 웹서버 디렉터리로 복사합니다.
sudo mkdir /mnt/centos
sudo mount -o loop CentOS-7-x86_64-Minimal-xxxx.iso /mnt/centos
sudo mkdir /var/www/html/centos7
sudo cp -r /mnt/centos/* /var/www/html/centos7/
이 때 TFTP 서버에 CentOS-7-x86_64-Minimal-xxxx.iso
파일이 존재해야 합니다.
TFTP: PXE 부팅에 필요한 파일들을 TFTP 디렉터리로 복사합니다.
참고로 tftp-hpa
의 경우에는 /var/lib/tftpboot
가 기본 경로가 아닐 수 있습니다.
이 설정은 /etc/default/tftpd-hpa
설정에 따라 달라지므로 해당 파일의 TFTP_DIRECTORY
경로를 확인하고 진행해주세요.
sudo apt install -y pxelinux syslinux-common
sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
sudo cp /usr/lib/syslinux/modules/bios/* /var/lib/tftpboot/
sudo cp /var/www/html/centos7/images/pxeboot/vmlinuz /var/lib/tftpboot/
sudo cp /var/www/html/centos7/images/pxeboot/initrd.img /var/lib/tftpboot/
4. PXE 부팅 메뉴 설정 (/var/lib/tftpboot/pxelinux.cfg/default
)
pxe-target
서버가 부팅될 때 보게 될 메뉴입니다.
위 경로에 파일을 만들고 아래 내용을 붙여넣어주세요.
default menu.c32
prompt 0
timeout 30
LABEL centos7-auto-install
MENU LABEL CentOS 7 Auto Install
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://192.168.0.10/centos7 inst.ks=http://192.168.0.10/ks.cfg
🚀 inst.ks=...
부분이 바로 "자동 설치 응답 파일을 여기서 가져가!"라고 알려주는 코드라고 보시면 됩니다.
5. 모든 서비스 재시작
sudo systemctl sestart isc-dhcp-server tftpd-hpa apache2
Part 3: 자동화 스크립트 작성
자, 이제 Jira 티켓(이번 실습에서는 JSON)을 읽어서 Kiskstart 파일을 만드는 자동화 스크립트를 작성해보겠습니다.
pxe-server
의 홈 디렉토리에 automation
폴더 만들고 진행합시다.
1. Jira 티켓용 시뮬레이션 JSON 파일 (request.json
)
{
"hostname": "web-server-02",
"ip_address": "192.168.100.51",
"netmask": "255.255.255.0",
"gateway": "192.168.100.1",
"nameserver": "8.8.8.8",
"root_password": "MyStrongPassword123",
"partitions": [
{ "mount": "/boot", "size": "1024" },
{ "mount": "/", "size": "20480" },
{ "mount": "/var", "size": "10240" },
{ "mount": "/home", "size": "5120" }
]
}
2. Kickstart 템플릿 (ks.cfg.j2
)
Jinja2 템플릿 문법을 사용해서 변수가 들어갈 자리를 {{ }}
로 비워두겠습니다.
# Kickstart 템플릿 파일
install
url --url="http://192.168.0.10/centos7"
# 언어 및 키보드
lang en_US.UTF-8
keyboard --vckeymap=us --xlayouts='us'
# 네트워크 설정 (JSON 데이터로 채워짐)
network --onboot=yes --device=eth0 --bootproto=static --ip={{ ip_address }} --netmask={{ netmask }} --gateway={{ gateway }} --nameserver={{ nameserver }} --hostname={{ hostname }}
# 루트 비밀번호 (암호화된 값 사용 권장)
rootpw --plaintext {{ root_password }}
# =======================================================
# 디스크 파티셔닝 (★ 여기가 핵심 ★)
# =======================================================
# 디스크 초기화
zerombr
clearpart --all --initlabel
# JSON 파일의 파티션 목록을 기반으로 파티션 동적 생성
{% for p in partitions %}
part {{ p.mount }} --fstype="xfs" --size={{ p.size }}
{% endfor %}
# 스왑 파티션 추가 (일반적으로 RAM의 1~2배 크기)
part swap --fstype="swap" --size=4096
# 시스템 설정
firewall --disabled
selinux --disabled
skipx
timezone Asia/Seoul --isUtc
# 패키지 설치
%packages
@^minimal
@core
wget
net-tools
%end
# 설치 후 스크립트
%post --log=/root/post_install.log
echo "Installation complete for {{ hostname }}" > /etc/motd
%end
# 재부팅
reboot
3. 파이썬 스크립트 작성 (generate_ks.py
)
이 스크립트가 JSON과 템플릿을 합쳐서 최종적으로 ks.cfg
파일을 생성할겁니다.
import json
from jinja2 import Environment, FileSystemLoader
JSON_FILE = 'request.json'
TEMPLATE_FILE = 'ks.cfg.j2'
OUTPUT_FILE = '/var/www/html/ks.cfg' # 웹 서버 경로!
with open(JSON_FILE, 'r') as f:
config_data = json.load(f)
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template(TEMPLATE_FILE)
kickstart_content = template.render(config_data)
try:
with open(OUTPUT_FILE, 'w') as f:
f.write(kickstart_content)
print(f"✅ Kickstart 파일 생성 완료: {OUTPUT_FILE}")
except Exception as e:
print(f"❌ 오류 발생! sudo로 실행했는지 확인하세요: {e}")
Part 4: 테스트 GoGo!
이제 모든 준비가 끝났죠? 자동 설치가 정상적으로 진행되는지 한 번 봅시다.
1. pxe-server
에서 스크립트 실행해 ks.cfg
파일을 생성합니다.
cd ~/automation
sudo python3 generate_ks.py
2. Pnetlab 랩으로 돌아가서 pxe-target
서버를 시작합니다.
3. pxe-target
의 콘솔 창 열고 팝콘 들고 기다립시다 🍿
- 네트워크(PXE) 부팅 시작
- DHCP로부터 IP 할당
- TFTP로 부팅 파일 다운로드
- CentOS 설치 프로그램 시작
ks.cfg
파일 읽어오며 모든 과정이 자동으로 진행됨!- 설치 완료 후 자동으로 재부팅 !~