목적별 최소 cloud-init 예제 — Ubuntu 24.04 / NoCloud

01-hostname: 호스트 이름만 app-01로 설정
02-static-ip: 네트워크를 192.168.10.50/24로 설정
03-ssh-key: 배포판 기본 계정에 SSH 공개 키 등록
04-timezone: Asia/Seoul 시간대 설정
05-packages: curl, jq 설치
06-write-file: /etc/maruops-lab.conf 생성
07-first-boot-command: 인스턴스 최초 실행 시 시간 파일 생성

각 폴더는 독립된 예제입니다. 해당 폴더에서 seed를 생성합니다.
네트워크 외 예제: cloud-localds seed.img user-data meta-data
고정 IP 예제: cloud-localds --network-config=network-config seed.img user-data meta-data

모든 예제는 새 VM의 첫 부팅에 전달합니다. 운영 중인 VM에 붙이고 재부팅하는 것만으로 다시 적용되지 않습니다.
VM마다 meta-data의 instance-id를 고유하게 정합니다. hostname 예제와 충돌하지 않게 local-hostname은 생략했습니다.
각 user-data에는 해당 목적의 설정만 들어 있습니다. 이미지·플랫폼의 기본 동작과 설정은 별도로 적용됩니다.
계정 생성/SSH 키가 없는 예제는 접속 정보를 준비하지 않습니다. 이미지·플랫폼의 기존 접속 수단이나 콘솔이 필요합니다.
03의 공개 키 자리표시자는 실제 .pub 한 줄로 바꿉니다. 개인 키는 넣지 않습니다.
02는 실제 LAN 연결 예시입니다. MAC/IP/접두사/게이트웨이/DNS는 사용 환경에 맞게 수정합니다.
02를 QEMU 기본 user 네트워크에서 시험하려면 상위 network-config.static의 10.0.2.x 설정을 사용합니다.
고정 IP 파일의 루트는 version: 2이며 network:로 감싸지 않습니다. user-data와 network-config는 다른 파일입니다.
02의 user-data는 빈 cloud-config 매핑입니다. meta-data에는 instance-id만 있고 hostname은 지정하지 않습니다.
여러 설정을 합칠 때 user-data의 #cloud-config는 맨 위에 한 번만 씁니다. network-config는 별도 파일로 둡니다.
cloud-init clean은 운영 서버에서 실행하지 않습니다.

확인 범위: YAML/cloud-init 스키마, NoCloud seed 생성, 고정 IP의 Netplan 변환·설정 생성.
이 최소 예제 7개의 실제 첫 부팅은 별도로 실행 검증하지 않았습니다.
