Ubuntuのサーバー版のインストーラーである
インストールの自動化
第495回でも紹介したように、

しかしながら従来のdebian-installerと比べると、
debian-installerでは第154回の
何台もの物理マシンにUbuntuをインストールするなら、
Ubuntu Weekly Topicsの2020年4月10日号でも紹介しているように、
ちなみにSubiquityはsnapパッケージとして提供されています。つまりUbuntu 18.

簡易的なYAMLファイルで自動インストールを体験
まずは簡易的なYAMLファイルで自動インストールを体験してみましょう。これには公式WikiのQuickStartの手順が参考になります。必要になるのはQEMUが動くUbuntuと開発中のUbuntu 20.
自動インストールの設定を記述するYAMLファイルはcloud-configフォーマットで記述します。また作成したファイルはcloud-initと同じ手順でインストーラーに渡します。cloud-initにおいてコンフィグデータをどこに保存するか、
- SMBIOS
(System Management BIOS) 上のシリアル番号 - カーネルのコマンドラインパラメーター
- ラベル
「cidata」 が付けられたファイルシステム
このうち1は主に仮想マシン向けの機能なので、
必要なパッケージをインストールし、
$ mkdir autoinstall && cd $_ $ sudo apt install qemu-system-x86 qemu-utils $ wget http://cdimage.ubuntu.com/ubuntu-server/daily-live/current/focal-live-server-amd64.iso
cloud-configフォーマットのファイル
$ mkdir www $ openssl passwd -6 ubuntu $6$/X6MRgjz4jCIK8.G$FhJbD17m9qTcMA8FHMPcFvp7v2wvgmRBdvdEdTiZXZRwuZFUVsear9.vYY01QcwPuYAMRMvSJoJKfUlaBviU3/ $ cat > www/user-data << 'EOF' #cloud-config autoinstall: version: 1 identity: hostname: ubuntu-server username: ubuntu password: "$6$/X6MRgjz4jCIK8.G$FhJbD17m9qTcMA8FHMPcFvp7v2wvgmRBdvdEdTiZXZRwuZFUVsear9.vYY01QcwPuYAMRMvSJoJKfUlaBviU3/" EOF $ touch www/meta-data
自動インストールの設定は
- ホスト名を
「ubuntu-server」 にする - ユーザー名を
「ubuntu」 にする - パスワードを
「ubuntu」 にする
それ以外はSubiquityの既定の設定値が使われます。ちなみに
「meta-data」
今回はHTTP経由でこれらの設定ファイルを提供することにします。よってPython 3の組み込みHTTPサーバーを起動しておきましょう。
$ cd www $ python3 -m http.server --cgi 3003 $ curl http://localhost:3003/user-data (中略) <li><a href="meta-data">meta-data</a></li> <li><a href="user-data">user-data</a></li> (後略)
user-dataが見えていることを確認できました。ちなみに--cgi
」
$ sudo mount -r focal-live-server-amd64.iso /mnt $ qemu-img create -f qcow2 image.qcow2 10G $ 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 \ -kernel /mnt/casper/vmlinuz \ -initrd /mnt/casper/initrd \ -append 'autoinstall ds=nocloud-net;s=http://_gateway:3003/' \ -nographic $ sudo umount /mnt
ポイントは-append
」
- 「
autoinstall
」:cloud-configファイルの中にautoinstallキーが存在しているとき、ユーザーの操作なしに自動インストールを開始するためのオプション。言い換えるとこのオプションがないと、 画面に 「Continue with autoinstall?」 と表示されて 「yes」 と入力しない限り自動インストールが開始しません [2]。 - 「
ds=nocloud-net;s=http://
」:cloud-configファイルの場所_gateway:3003/ (データストア) を指定するためのオプション。今回はホスト上にポート3003でHTTPサーバーを立てているため、 仮想マシンのゲストからだと設定のようなURLでアクセスすることになります。
あとはしばらく放置しておけば、qemu-system-x86_
コマンドが自動終了しているはずです。
次にインストール後のサーバーを起動してみましょう。
$ qemu-system-x86_64 -enable-kvm -no-reboot -m 1024 \ -drive file=image.qcow2,format=qcow2,cache=none,if=virtio
デスクトップ環境なら上記のコマンドでウィンドウが立ち上がり、
今回の設定だとopenssh-serverがインストールされないため、
より本格的なコンフィグを用意する
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_
」false
」/etc/
を変更することを示しています。またgeoip
」true
」
storage: layout: name: lvm
ストレージはケースバイケースで複雑になりがちなので、
ssh: install_server: true authorized-keys: [ "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmhhimVNdsJLG3Sc6s3QD0nM5esEjUPQtC1k9b5M8fsp75ZaYhgoE3VUE+vXe5jD0tMlVbrzly4OnghloOgBtmrTqiuC7iUxcfWQ+11b7RI660m43ZQinafobZo7jMHOE2IwLFw5/bj6xm8LiXDn1Y2pA2d13V1f9MPKNexsYeuBfsru4AlwhKifEEjL0PS4saV1tcT1WM3na8jstI6jmdsOQ+cngj8HnpWTg8+YIFe1iqAnIIuFWSKjLqTFrJRIO4pnzNeo0naHqjxVoAytUqjxjXWT093DxW0wDvHUNxRhSwqL6S45ehcD2M7AXszOW2ZbX3i455SB2bClXZHBN2Q== shibata" ]
サーバー用途ならOpenSSHサーバーはインストールしておきたいところでしょう。気をつけなければいけないのは、install-server
」install_
」
「authorized-keys
」
reporting: hook: type: webhook endpoint: http://_gateway:3003/cgi-bin/done level: INFO
「reporting
」
前述のPython 3の組み込みサーバーでは--cgi
」
$ 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キー以下でもタイムゾーンは設定できませんuser-data
」
他にもearly-commands
やlate-commands
、error-commands
によって、snaps
やpackages
で、
インストール時に必要な設定はひととおり自動化できるようになっているはずですので、
ちなみにinteractive-sections
に*
」
interactive-sections: - "*"
ただしパスワードなどセンシティブなデータは自動入力されませんので注意してください。
USBスティックからインストールを自動化する
最後にUSBスティックから設定を流し込んでみましょう。
$ sudo apt install cloud-image-utils $ cd www $ cloud-localds ../user-data.img user-data
これで設定入りのイメージファイルを作成できました。これをUSBスティックにddで書き込めば良いのですが、
$ 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からだと完全な自動化はできないということです。インストーラーが起動したあとに
もしどうしても自動化したいなら、