๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ‘จ‍๐Ÿ’ปDevOps/์ž๋™ํ™”

proxmox cloud-init ์œผ๋กœ ์šฐ๋ถ„ํˆฌ ํ…œํ”Œ๋ฆฟ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

by YangsDev 2025. 10. 11.

์‹œ์ž‘ํ•˜๋ฉฐ

๊ฐœ์ธ ์žฅ๋น„์—์„œ Proxmox ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ ํ•˜๊ณ  ์žˆ๋‹ค. 

์ฒ˜์Œ์—๋Š” VM ๋งŒ๋“ค์–ด์ง€๋Š”๊ฒƒ์— ๊ฐ์‚ฌ ํ–ˆ๋Š”๋ฐ, ์‚ฌ๋žŒ์ด ์ฐธ ๊ฐ„์‚ฌํ•˜๋‹ค.

 

 

์ ์  ์šฐ๋ถ„ํˆฌ ์„ค์น˜ ํ•˜๋Š”๊ฒŒ ๊ท€์ฐฎ์•„์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋งˆ์น˜ AWS Console์—์„œ ๋”ธ๊น ํ•˜๊ณ  ๋งŒ๋“ค์ˆ˜์žˆ๋„๋ก ์ฒ˜์Œ์—๋Š” ์…‹ํŒ…๋œ VM์„ ํด๋ก  ํ•ด์„œ ์ผ๋‹ค.

 

๊ทผ๋ฐ, id ์ถฉ๋Œ, DHCP ์‹คํŒจ๋“ฑ ๋˜ ์‚ฌ๋žŒ ๊ท€์ฐฎ๊ฒŒ ํ•˜๋Š” ์ผ๋“ค์ด ๋Š˜์–ด๋‚œ๋‹ค.

์ด๋ž˜์ €๋ž˜ ์ฐพ์•„๋ณด๋˜ ์ค‘ ์ง„์งœ AWS์—์„œ `cloud-init` ์ด๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋”ธ๊น ํ•˜๊ณ  ์„ค์น˜ ํ•œ๋‹ค๊ณ  ํ•˜๊ธธ๋ž˜ ๊ทธ ๋‚ด์šฉ์„ ์˜ค๋Š˜ ์ •๋ฆฌ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

1๏ธโƒฃ Ubuntu Cloud Image ๋‹ค์šด๋กœ๋“œ ๋ฐ ๋””์Šคํฌ ํฌ๊ธฐ ์กฐ์ •

๋จผ์ € ์ตœ์‹  Jammy(22.04) ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ๋””์Šคํฌ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
qemu-img resize jammy-server-cloudimg-amd64.img 50G
  • Ubuntu ๊ณต์‹ Cloud Image๋Š” cloud-init์ด ์ด๋ฏธ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด, ์ดˆ๊ธฐ
    ์„ค์ •์„ ์ž๋™ํ™”ํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.\
  • ๊ธฐ๋ณธ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ qemu-img resize ๋ช…๋ น์œผ๋กœ 50GB๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Proxmox VM ์ƒ์„ฑ

qm create 99001 --name=ubuntu-22-04 --memory=2048 --net0 virtio,bridge=vmbr1
  • VM ID: 99001
  • ์ด๋ฆ„: ubuntu-22-04
  • ๋ฉ”๋ชจ๋ฆฌ: 2GB
  • ๋„คํŠธ์›Œํฌ: VirtIO + ๋ธŒ๋ฆฟ์ง€(vmbr1)

๋„คํŠธ์›Œํฌ ๋ธŒ๋ฆฌ์ง€๋Š” ํ™˜๊ฒฝ์— ๋งž๊ฒŒ vmbr0 ๋˜๋Š” vmbr1๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


3๏ธโƒฃ Cloud Image๋ฅผ VM ๋””์Šคํฌ๋กœ ๋“ฑ๋ก

qm set 99001 --virtio0 iSCSI-2T:0,import-from=/mnt/pve/NFS-AN/template/iso/jammy-server-cloudimg-amd64.img
  • virtio0 ๋””์Šคํฌ๋กœ ์—ฐ๊ฒฐ\
  • import-from ์˜ต์…˜์„ ์ด์šฉํ•ด ๊ธฐ์กด Cloud Image๋ฅผ ์ง€์ •์Šคํ† ๋ฆฌ์ง€(iSCSI-2T)๋กœ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.\
  • import ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ QCOW2 → RAW ๋ณ€ํ™˜์ด ์ด๋ค„์ง‘๋‹ˆ๋‹ค.

4๏ธโƒฃ Cloud-Init ๋“œ๋ผ์ด๋ธŒ ์ถ”๊ฐ€

qm set 99001 --ide2 iSCSI-2T:cloudinit
  • Cloud-Init ์„ค์ • ๋“œ๋ผ์ด๋ธŒ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ์ดˆ๊ธฐ ๋ถ€ํŒ… ์‹œ ์‚ฌ์šฉ์ž ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\
  • ์ฃผ๋กœ SSH ํ‚ค, ํ˜ธ์ŠคํŠธ๋ช…, ๋„คํŠธ์›Œํฌ ์„ค์ • ๋“ฑ์„ ์ž๋™ํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๋ถ€ํŒ… ๋ฐ ์ฝ˜์†” ์„ค์ •

qm set 99001 --boot order=virtio0
qm set 99001 --serial0 socket --vga serial0
  • ๋ถ€ํŒ… ์ˆœ์„œ๋ฅผ virtio0๋กœ ์„ค์ •\
  • serial0 ์ฝ˜์†”์„ ํ†ตํ•ด ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ„ฐ๋ฏธ๋„ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋„๋ก
    ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    qm terminal 99001๋กœ ์ฝ˜์†” ์ ‘๊ทผ ๊ฐ€๋Šฅ

