とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Multipassを使ってアプリのテスト環境をサクッと作成する

概要

開発したアプリケーションをテストしたいとき、ローカルの開発環境で実行するか、CI/CDの仕組みを使ってCIの中で様々なテストなどをすると思います。これまでこのブログでもいくつかのパターンをご紹介できていると思います。

さて、開発環境でアプリケーションの動作テストをする場合に問題となるのが、「開発環境では動いたが、本番サーバーでは動かなかった」というパターンです。これを防ぐためにCI/CDの取り組みをしましょうというのが時代の流れとなりつつありますが、ローカルの環境でも動作テストを行いたいパターンもあるかもしれません。

そんなときに使えそうなのがCanonicalが開発しているMultipassです。

multipass.run

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 shellmultipass execの他、sshコマンドでインスタンスにアクセスすることもできるようになります。

% multipass launch -n foo 20.04 --cloud-init - <<EOF   
ssh_authorized_keys:
  - $(cat ~/.ssh/id_ecdsa.pub)
EOF

私はAnsibleのテストをするときにこの方法で環境を用意して、テストしたりしてます。 SSH公開鍵を仕込む方法については以前書いたブログでも取り上げていますので、こちらもご覧ください。

tech.virtualtech.jp

Multipassは開発の現場でも役立つと思います。まだ触ったことがない方は試してみてはいかがでしょうか?

multipass.run