はじめに
Ubuntu ServerのAutoinstall を使うと、インストール時のユーザー作成、SSH設定、パッケージ追加、ストレージ構成などを自動化できる。
今回は、Ubuntu 26.04 ServerのAutoinstall設定をISOに直接埋め込まず、NginxからHTTP経由で配信する構成を作成した。
ISO側には起動パラメータで seed URLだけを指定し、`user-dataを変更すればインストール内容を変えられるようにする。
この構成にしておくと、Autoinstallの設定を修正するたびにISOを作り直す必要がない。
最終的に /var/www/autoinstall/ の直下に user-data、meta-data、vendor-data、network-config を配置する構成にする。
全体構成
構成イメージは以下のとおり。
flowchart TB
VM["Ubuntu 26.04 Server ISOで起動したVM"]
Nginx["Nginxサーバ
IP: 192.168.11.170
Port: 8080
DocumentRoot: /var/www/autoinstall"]
VM -->|HTTP GET
http://192.168.11.170:8080/user-data
http://192.168.11.170:8080/meta-data| Nginx
Autoinstallの設定ファイルは、NginxからHTTPで配信する。
インストール対象のVMは、起動時に指定されたNoCloud datasourceのURLを参照し、そこからuser-data や meta-data を取得する。
参考にした公式ドキュメント
主に以下を確認した。
- Ubuntu autoinstall configuration reference
- cloud-init NoCloud datasource
- Ubuntu Server documentation: configure nginx
確認したポイントは以下の3つ。
- Autoinstallの設定は
#cloud-configとトップレベルのautoinstallを使う autoinstall.versionは1を指定する- NoCloudはseed URL配下の
user-data、meta-data、必要に応じてvendor-dataやnetwork-configを取得する - GRUBのカーネルパラメータでは
;を\;としてエスケープする
配信サーバのIPアドレスを固定する
環境に合わせて変更する必要がある。今回の配信サーバは192.168.11.170を使用する。
IPアドレスの固定化は以下記事を参考にしてほしい。
Netplanの設定ファイルを編集する。
sudo vi /etc/netplan/00-installer-config.yaml
設定例は以下。
# This is the network config written by 'subiquity'
network:
ethernets:
ens18:
dhcp4: false
dhcp6: true
addresses:
- 192.168.11.170/24
routes:
- to: default
via: 192.168.11.1
nameservers:
addresses:
- 192.168.11.1
- 8.8.8.8
match:
macaddress: bc:24:11:3b:92:7a
set-name: ens18
version: 2macアドレスなどのインターフェイスは構築環境に合わせる。
設定を反映する。
sudo netplan generate
sudo netplan apply
IPアドレスを変更するとSSHが切断されるため、反映後は192.168.11.170に接続し直す。
Nginxをインストールする
Autoinstallの設定ファイルをHTTPで配信するため、Nginxをインストールする。
sudo apt update
sudo apt install -y nginx
Nginxが起動していることを確認する。
systemctl status nginx
ubuntu@ubuntu-2604-autoinstall:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service;
enabled; preset: enabled)
Active: active (running) since Wed 2026-05-20 23:55:18 JST; 3s ago
Invocation: dfee0fa447ec449da3a1369df72a04fa
Docs: man:nginx(8)
Process: 3098 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 3100 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 3127 (nginx)
Tasks: 3 (limit: 1923)
Memory: 3.1M (peak: 7.1M)
CPU: 27ms
CGroup: /system.slice/nginx.service
tq3127 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
tq3129 "nginx: worker process"
mq3131 "nginx: worker process"
May 20 23:55:18 ubuntu-2604-autoinstall systemd[1]: Starting nginx.service - A high performance web server and a reverse proxy server...
May 20 23:55:18 ubuntu-2604-autoinstall systemd[1]: Started nginx.service - A high performance web server and a reverse proxy server.
ubuntu@ubuntu-2604-autoinstall:~$Autoinstall用ディレクトリを作成する
Autoinstall設定の配信用ディレクトリを作成する。
sudo mkdir -p /var/www/autoinstall
最終的な配置は以下の形にした。
/var/www/autoinstall/
├── user-data
├── meta-data
├── vendor-data
└── network-config
flowchart TB
Root["/var/www/autoinstall/"]
Root --> UserData["user-data
Autoinstall設定本体"]
Root --> MetaData["meta-data
NoCloud用メタデータ"]
Root --> VendorData["vendor-data
追加設定・ベンダーデータ"]
Root --> NetworkConfig["network-config
ネットワーク設定"]
カスタムISOの都合上今回はルート直下を参照する。
user-dataを作成する
user-dataはAutoinstallの本体設定である。
今回は最小構成に寄せた。
vi user-data
内容は以下。
#cloud-config
autoinstall:
version: 1
locale: ja_JP.UTF-8
keyboard:
layout: jp
variant: ""
timezone: Asia/Tokyo
source:
id: ubuntu-server-minimal
identity:
hostname: ubuntu-2604-autoinstall
username: ubuntu
password: "$6$TqiSqYot.ycTffeq$Lv8kUve3numOm5TKzQA5kwDo4mMY.SmbtBmgAnTXahLPSwlJ/1oTRJZKibXq5m99J/2jqbin/FTMqxJ3ArKAv/"
ssh:
install-server: true
allow-pw: true
apt:
mirror-selection:
primary:
- uri: "http://jp.archive.ubuntu.com/ubuntu"
arches: [amd64]
- uri: "http://archive.ubuntu.com/ubuntu"
arches: [amd64]
fallback: offline-install
geoip: false
storage:
layout:
name: direct
packages:
- qemu-guest-agent
late-commands:
- curtin in-target -- systemctl enable qemu-guest-agent
updates: security
shutdown: rebootidentity.passwordには平文パスワードではなく、ハッシュ化されたパスワードを指定する。
今回の検証用パスワードはroot123 とした。
ただし、root123は弱いパスワードであるため、本番利用では使わない方がよい。検証用途に限定する。
storage設定の注意点
今回の user-data では、以下のストレージ設定を使っている。
storage:
layout:
name: directstorage.layout.name: directは、インストール対象ディスクを自動で初期化してUbuntuをインストールする設定である。
検証用VMでは扱いやすいが、物理サーバや複数ディスク構成では危険である。
本番環境や複数ディスク環境では、対象ディスクを明示的に指定する設計にした方がよい。
meta-data、vendor-data、network-configを作成する
NoCloud datasource では、seed URL 配下に user-data と meta-data が必要になる。
今回は meta-data、vendor-data、network-config を空ファイルとして作成した。
touch meta-data
touch vendor-data
touch network-config
実装メモ上では、これらは 0 バイトの空ファイルとして配置した。
配信ファイルを配置する
作成したファイルを0644で/var/www/autoinstall/に配置する。
sudo install -m 0644 user-data /var/www/autoinstall/user-data
sudo install -m 0644 meta-data /var/www/autoinstall/meta-data
sudo install -m 0644 vendor-data /var/www/autoinstall/vendor-data
sudo install -m 0644 network-config /var/www/autoinstall/network-config
所有者と権限を設定する。
sudo chown -R www-data:www-data /var/www/autoinstall
sudo chmod -R 755 /var/www/autoinstall
Nginxの設定を作成する
Nginxを 8080/tcpで待ち受けさせ、/var/www/autoinstallを配信する。
設定ファイルを作成する。
sudo vi /etc/nginx/sites-available/autoinstall
内容は以下。
server {
listen 8080;
server_name _;
root /var/www/autoinstall;
autoindex off;
access_log /var/log/nginx/autoinstall_access.log;
error_log /var/log/nginx/autoinstall_error.log;
location / {
default_type text/plain;
try_files $uri =404;
}
location ~ /\. {
deny all;
}
}この設定では、/var/www/autoinstall配下のファイルをHTTPで配信する。
また、アクセスログを /var/log/nginx/autoinstall_access.logに分けて出力するようにしている。
Autoinstallトラブルシュートでは、インストーラがどのパスを取りに来ているかを見ることが重要になるため、ログを分けておくと確認しやすい。
Nginx設定を有効化する
作成した設定を有効化する。
sudo ln -sfn /etc/nginx/sites-available/autoinstall /etc/nginx/sites-enabled/autoinstall
デフォルトサイトは不要なので無効化する。
sudo rm -f /etc/nginx/sites-enabled/default
設定ファイルの構文を確認する。
sudo nginx -t
ubuntu@ubuntu-2604-autoinstall:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ubuntu@ubuntu-2604-autoinstall:~$問題なければ、Nginxを有効化して設定を反映する。
sudo systemctl enable nginx
sudo systemctl reload nginx
Nginxが起動されることを確認する。
ubuntu@ubuntu-2604-autoinstall:~$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nginx
ubuntu@ubuntu-2604-autoinstall:~$ sudo systemctl reload nginx
ubuntu@ubuntu-2604-autoinstall:~$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Wed 2026-05-20 23:55:18 JST; 10min ago
Invocation: dfee0fa447ec449da3a1369df72a04fa
Docs: man:nginx(8)
Process: 3864 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
Main PID: 3127 (nginx)
Tasks: 3 (limit: 1923)
Memory: 3.6M (peak: 7.1M)
CPU: 41ms
CGroup: /system.slice/nginx.service
tq3127 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
tq3865 "nginx: worker process"
mq3866 "nginx: worker process"
May 20 23:55:18 ubuntu-2604-autoinstall systemd[1]: Starting nginx.service - A high performance web server and a reverse proxy server...
May 20 23:55:18 ubuntu-2604-autoinstall systemd[1]: Started nginx.service - A high performance web server and a reverse proxy server.
May 21 00:05:12 ubuntu-2604-autoinstall systemd[1]: Reloading nginx.service - A high performance web server and a reverse proxy server...
May 21 00:05:12 ubuntu-2604-autoinstall nginx[3864]: 2026/05/21 00:05:12 [notice] 3864#3864: signal process started
May 21 00:05:12 ubuntu-2604-autoinstall systemd[1]: Reloaded nginx.service - A high performance web server and a reverse proxy server.
ubuntu@ubuntu-2604-autoinstall:~$配信確認を行う
作業端末から、Nginxで配信しているファイルにアクセスできるか確認する。
今回は作業端末 192.168.11.169から確認した。
curl.exe -s -D - http://192.168.11.170:8080/user-data -o -
curl.exe -s -D - http://192.168.11.170:8080/meta-data -o NUL
curl.exe -s -D - http://192.168.11.170:8080/vendor-data -o NUL
curl.exe -s -D - http://192.168.11.170:8080/network-config -o NUL
Windows端末から実行している場合、出力破棄先はNULでよい。
最終的に、以下のURLがすべて 200 OKになることを確認した。
curl.exe -s -D - http://192.168.11.170:8080/user-data -o -
PS C:\Users\kyoro> curl.exe -s -D - http://192.168.11.170:8080/user-data -o -
HTTP/1.1 200 OKcurl.exe -s -D - http://192.168.11.170:8080/meta-data -o NUL
PS C:\Users\kyoro> curl.exe -s -D - http://192.168.11.170:8080/meta-data -o NUL
HTTP/1.1 200 OKcurl.exe -s -D - http://192.168.11.170:8080/vendor-data -o NUL
PS C:\Users\kyoro> curl.exe -s -D - http://192.168.11.170:8080/vendor-data -o NUL
HTTP/1.1 200 OKcurl.exe -s -D - http://192.168.11.170:8080/network-config -o NUL
PS C:\Users\kyoro> curl.exe -s -D - http://192.168.11.170:8080/network-config -o NUL
HTTP/1.1 200 OKUbuntu Server ISOの起動パラメータを指定する
デフォルトのISOを使用している場合はUbuntu Server ISOで起動し、GRUBのカーネルパラメータに以下を追加する。
autoinstall ds=nocloud\;s=http://192.168.11.170:8080/
ポイントは、;を\;としてエスケープすること。
GRUBのカーネルパラメータでは;が特殊文字として扱われるため、そのまま書くと意図したパラメータとして渡らない可能性がある。
今回はカスタム済みISOを使用しているため自動でインストールが走った。
ISOをカスタムしてGRUBのカーネルパラメータを埋め込む方法は下記を参考にしてほしい。
Nginxログで取得パスを確認する
インストーラを起動したら、Nginx側でアクセスログを確認する。
sudo tail -f /var/log/nginx/autoinstall_access.log
期待するアクセスは以下。
GET /user-data
GET /meta-data
GET /vendor-data
GET /network-config
インストーラ側が掴みに来ると以下のようなログが出力される。
192.168.11.48 - - [21/May/2026:00:11:25 +0900] "GET /network-config HTTP/1.1" 200 0 "-" "Cloud-Init/26.1-0ubuntu2"
192.168.11.48 - - [21/May/2026:00:11:25 +0900] "GET /meta-data HTTP/1.1" 200 0 "-" "Cloud-Init/26.1-0ubuntu2"
192.168.11.48 - - [21/May/2026:00:11:25 +0900] "GET /user-data HTTP/1.1" 200 864 "-" "Cloud-Init/26.1-0ubuntu2"
192.168.11.48 - - [21/May/2026:00:11:25 +0900] "GET /vendor-data HTTP/1.1" 200 0 "-" "Cloud-Init/26.1-0ubuntu2"Autoinstallがうまく始まらない場合、このログ確認がかなり重要になる。
再現手順まとめ
今回の構成を再現する手順は以下。
1. 配信サーバのIPアドレスを固定する
配信サーバのIPアドレスを 192.168.11.170に固定する。(環境に合わせる)
2. Nginxをインストールする
sudo apt update
sudo apt install -y nginx
3. Autoinstall用ディレクトリを作成する
sudo mkdir -p /var/www/autoinstall
4. seedファイルを配置する
sudo install -m 0644 user-data /var/www/autoinstall/user-data
sudo install -m 0644 meta-data /var/www/autoinstall/meta-data
sudo install -m 0644 vendor-data /var/www/autoinstall/vendor-data
sudo install -m 0644 network-config /var/www/autoinstall/network-config
5. Nginxを起動する
sudo nginx -t
sudo systemctl enable nginx
sudo systemctl reload nginx
6. curlで配信確認する
curl.exe -s -D - http://192.168.11.170:8080/user-data -o -
curl.exe -s -D - http://192.168.11.170:8080/meta-data -o NUL
curl.exe -s -D - http://192.168.11.170:8080/vendor-data -o NUL
curl.exe -s -D - http://192.168.11.170:8080/network-config -o NUL
4ファイルすべてが 200 OK になることを確認する。
7. Ubuntu Server ISOの起動パラメータを指定する
autoinstall ds=nocloud\;s=http://192.168.11.170:8080/
今回はカスタム済みのISOを使用しているためGRUB画面は編集を行っていない。手動指定する際は上記を使用する。
8. Nginxログを確認する
sudo tail -f /var/log/nginx/autoinstall_access.log
以下のようなアクセスが出れば、インストーラがNginxへ到達できている。
GET /user-data
GET /meta-data
GET /vendor-data
GET /network-config
セキュリティ上の注意
今回の検証用パスワードは root123である。
これは検証用としては使えるが、本番環境では使うべきではない。
また、HTTPで配信している user-dataにはパスワードハッシュが含まれる。
そのため、この構成は検証ネットワーク限定で使うべきである。
本番寄りにする場合は、少なくとも以下の対策を検討する。
- Autoinstall完了後にNginxを停止する
- 配信元セグメントを限定する
- HTTPS化する
- SSHパスワードログインではなくSSH鍵ログインにする
- 初回ログイン後にパスワード変更を必須にする
特に、Autoinstall用のHTTPサーバを常時公開したままにするのは避けた方がよい。
まとめ
Ubuntu 26.04 ServerのAutoinstall設定をNginxで配信することで、ISOを作り直さずにインストール内容を変更できるようになった。
Autoinstall がうまく動かない場合は、まず以下を見るのがよい。
sudo tail -f /var/log/nginx/autoinstall_access.log
今回の構成で自動でのUbuntu26.04デプロイが行えた。