6๏ธโƒฃ Cloud-Init ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ์ง€์ •

qm set 99001 --cicustom "user=NFS-GS:snippets/ubuntu-init.yaml"
  • ์‚ฌ์šฉ์ž ์ •์˜ Cloud-Init YAML์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.\
  • snippets/ubuntu-init.yaml ํŒŒ์ผ์—๋Š” ์‚ฌ์šฉ์ž, ํŒจํ‚ค์ง€, SSH ์„ค์ • ๋“ฑ์„
    ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ (ubuntu-init.yaml):

#cloud-config
package_update: true
package_upgrade: true
timezone: Asia/Seoul
packages:
  - qemu-guest-agent
  - curl
  - ca-certificates
  - sudo

users:
  - default
  - name: yangs
    gecos: Yangs Admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    groups: [sudo, docker]
    lock_passwd: false
    ssh_authorized_keys:
      - "ssh-rsa ..."
runcmd:
  - |
    echo "=== ํƒ€์ž„์กด ์„ค์ • (Asia/Seoul) ==="
    timedatectl set-timezone Asia/Seoul
    echo "ํ˜„์žฌ ํƒ€์ž„์กด: $(timedatectl show --property=Timezone --value)"

  - |
    echo "=== Docker ์„ค์น˜ ์ค‘ ==="
    curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
    chmod +x /tmp/get-docker.sh
    sh /tmp/get-docker.sh

  - |
    echo "=== Docker Compose ์„ค์น˜ ์ค‘ ==="
    curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \
      -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

  - |
    echo "=== Docker ์„œ๋น„์Šค ์„ค์ •: ์ž๋™ ์‹œ์ž‘ ๋ฐ ์žฌ์‹œ์ž‘ ์ •์ฑ… ==="
    systemctl enable docker
    mkdir -p /etc/docker
    echo '{' > /etc/docker/daemon.json
    echo '  "log-driver": "json-file",' >> /etc/docker/daemon.json
    echo '  "log-opts": {' >> /etc/docker/daemon.json
    echo '    "max-size": "50m",' >> /etc/docker/daemon.json
    echo '    "max-file": "3"' >> /etc/docker/daemon.json
    echo '  }' >> /etc/docker/daemon.json
    echo '}' >> /etc/docker/daemon.json
    systemctl daemon-reload
    systemctl restart docker
    sudo usermod -aG docker yangs || true
    echo "=== Docker ์„ค์ • ์™„๋ฃŒ ==="


  - |
    echo "=== QEMU Guest Agent ํ™œ์„ฑํ™” ==="
    systemctl enable qemu-guest-agent
    systemctl start qemu-guest-agent

  - |
    echo "=== Prometheus Node Exporter ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ==="
    sudo docker run --name=node-exporter \
      --restart=always \
      -d \
      --net="host" \
      --pid="host" \
      -v "/:/host:ro,rslave" \
      quay.io/prometheus/node-exporter:latest \
      --path.rootfs=/host || true
    echo "=== Node Exporter ์‹คํ–‰ ํ™•์ธ ==="
    sudo docker ps | grep node-exporter || echo "Node Exporter ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์™„๋ฃŒ"

  - |
    echo "=== Ubuntu Clone ์ดˆ๊ธฐํ™” ์‹œ์ž‘ ==="
    set -e
    echo "[1/6] machine-id ์ดˆ๊ธฐํ™” ์ค‘..."
    rm -f /etc/machine-id
    dbus-uuidgen --ensure=/etc/machine-id
    systemd-machine-id-setup

    echo "[2/6] SSH ํ˜ธ์ŠคํŠธ ํ‚ค ์ดˆ๊ธฐํ™” ์ค‘..."
    rm -f /etc/ssh/ssh_host_*
    dpkg-reconfigure -f noninteractive openssh-server


    echo "[4/6] netplan / udev ๋„คํŠธ์›Œํฌ ์บ์‹œ ์ดˆ๊ธฐํ™” ์ค‘..."
    rm -f /etc/udev/rules.d/70-persistent-net.rules
    rm -f /etc/netplan/*.bak

    echo "[5/6] ํ˜ธ์ŠคํŠธ๋„ค์ž„ ์ดˆ๊ธฐํ™” ์ค‘..."
    new_hostname="ubuntu-$(openssl rand -hex 3)"
    hostnamectl set-hostname "$new_hostname"
    echo "์ƒˆ ํ˜ธ์ŠคํŠธ๋ช…: $new_hostname"

    echo "[6/6] ๋กœ๊ทธ ๋ฐ ์บ์‹œ ์ •๋ฆฌ ์ค‘..."
    rm -rf /var/log/*
    rm -rf /tmp/*
    rm -rf /var/tmp/*

    echo "=== ์ดˆ๊ธฐํ™” ์™„๋ฃŒ ==="
    echo "์ด์ œ 'sudo reboot'์œผ๋กœ ์žฌ๋ถ€ํŒ… ํ•ด์ฃผ์„ธ์š”."

power_state:
  mode: reboot
  timeout: 30
  message: "Ubuntu ์ดˆ๊ธฐํ™” ์™„๋ฃŒ ํ›„ ์ž๋™ ์žฌ๋ถ€ํŒ…ํ•ฉ๋‹ˆ๋‹ค."

7๏ธโƒฃ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜

qm template 99001
  • ์„ค์ • ์™„๋ฃŒ๋œ VM์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\
  • ์ดํ›„ qm clone ๋ช…๋ น์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€