はじめに
この記事は以下記事の続きとなります。
PXEサーバの構築は前回の記事をご確認下さい。
CentOS8をKickstartでネットワークインストールする場合は以下の記事をご確認下さい。
Ubuntu Server 20.10版も書きました。
Ubuntu Server 20.04
でサポートされた新機能として自動インストール機能があります。
今までもPreseed
による自動インストールが可能だったと思いますが、Ubuntu Server 20.04
の自動インストールはcloud-init
形式でOS設定ができるため、内容が読みやすく設定しやすいのが特徴です。
公式の自動インストール手順は以下かと思いますが、私の環境ではどうしてもうまくいかなかったため、公式手順とは異なりますが何とか成功した手順を公開します。
注意点
- Ubuntu Desktop版は今回の方法では自動インストールできません。
構成
VirtualBoxに以下構成の仮想マシンを作成しました。
PXEサーバは以前の記事で作成したPXEサーバを使用しているため、以下PXEサーバ側の操作はVirtualBox上CentOS8での操作となります。
なお、メモリは3GB以上、できれば4GB以上のメモリを割り当てて下さい。
※最初2GBで作成した際、Out of Memory
が発生して結構ハマりました。
・自動インストール対象マシン構成
構成 | 種別 |
---|---|
CPU | 1 vCPU |
メモリサイズ | 4096 MB |
ストレージ | 20.00 GB |
ネットワーク1 | ホストオンリーアダプター |
ネットワーク2 | NAT |
・PXEサーバディレクトリ構成
ディレクトリ | パス |
---|---|
TFTPディレクトリ | /tftpboot |
HTTPディレクトリ | /pxeboot |
・アドレス構成
対象 | アドレス |
---|---|
PXEサーバ | 192.168.56.105 |
自動インストール対象マシン | 192.168.56.130 |
※自動インストール対象マシンのアドレスは自動インストール後のアドレスです。
構築の流れ
PXEサーバは構築済みの前提となります。
・PXEサーバ側手順
- Ubuntu Server 20.04のISOファイル転送
- Ubuntu Server 20.04のカーネルイメージのコピー
- TFTPブート構成ファイルの作成
- Cloud-init用ファイルの作成
- 自動インストール用ディレクトリ作成
- meta-dataファイル作成
- user-dataファイル作成
- Netplanファイルの作成
・自動インストール対象マシン側手順
- 自動インストール対象マシンの設定
- 自動インストール
Ubuntu Server 20.04の自動インストール機能について
Ubuntu Server 20.04
の自動インストールでは、前述の通りcloud-init
を使用するため、user-data
ファイルとmeta-data
ファイルが必要となります。
Ubuntu Server 20.04のISOファイル転送
CANONICALのサイトよりUbuntu Server 20.04 LTS
をダウンロードし、ダウンロードしたISOファイル(ubuntu-20.04-live-server-amd64.iso)をPXEサーバ以下のディレクトリに転送します。
ファイル | パス |
---|---|
ISOファイル | /pxeboot/ubuntu-20.04-live-server-amd64.iso |
Ubuntu Server 20.04のカーネルイメージのコピー
先ほど転送したISOファイルをマウントしてUbuntu Server 20.04
のカーネルイメージを取得します。
sudo mkdir /tftpboot/Ubuntu
sudo mount -t iso9660 -o loop ubuntu-20.04-live-server-amd64.iso /mnt
sudo cp /mnt/casper/{vmlinuz,initrd} /tftpboot/Ubuntu
sudo umount /mnt
TFTPブート構成ファイルについて
PXEブートする際に取得するブート構成ファイルの名前は決められており、以下の様な規則になります。
※参考:BIOSベースのPXEクライアントのブート・ローダー構成
- UUID (例: a8943708-c6f6-51b9-611e-74e6ac80b93d)
- 01-MAC_address (例: 01-80-00-27-c6-a1-16)
- IPアドレスの完全32ビット (例: 0A0000FD)
- IPアドレスの最上位28ビット (例: 0A0000F)
- IPアドレスの最上位24ビット (例: 0A0000)
- IPアドレスの最上位20ビット (例: 0A000)
- IPアドレスの最上位16ビット (例: 0A00)
- IPアドレスの最上位12ビット (例: 0A0)
- IPアドレスの最上位8ビット (例: 0A)
- IPアドレスの最上位4ビット (例: 0)
- default (デフォルト構成ファイル)
例えばMACアドレスのファイルを格納した場合、ホストごとにブート構成ファイルを固定できるため、それぞれのホスト専用の定義を指定することができます。
また、ブート構成ファイルの設定の書き方によっては、起動時に読み込むOSファイルやOSイメージをユーザに選択させることもできるので、default
に複数の起動定義を記載して選択することも可能です。
TFTPブート構成ファイルの作成
今回はdefault
に自動インストール用定義を記載します。
sudo cat << _EOF_ | sudo tee /tftpboot/pxelinux.cfg/default
default autoinstall
label autoinstall
kernel Ubuntu/vmlinuz
initrd Ubuntu/initrd
append autoinstall ip=dhcp url=http://192.168.56.105/pxeboot/ubuntu-20.04-live-server-amd64.iso ds=nocloud-net;s=http://192.168.56.105/pxeboot/autoinstall/
_EOF_
Cloud-init用ファイルの作成
cloud-init
で自動インストールするために必要となる、user-data
ファイルとmeta-data
ファイルを作成します。
meta-data
ファイルはAWS等で使用する場合はmeta-data
からインスタンスID等を取得するために利用しますが、今回は空ファイルを作成しておくだけで問題ありません。
user-data
、meta-data
ファイルはPXEサーバから取得するようにしますので、PXEサーバの以下に作成します。
ファイル | パス |
---|---|
user-dataファイル | /pxeboot/autoinstall/user-data |
meta-dataファイル | /pxeboot/autoinstall/meta-data |
自動インストール用ディレクトリ作成
前回のPXEサーバ構築で作成したPXEブート用ディレクトリの下に自動インストール用ディレクトリを作成します。
sudo mkdir /pxeboot/autoinstall
meta-dataファイル作成
前述の通り空ファイルを自動インストール用ディレクトリの下に作成します。
sudo touch /pxeboot/autoinstall/meta-data
user-dataファイル作成前準備
user-data
ファイルはcloud-init
の書式で作成しますが、自動インストール時に使えるコマンドは限られているため、以下公式ドキュメント等を参照し、user-data
ファイルを作成して下さい。
上記ドキュメントにはnetworkの設定も記載されていますが、私の環境ではどうやってもネットワークの設定が反映できなかったので、ネットワークの設定は別ファイルで取得するようにしています。
また、user-data
ファイル内に記載されているパスワードは以下の様な方法でハッシュ値を生成しておきます。
※今回はパスワードubuntu
で生成します。
sudo openssl passwd -6 ubuntu
user-dataファイル作成
OSの設定はインストール完了後、Ansible
等で設定する前提で、user-data
ファイルは作りすぎず、Ansible
実行に必要となる設定の追加程度に止めておきます。
ネットワークの設定は前述の通り、私の環境ではcloud-init
ではできなかったので、late-commands
で、予め作成しておいたnetplan
ファイルを取得するようにします。
但し、ネットワークインストール中は、実際のディスク領域を/target
でマウントしているようなので、/target
を頭に指定して保存する必要があります。
もし他のファイルも一緒に送りたいという方は参考にして下さい。
sudo cat << _EOF_ | sudo tee /pxeboot/autoinstall/user-data
#cloud-config
autoinstall:
version: 1
locale: ja_JP.UTF-8
keyboard:
layout: "jp"
storage:
layout:
name: lvm
identity:
hostname: ubuntu-server
username: ubuntu
password: "$6$nFV7aBiOVRpPF8Qq$l0KnHQehyWsyGRzXvQnnriXxSUbrhPrWtkhOm4lZh1wSdzz4Ga9QN3eBcf9POKo8YFF0pztU9oIwx8oyNrNsf."
ssh:
install-server: yes
user-data:
timezone: Asia/Tokyo
late-commands:
- "wget -P /target/etc/netplan http://192.168.56.105/pxeboot/autoinstall/90-network.yaml"
_EOF_
Netplanファイルの作成
netplan
ファイルはOSインストール時に自動的に作成されますが、自動生成されたファイルは基本的に手動で触るべきではないです。
/etc/netplan
配下のファイルはファイル名順に読み込まれて、前に読み込まれた設定を上書きします。
そのため、後に読み込まれるようにファイル名を指定することで、デフォルトでどのような設定がされているとしても、任意の設定に変更することができます。
デフォルトだと00-installer-config.yaml
などの名前で生成されるため、今回は90-network.yaml
という名前にします。
sudo cat << _EOF_ | sudo tee /pxeboot/autoinstall/90-network.yaml
network:
version: 2
ethernets:
enp0s3:
dhcp4: no
dhcp6: no
addresses:
- 192.168.56.130/24
enp0s8:
dhcp4: yes
dhcp6: no
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
_EOF_
自動インストール対象マシンの設定
自動インストール対象マシンはPXEブート
できるようにしておけば基本的には設定は必要ありません。
但し、インストールディスクに既にOSがインストールされているような場合は各種BIOSの起動デバイス選択からPXEブート
が先になるように変更します。
VirtualBox
の場合、仮想ストレージが空の状態であれば、以下のように起動順序
でネットワーク
にチェックされていることを確認すれば問題ありません。
自動インストール
自動インストール対象マシンの電源を入れることでネットワークインストール
が始まります。
あとは待つだけなので気長に待ちましょう。
まとめ
Ubuntu Server 20.04
で実装された機能であるため、情報が少なく苦労しましたが、何とか自動インストールできるところまでできてホッとしました。
これでUbuntu Server
構築の自動化が捗りそうです。
参考
https://ubuntu.com/server/docs/install/autoinstall
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0615
https://discourse.ubuntu.com/t/automated-server-installs/16612?_ga=2.77481941.1164907437.1596334333-228679426.1592779869
https://docs.oracle.com/cd/E77565_01/install/ol7-install-pxe-boot-bios.html