Ubuntu Weekly Recipe

第615回 サーバー版インストーラーに導入された自動インストール機能

この記事を読むのに必要な時間:およそ 5.5 分

より本格的なコンフィグを用意する

ConfigReferenceを参考に,より本格的な設定を用意してみましょう。

$ cat > www/user-data << 'EOF'
#cloud-config
autoinstall:
  version: 1
  locale: ja_JP.UTF-8
  keyboard:
    layout: "jp"
  apt:
    preserve_sources_list: false
    primary:
        - arches: [default]
          uri: "http://archive.ubuntu.com/ubuntu"
    geoip: true
  storage:
    layout:
      name: lvm
  identity:
    hostname: ubuntu-server
    realname: "Mitsuya Shibata"
    username: ubuntu
    password: "$6$/X6MRgjz4jCIK8.G$FhJbD17m9qTcMA8FHMPcFvp7v2wvgmRBdvdEdTiZXZRwuZFUVsear9.vYY01QcwPuYAMRMvSJoJKfUlaBviU3/"
  ssh:
    install_server: true
    authorized-keys: [ "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmhhimVNdsJLG3Sc6s3QD0nM5esEjUPQtC1k9b5M8fsp75ZaYhgoE3VUE+vXe5jD0tMlVbrzly4OnghloOgBtmrTqiuC7iUxcfWQ+11b7RI660m43ZQinafobZo7jMHOE2IwLFw5/bj6xm8LiXDn1Y2pA2d13V1f9MPKNexsYeuBfsru4AlwhKifEEjL0PS4saV1tcT1WM3na8jstI6jmdsOQ+cngj8HnpWTg8+YIFe1iqAnIIuFWSKjLqTFrJRIO4pnzNeo0naHqjxVoAytUqjxjXWT093DxW0wDvHUNxRhSwqL6S45ehcD2M7AXszOW2ZbX3i455SB2bClXZHBN2Q== shibata" ]
  reporting:
    hook:
      type: webhook
      endpoint: http://_gateway:3003/cgi-bin/done
      level: INFO
  user-data:
    timezone: Asia/Tokyo
EOF

注意すべきポイントをいくつか見ていきましょう。

  apt:
    preserve_sources_list: false
    primary:
        - arches: [default]
          uri: "http://archive.ubuntu.com/ubuntu"
    geoip: true

APTのリポジトリの設定です。これはcurtinのapt関連の設定をそのまま記述します。preserve_sources_listfalseにすることで,/etc/apt/sources.listを変更することを示しています。またgeoiptrueに指定することでIPアドレスから位置情報を推定し,適切なミラーサーバーを選択してくれます。他にもGPG鍵を含む,サードパーティのリポジトリの追加なども可能です。

  storage:
    layout:
      name: lvm

ストレージはケースバイケースで複雑になりがちなので,公式Wikiのstorageの設定を参照してください。ここでは標準のストレージ全体をLVM設定にする方法を記述しています。今回設定していないネットワークも複雑な設定になりがちです。原則としてnetplanの設定をそのまま記述する形になります。

  ssh:
    install_server: true
    authorized-keys: [ "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmhhimVNdsJLG3Sc6s3QD0nM5esEjUPQtC1k9b5M8fsp75ZaYhgoE3VUE+vXe5jD0tMlVbrzly4OnghloOgBtmrTqiuC7iUxcfWQ+11b7RI660m43ZQinafobZo7jMHOE2IwLFw5/bj6xm8LiXDn1Y2pA2d13V1f9MPKNexsYeuBfsru4AlwhKifEEjL0PS4saV1tcT1WM3na8jstI6jmdsOQ+cngj8HnpWTg8+YIFe1iqAnIIuFWSKjLqTFrJRIO4pnzNeo0naHqjxVoAytUqjxjXWT093DxW0wDvHUNxRhSwqL6S45ehcD2M7AXszOW2ZbX3i455SB2bClXZHBN2Q== shibata" ]

