Ubuntu 자동 설치 자동 배포
autoinstall은 Ubuntu 서버의 Subiquity 설치 프로그램에서 제공하는 자동 설치 솔루션입니다. YAML 구성 파일을 사용하여 무인 서버 배포를 활성화합니다.
작동 방식
자동 설치 구성은 다음을 통해 제공될 수 있습니다.
- cloud-init user-data - 클라우드 플랫폼의 사용자 데이터를 통해 전달됩니다.
- 로컬 파일 - 설치 미디어 또는 액세스 가능한 파일 시스템에 저장됩니다.
- HTTP 서버 - 네트워크를 통해 로드됨
설치 프로그램은 시작 시 자동 설치 구성을 검색합니다. 일단 발견되면 수동 개입 없이 자동으로 설치가 진행됩니다.
기본 구성 구조
#cloud-config
autoinstall:
version: 1
# Language and keyboard
locale: en_US.UTF-8
keyboard:
layout: us
# Network configuration
network:
version: 2
ethernets:
eth0:
dhcp4: true
# Software sources
apt:
primary:
- arches: [default]
uri: http://archive.ubuntu.com/ubuntu
# Disk configuration
storage:
layout:
name: lvm
# User configuration
identity:
hostname: ubuntu-server
username: ubuntu
password: "$6$rounds=4096$xyz$hashedpassword"
# SSH configuration
ssh:
install-server: true
allow-pw: false
authorized-keys:
- ssh-ed25519 AAAA... admin@workstation
# Post-installation commands
late-commands:
- curtin in-target -- apt update
- curtin in-target -- apt upgrade -y전체 구성 예
표준 서버 설치
#cloud-config
autoinstall:
version: 1
# Interactive settings (which steps require manual confirmation)
interactive-sections: [] # Empty means fully automatic
locale: en_US.UTF-8
keyboard:
layout: us
variant: ""
# Use updated installer
refresh-installer:
update: true
# Network
network:
version: 2
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
# Proxy (leave empty if not used)
proxy: ""
# APT mirror
apt:
primary:
- arches: [amd64]
uri: http://archive.ubuntu.com/ubuntu
geoip: false
# Storage configuration - using LVM
storage:
layout:
name: lvm
sizing-policy: scaled
# Or specify root partition size
# sizing-policy: all
# System identity
identity:
hostname: prod-web-01
username: deploy
# Generated with: mkpasswd --method=sha-512
password: "$6$rounds=4096$saltsalt$hashedpasswordhere"
# SSH
ssh:
install-server: true
allow-pw: false
authorized-keys:
- ssh-ed25519 AAAA... deploy@admin
# Snap packages to install
snaps:
- name: docker
channel: latest/stable
classic: false
# Deb packages to install
packages:
- ubuntu-server-minimal
- vim
- htop
- curl
- wget
- git
- ufw
- fail2ban
# Automatic security updates
updates: security
# Post-installation commands
late-commands:
# Set timezone
- curtin in-target -- timedatectl set-timezone America/New_York
# Configure firewall
- curtin in-target -- ufw allow ssh
- curtin in-target -- ufw --force enable
# Write custom configuration files
- |
cat <<'SYSCTL' > /target/etc/sysctl.d/99-custom.conf
net.ipv4.ip_forward = 1
net.core.somaxconn = 65535
vm.swappiness = 10
SYSCTL
# Enable services
- curtin in-target -- systemctl enable fail2ban
# Reboot automatically after installation completes
shutdown: reboot사용자 정의 파티션 구성표
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
storage:
config:
# Disk
- id: disk0
type: disk
ptable: gpt
path: /dev/sda
wipe: superblock-recursive
grub_device: false
# EFI partition
- id: efi-part
type: partition
device: disk0
size: 512M
flag: boot
grub_device: true
# Boot partition
- id: boot-part
type: partition
device: disk0
size: 1G
# Remaining space for LVM
- id: lvm-part
type: partition
device: disk0
size: -1 # All remaining space
# EFI filesystem
- id: efi-fs
type: format
volume: efi-part
fstype: fat32
# Boot filesystem
- id: boot-fs
type: format
volume: boot-part
fstype: ext4
# LVM volume group
- id: vg0
type: lvm_volgroup
name: vg0
devices:
- lvm-part
# LVM logical volume - root
- id: lv-root
type: lvm_partition
volgroup: vg0
name: lv-root
size: 20G
# LVM logical volume - var
- id: lv-var
type: lvm_partition
volgroup: vg0
name: lv-var
size: 30G
# LVM logical volume - home
- id: lv-home
type: lvm_partition
volgroup: vg0
name: lv-home
size: -1
# Format logical volumes
- id: root-fs
type: format
volume: lv-root
fstype: ext4
- id: var-fs
type: format
volume: lv-var
fstype: ext4
- id: home-fs
type: format
volume: lv-home
fstype: ext4
# Mount points
- id: mount-efi
type: mount
device: efi-fs
path: /boot/efi
- id: mount-boot
type: mount
device: boot-fs
path: /boot
- id: mount-root
type: mount
device: root-fs
path: /
- id: mount-var
type: mount
device: var-fs
path: /var
- id: mount-home
type: mount
device: home-fs
path: /home
identity:
hostname: custom-server
username: admin
password: "$6$rounds=4096$saltsalt$hash"
ssh:
install-server: true자동 설치 구성 제공
방법 1: ISO 수정
# Mount the original ISO
mkdir -p /mnt/iso
sudo mount -o loop ubuntu-26.04-live-server-amd64.iso /mnt/iso
# Copy the contents
mkdir -p ~/custom-iso
cp -rT /mnt/iso ~/custom-iso
sudo umount /mnt/iso
# Add the autoinstall configuration
mkdir -p ~/custom-iso/autoinstall
cp autoinstall.yaml ~/custom-iso/autoinstall/user-data
touch ~/custom-iso/autoinstall/meta-data
# Modify the GRUB configuration to add an autoinstall boot entry
# Add the following to ~/custom-iso/boot/grub/grub.cfg:
cat >> ~/custom-iso/boot/grub/grub.cfg << 'EOF'
menuentry "Autoinstall Ubuntu Server" {
set gfxpayload=keep
linux /casper/vmlinuz autoinstall ds=nocloud\;s=/cdrom/autoinstall/ ---
initrd /casper/initrd
}
EOF
# Regenerate the ISO
sudo apt install xorriso -y
xorriso -as mkisofs \
-r -V "Ubuntu 26.04 Autoinstall" \
-o ~/ubuntu-26.04-autoinstall.iso \
-J -joliet-long \
--grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \
-append_partition 2 0xEF ~/custom-iso/boot/grub/efi.img \
-appended_part_as_gpt \
-eltorito-boot boot/grub/bios.img \
-eltorito-catalog boot/grub/boot.cat \
--no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot -e '--interval:appended_partition_2:all::' --no-emul-boot \
~/custom-iso방법 2: HTTP 서버
# Start an HTTP server on another machine
mkdir -p ~/autoinstall-server
cp autoinstall.yaml ~/autoinstall-server/user-data
touch ~/autoinstall-server/meta-data
cd ~/autoinstall-server
python3 -m http.server 8080
# During installation, add the kernel parameter in the GRUB command line:
# autoinstall ds=nocloud-net;s=http://192.168.1.50:8080/방법 3: PXE 네트워크 부팅
TFTP + HTTP 서버와 결합되어 대규모 배포에 적합합니다.
# Install PXE-related software
sudo apt install tftpd-hpa -y
# Place the kernel and initrd in the TFTP directory
sudo cp /mnt/iso/casper/vmlinuz /srv/tftp/
sudo cp /mnt/iso/casper/initrd /srv/tftp/
# Add kernel parameters in the PXE configuration
# kernel vmlinuz
# append initrd=initrd autoinstall ds=nocloud-net;s=http://192.168.1.50:8080/ ---비밀번호 해시 생성
# Method 1: Using mkpasswd
sudo apt install whois -y
mkpasswd --method=sha-512
# Method 2: Using openssl
openssl passwd -6
# Note: Python 3.13 removed the crypt module; use the mkpasswd or openssl methods above instead기존 시스템의 자동 설치 구성 내보내기
설치 후 현재 시스템의 설치 구성을 내보내 템플릿으로 사용할 수 있습니다.
# View the autoinstall configuration used during installation
sudo cat /var/log/installer/autoinstall-user-data
# This file contains the full installation configuration and can be reused as a template구성 검증
# Validate syntax with cloud-init
cloud-init schema --config-file autoinstall.yaml
# Check YAML format with Python
python3 -c "import yaml; yaml.safe_load(open('autoinstall.yaml'))"일반적인 문제
확인 단계에서 설치가 중단됨
interactive-sections이 빈 목록으로 설정되어 있는지 확인하세요.
autoinstall:
interactive-sections: []네트워크 구성이 적용되지 않음
네트워크 인터페이스 이름이 올바른지 확인하십시오. ip link을 사용하면 설치 환경에서 실제 인터페이스 이름을 확인할 수 있습니다.
늦은 명령 실패
curtin in-target --접두사를 사용하여 대상 시스템 내부에서 명령을 실행합니다.- 직접 경로 작업의 경우
/target/접두사를 사용하세요. - 로그 확인:
/var/log/installer/curtin-install.log