概要
開発したアプリケーションをテストしたいとき、ローカルの開発環境で実行するか、CI/CDの仕組みを使ってCIの中で様々なテストなどをすると思います。これまでこのブログでもいくつかのパターンをご紹介できていると思います。
さて、開発環境でアプリケーションの動作テストをする場合に問題となるのが、「開発環境では動いたが、本番サーバーでは動かなかった」というパターンです。これを防ぐためにCI/CDの取り組みをしましょうというのが時代の流れとなりつつありますが、ローカルの環境でも動作テストを行いたいパターンもあるかもしれません。
そんなときに使えそうなのがCanonicalが開発しているMultipassです。
Multipassを使うことで、クラウド上にインスタンスを用意するかのように、ローカルマシンにUbuntuインスタンスを簡単に用意できます。
一般的に仮想マシンでOSを動かす場合、仮想マシンを作成するためのアプリケーション(例えばVirtualBoxとかVMware Workstation、VMware Playerなど)をまずインストール、仮想マシンを作成してOSをインストールします。このあと目的のアプリケーションのデプロイをすると思います。
MultipassはWindows, macOS,Linuxに対応しており、Windowsの場合はHyper-VもしくはVirtualBox、macOSの場合はQEMUもしくはHyperkit(設定によりVirtualBoxも利用可能)、Linuxの場合はsnapパッケージを使った包括的なインストールが行われます。
標準以外の他のドライバーについては、How to set up the driverにまとまっています。
インストール後の使い方
OSによってはMultipassのGUIツールがインストールされる場合もありますが、各OS共通の使い方としてコマンドライン操作での利用が可能です。
まずはUbuntuインスタンスの起動から。次のように実行してインスタンス作成に使えるイメージを確認します。 MultipassではOSをISOイメージを使ってインストールするのではなく、用意されたイメージを使って環境をデプロイします(カスタムイメージをPackerで作って利用することもできるようです)。
% multipass find Image Aliases Version Description 18.04 bionic 20220712 Ubuntu 18.04 LTS 20.04 focal,lts 20220711 Ubuntu 20.04 LTS 22.04 jammy 20220712 Ubuntu 22.04 LTS anbox-cloud-appliance latest Anbox Cloud Appliance charm-dev latest A development and testing environment for charmers docker latest A Docker environment with Portainer and related tools jellyfin latest Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. minikube latest minikube is local Kubernetes
動作保証は全くありませんが、--show-unsupported
フラグを付加すると、もうちょっと使えるOSが増えます(16.04LTSと21.10が増えています。2022/07/25時点)。
% multipass find --show-unsupported Image Aliases Version Description 16.04 xenial 20211001 Ubuntu 16.04 LTS 18.04 bionic 20220712 Ubuntu 18.04 LTS 20.04 focal,lts 20220711 Ubuntu 20.04 LTS 21.10 impish 20220708 Ubuntu 21.10 22.04 jammy 20220712 Ubuntu 22.04 LTS anbox-cloud-appliance latest Anbox Cloud Appliance charm-dev latest A development and testing environment for charmers docker latest A Docker environment with Portainer and related tools jellyfin latest Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. minikube
では、今回は18.04と20.04のインスタンスを作成してみましょう。その場合は次のように実行します。
% multipass launch -n foo 18.04 % multipass launch -n bar 20.04
もし、CPUやメモリー、ストレージを指定したい場合は次のように実行します。当然ながらリソースが空いていないと起動に失敗します。
% multipass launch -c2 -m2G -d16G -n foo 18.04 % multipass launch -c2 -m2G -d16G -n bar 20.04
起動したインスタンスへのアクセスは次のように実行します。
% multipass shell foo % multipass shell bar
インスタンス一覧は次のように実行すると出力されます。
% multipass list Name State IPv4 Image ubuntu Stopped -- Ubuntu 20.04 LTS foo Running 192.168.205.55 Ubuntu 18.04 LTS bar Running 192.168.205.56 Ubuntu 20.04 LTS microk8s Stopped -- Ubuntu 20.04 LTS
bar
インスタンスでApache2でも動かして、クライアントからアクセスしてみましょう。
% multipass shell bar $ sudo apt update && sudo apt install apache2 -y
クライアントのブラウザーやcurlコマンドなどでアクセスしてみます。 問題なくアクセスできたと思います(デフォルト設定のままだといわゆるNATアクセスになります。クライアント外部からのアクセスはデフォルトではできませんので、必要な場合は設定変更が必要です。「multipass bridged network」をキーに検索してください。ただ、それが必要な場合は他の手段を取るほうが良いかもしれません)。
% multipass list Name State IPv4 Image bar Running 192.168.205.56 Ubuntu 20.04 LTS % curl http://192.168.205.56 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <!-- Modified from the Debian original for Ubuntu Last updated: 2016-11-16 See: https://launchpad.net/bugs/1288690 --> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Apache2 Ubuntu Default Page: It works</title> <style type="text/css" media="screen"> ...
起動したインスタンスが不要になった場合は、次のように実行してインスタンスを消去します。 パージするまでは実際のインスタンスは削除されません。
% multipass stop bar #停止 % multipass delete bar #削除フラグを立てる % multipass purge #削除フラグのあるインスタンスをパージ
自動化の中で使うには
Ubuntu ServerにはデフォルトでCloud-initがインストールされているので、次のように公開鍵を指定してインスタンスを起動すると
multipass shell
やmultipass exec
の他、sshコマンドでインスタンスにアクセスすることもできるようになります。
% multipass launch -n foo 20.04 --cloud-init - <<EOF ssh_authorized_keys: - $(cat ~/.ssh/id_ecdsa.pub) EOF
私はAnsibleのテストをするときにこの方法で環境を用意して、テストしたりしてます。 SSH公開鍵を仕込む方法については以前書いたブログでも取り上げていますので、こちらもご覧ください。
Multipassは開発の現場でも役立つと思います。まだ触ったことがない方は試してみてはいかがでしょうか?