サーバー用途ならOpenSSHサーバーはインストールしておきたいところでしょう。気をつけなければいけないのは,本記事執筆時点ではサーバーをインストールするキーはinstall-serverではなくinstall_serverです。これはソースコード側が単なる記述ミスであるため,20.04のリリース時点では解消している予定です。

authorized-keysにはインストール時のユーザーのSSH用公開鍵を複数登録できます。公開鍵が未登録の場合は,SSHのパスワードログインがオンの状態でインストールされます。

  reporting:
    hook:
      type: webhook
      endpoint: http://_gateway:3003/cgi-bin/done
      level: INFO

reportingではインストール時の進捗を報告する仕組みです。現時点では標準出力に出力するか,webhookで流し込むかの二択です。ここではwebhookを指定しています。

前述のPython 3の組み込みサーバーでは--cgiオプションをつけるとCGI機能が有効になり,cgi-binディレクトリ以下にCGIスクリプトを配置できます。たとえば,次のようなスクリプトを用意しておくと,installed.jsonにログファイルが残るようになります。

$ mkdir www/cgi-bin
$ cat > www/cgi-bin/done << 'EOF'
#!/usr/bin/bash

read -n $CONTENT_LENGTH QUERY_STRING_POST
echo $QUERY_STRING_POST >> installed.json

echo "Content-type: text/plain"
echo ""
echo "OK"
EOF
$ chmod +x www/cgi-bin/done

$ curl -X POST -H "Content-Type: application/json" \
    -d '{"key":"value"}' http://localhost:3003/cgi-bin/done
OK

インストールの進捗を把握したり,インストールが完了したら別の処理を実行したいときなどに,使えるでしょう。

  user-data:
    timezone: Asia/Tokyo

実はSubiquityにはタイムゾーンを指定するインターフェースが存在しません。そのためautoinstallキー以下でもタイムゾーンは設定できません※3⁠。しかしながらuser-dataキーを使えば,最終的に生成されるcloud-init用の設定を指定可能です。上記ではcloud-init経由でtimezone指定するようにしています。ちなみにcloud-init用に設定は一通り使えるため,複数のアカウントなどSubiquityの範囲外の事前設定も一通り行えます。

※3
debconf-selectionsによって設定できるかもしれませんが,今回は試していません。Subiquityの自動インストールの仕組みを考えると,debconfi-selectionsによる設定は「最終的な回避策」ぐらいに考えておくのが良いでしょう。

他にもearly-commandslate-commandserror-commandsによって,インストール開始直後・終了直後・エラー発生時に実行するコマンドを指定可能です。snapspackagesで,自動インストールするパッケージを指定できます。

インストール時に必要な設定はひととおり自動化できるようになっているはずですので,まずはConfigReferenceを参照しながら,各自のインストールオプションをYAMLファイルに落とし込んでみてください。

ちなみにinteractive-sections*を指定することで,⁠YAMLで記述した項目を設定済みにした上で,インタラクティブにインストール」が可能になります。

  interactive-sections:
    - "*"

ただしパスワードなどセンシティブなデータは自動入力されませんので注意してください。

USBスティックからインストールを自動化する

最後にUSBスティックから設定を流し込んでみましょう。

$ sudo apt install cloud-image-utils
$ cd www
$ cloud-localds ../user-data.img user-data

これで設定入りのイメージファイルを作成できました。これをUSBスティックにddで書き込めば良いのですが,今回はQEMU上にマウントすることにします。

$ qemu-system-x86_64 -enable-kvm -no-reboot -m 1024 \
    -drive file=image.qcow2,format=qcow2,cache=none,if=virtio \
    -cdrom focal-live-server-amd64.iso \
    -drive file=user-data.img,format=raw

注意すべきなのはUSBからだと完全な自動化はできないということです。インストーラーが起動したあとに「Continue with autoinstall?」と表示されるので,そこで「yes」と入力してください。

もしどうしても自動化したいなら,PXEブートを使うことになるでしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。