Ubuntu 20.04 LTS Server で登場した Autoinstall YAML で自動インストールを行う(試行錯誤篇)


Linux ディストリビューションの一つ、Ubuntu の最新の LTS 版 20.04(Focal Fossa)がリリースされました。

最近は、いろいろなOSを素早く利用するために、CentOS なら kickstart といった自動インストールする仕組みを利用して、OS を導入しています。

Ubuntu 18.04 以前のインストール

従来、Debian ベースの Preseed を用いて自動でインストールする仕組みが提供されていました。

インストーラで聞かれるすべての質問を答えるような形で、 個人的には、直感的ではないと感じていました。

例えば、下記。
インストーラでよくある、パスワードの再入力を自動化しています。

d-i passwd/root-password password hogehoge
d-i passwd/root-password-again password hogehoge

Ubuntu 20.04 で導入された Autoinstall

新しく YAML 形式の自動インストール機能が利用可能になりました。

Preseed のような名称があるのか確認したのですがよく分からず、ここでは Autoinstall と呼びます。

cloud-init と同様に、user-data という YAML ファイルをインストーラに読み込ませます。

user-data の作成

詳細は後ほど説明しますが、試行錯誤の結果この user-data を使用します。

#cloud-config
autoinstall:
    version: 1
    identity:
        hostname: ubuntu-vm
        username: yasu
        password: "$6$以下略"
    ssh:
        install-server: yes
        authorized-keys:
            - "ssh-ed25519 以下略"
        allow-pw: true
    packages:
        - language-pack-ja
    keyboard:
        layout: jp
    refresh-installer:
        update: yes
    late-commands:
        - "mkdir -p /target/root/.ssh/"
        - "echo 'ssh-ed25519 以下略' >> /target/root/.ssh/authorized_keys"
        - chroot /target /bin/sh -c "apt-get -y upgrade"
    user-data:
        disable_root: false

Preseed よりかなりシンプルになりました。

自動インストールの実施

user-data の渡し方として、下記があります。

  • PXE インストール
  • インストール ISO でブートオプションで URL 指定
  • インストール ISO と user-data の ISO をマウント

一般的な家庭用ネットワークなので、PXE はできず、ブートオプションで URL を指定する方法を検討したのですが

autoinstall ds=nocloud-net;s=http://(Apache IP)

のように、起動オプションで渡しても、自動インストールが走らず、Apache のアクセスログを見ても来ている様子はありませんでした。

そこで、user-data の ISO をマウントすることにしました。

まずは、ボリュームラベルが「cidata」となる ISO を作成します。

Amazon Linux 2 をローカルで実行するときと同様の手順で作成可能です。

genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

あとは、VMware なり、VirtualBox なりで、

  1. ubuntu-20.04-live-server-amd64.iso
  2. seed.iso

の順でマウントして仮想マシンを起動させます

そのままだと、しばらく読み込んだ後に本当に自動インストールするか yes / no で聞かれます。

起動オプションに「autoinstall」を追記するとこの質問をスキップできます。

試行錯誤を繰り返す場合、autoinstall を追記したものをインストール ISO として用意しておくと便利かもしれません。

また、シリアルポートが用意できる環境なら、「console=ttyS1,9600」と書いておくとファイルに書き出されるのでデバッグは楽になるかもしれません。

Ubuntu 20.04 autoinstall grub

ただ、日本語キーボードの問題で = が打てないので、これをやる場合にはインストール ISO も作成した方が良いかと思います。

動作しない点

下記は設定したものの動作を確認できませんでした。

identity username, password などのユーザー作成

サンプルにも記載されている下記の部分です。

    identity:
        username: yasu
        password: "$6$以下略"
    ssh:
        authorized-keys:
            - "ssh-ed25519 以下略"

yasu というユーザーを作成するように指定するも無視され、実際は ubuntu というユーザーが作成されています。

root@ubuntu-vm:~# ll /home/
total 12
drwxr-xr-x  3 root   root   4096 Apr 26 02:33 ./
drwxr-xr-x 20 root   root   4096 Apr 26 02:33 ../
drwxr-xr-x  3 ubuntu ubuntu 4096 Apr 26 02:33 ubuntu/

パスワードも、authorized-keys も設定されていないのでログイン不可能です。

root@ubuntu-vm:~# grep ubuntu /etc/shadow
ubuntu:!:18378:0:99999:7:::

今回は、late-commands で root ユーザーに authorized_keys を流し込んで無理矢理ログインしました。
ubuntu ユーザーを使う場合も、ここを工夫するしかなさそうです。

    late-commands:
        - "mkdir -p /target/root/.ssh/"
        - "echo 'ssh-ed25519 以下略' >> /target/root/.ssh/authorized_keys"

地域の設定

日本語を利用、タイムゾーンも JST を設定しています。

    locale: ja_JP.UTF-8
    user-data:
        timezone: "Asia/Tokyo"

しかし、反映されず・・・

root@ubuntu-vm:~# localectl
   System Locale: LANG=C.UTF-8
       VC Keymap: n/a
      X11 Layout: jp
       X11 Model: pc105
root@ubuntu-vm:~# timedatectl status | grep zone
                Time zone: Etc/UTC (UTC, +0000)

キーボードだけは反映されているようです。

    keyboard:
        layout: jp

まとめ

Autoinstall YAML により従来は手作業、もしくは煩雑な Preseed で自動インストールしていた作業を簡単に自動化できることを確認しました。

wget, curl, git などは明示的に指定しなくてもインストールされていました。

また、VMware のゲストの場合、open-vm-tools もインストールされていました。

Preseed でインストールした Ubuntu 18.04 ではこれらは明示的にインストールしていたのでとても良いです。

ユーザー設定、言語設定といったリファレンスに書かれているものも、正常に動作しない部分もありこれからといった印象がありますが、コマンドを流し込むことも可能なので、工夫次第でなんとかなりそうです。


Comments

comments

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)