Ubuntu Server 20.10の自動インストール機能でネットワークインストールする。

# はじめに
以前「[Ubuntu Server 20.04の自動インストール機能でネットワークインストールする。](https://qiita.com/sakai00kou/items/7ce4a8a410251b98b2ac)」の記事を投稿しましたが、`Ubuntu Server 20.10`でも試してみました。

先に前回実施した`Ubuntu Server 20.04`と異なる点だけ書いておくと、`Ubuntu Server 20.04`では`cloud-init`の`user-data`にアドレス設定を記載しても反映されず、`late-commands`で無理やり対応させていましたが、`Ubuntu Server 20.10`では`user-data`に記載したアドレス情報が反映されるようになり、ようやく本来あるべき姿になりました。

アドレス設定以外は、ほぼ前回の記事の転載となりますのでご了承下さい。

この記事は以下記事の続きとなります。
PXEサーバの構築は前回の記事をご確認下さい。

- [OS自動インストールを行うためのPXEブート環境を作る](https://qiita.com/sakai00kou/items/bc6ae4d6b4cacc4b8af9)
- [Ubuntu Server 20.04の自動インストール機能でネットワークインストールする。](https://qiita.com/sakai00kou/items/7ce4a8a410251b98b2ac)

CentOS8をKickstartでネットワークインストールする場合は以下の記事をご確認下さい。

- [CentOS8をKickstartでネットワークインストールする。](https://qiita.com/sakai00kou/items/16b22a64e239170e774a)

# 注意点
- Ubuntu Desktop版は今回の方法では自動インストールできません。

# 構成
VirtualBoxに以下構成の仮想マシンを作成しました。

PXEサーバは以前の記事で作成したPXEサーバを使用しているため、以下PXEサーバ側の操作はVirtualBox上CentOS8での操作となります。

なお、メモリは**3GB以上、できれば4GB以上のメモリ**を割り当てて下さい。

**・自動インストール対象マシン構成**

|構成|種別|
|:--|:--|
|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サーバ側手順**
1. Ubuntu Server 20.10のISOファイル転送
2. Ubuntu Server 20.10のカーネルイメージのコピー
3. TFTPブート構成ファイルの作成
4. Cloud-init用ファイルの作成
5. 自動インストール用ディレクトリ作成
6. meta-dataファイル作成
7. user-dataファイル作成

**・自動インストール対象マシン側手順**
1. 自動インストール対象マシンの設定
2. 自動インストール

# Ubuntu Server 20.10の自動インストール機能について
`Ubuntu Server 20.10`の自動インストールでは、前述の通り`cloud-init`を使用するため、`user-data`ファイルと`meta-data`ファイルが必要となります。

## Ubuntu Server 20.10のISOファイル転送
[CANONICALのサイト](https://jp.ubuntu.com/download)より`Ubuntu Server 20.10`をダウンロードし、ダウンロードしたISOファイル（ubuntu-20.10-live-server-amd64.iso）をPXEサーバ以下のディレクトリに転送します。

|ファイル|パス|
|:--|:--|
|ISOファイル|/pxeboot/ubuntu-20.10-live-server-amd64.iso|

## Ubuntu Server 20.10のカーネルイメージのコピー
先ほど転送したISOファイルをマウントして`Ubuntu Server 20.10`のカーネルイメージを取得します。

```shell:カーネルイメージ格納ディレクトリ作成
sudo mkdir /tftpboot/Ubuntu
```

```shell:ISOイメージマウント
sudo mount -t iso9660 -o loop ubuntu-20.10-live-server-amd64.iso /mnt
```

```shell:カーネルイメージコピー
sudo cp /mnt/casper/{vmlinuz,initrd} /tftpboot/Ubuntu
```

```shell:ISOイメージアンマウント
sudo umount /mnt
```

# TFTPブート構成ファイルについて
PXEブートする際に取得するブート構成ファイルの名前は決められており、以下の様な規則になります。
※参考：[BIOSベースのPXEクライアントのブート・ローダー構成](https://docs.oracle.com/cd/E77565_01/install/ol7-install-pxe-boot-bios.html)

- **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`に自動インストール用定義を記載します。

```shell:/tftpboot/pxelinux.cfg/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.10-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サーバ構築](https://qiita.com/sakai00kou/items/bc6ae4d6b4cacc4b8af9)で作成したPXEブート用ディレクトリの下に**自動インストール用ディレクトリ**を作成します。

```shell:自動インストール用ディレクトリ作成
sudo mkdir /pxeboot/autoinstall
```

### meta-dataファイル作成
前述の通り空ファイルを自動インストール用ディレクトリの下に作成します。

```shell:meta-dataファイル作成
sudo touch /pxeboot/autoinstall/meta-data
```

### user-dataファイル作成前準備
`user-data`ファイルは`cloud-init`の書式で作成しますが、自動インストール時に使えるコマンドは限られているため、以下公式ドキュメント等を参照し、`user-data`ファイルを作成して下さい。

- [Automated Server Installs Config File Reference](https://ubuntu.com/server/docs/install/autoinstall-reference)

また、`user-data`ファイル内に記載されているパスワードは以下の様な方法でハッシュ値を生成しておきます。
※今回はパスワード`ubuntu`で生成します。

```shell:パスワードハッシュ化
sudo openssl passwd -6 ubuntu
```

### user-dataファイル作成
OSの設定はインストール完了後、`Ansible`等で設定する前提で、`user-data`ファイルは作りすぎず、`Ansible`実行に必要となる設定の追加程度に止めておきます。

`Ubuntu Server 20.04`の場合は、`user-data`にアドレス設定を記載しても思った通りに反映されませんでしたが、`Ubuntu Server 20.10`では反映されるようになったため、`user-data`に記載します。

```yaml:user-dataファイル作成
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."
  network:
    network:
      version: 2
      ethernets:
        enp0s3:
          dhcp4: false
          dhcp6: false
          addresses: [192.168.56.130/24]
        enp0s8:
          dhcp4: true
          dhcp6: false
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4]
  ssh:
    install-server: yes
  user-data:
    timezone: Asia/Tokyo
_EOF_
```

# 自動インストール対象マシンの設定
自動インストール対象マシンは`PXEブート`できるようにしておけば基本的には設定は必要ありません。

但し、インストールディスクに既にOSがインストールされているような場合は各種BIOSの起動デバイス選択から`PXEブート`が先になるように変更します。

`VirtualBox`の場合、仮想ストレージが空の状態であれば、以下のように`起動順序`で`ネットワーク`にチェックされていることを確認すれば問題ありません。

![01_boot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/132ce3fd-f000-5fb4-a2de-b1ba3ba9556d.jpeg)

# 自動インストール
自動インストール対象マシンの電源を入れることで`ネットワークインストール`が始まります。

あとは待つだけなので気長に待ちましょう。

# まとめ
`Ubuntu Server 20.10`になって小細工しなくてもネットワーク設定が可能となったのは良かったです。

これでネットワークの部分を気にせず`user-data`作成に注力することができそうです。