Ubuntu Weekly Recipe

第636回 LXD MosaicでLXDをウェブブラウザーから操作する

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

サーバー版のUbuntuには最初からインストールされているコンテナ管理システムLXDはCLIで操作するツールです。今回はこれをウェブブラウザーからも操作できるようにしましょう。

サードパーティが作るWeb UIツール

LXDは特にUbuntuで利用されているシステムコンテナ・仮想マシンの管理ツールです。この「システムコンテナ」では,Dockerとは異なり,PID=1のinitを含むシステム全体をコンテナの中に閉じ込めて操作する仕組みになっています。つまり仮想マシンをまるまるコンテナの中に閉じ込めた仕組みであり,ユーザーがコンテナに「ログイン」したあとは,⁠普通のLinuxシステム」のように使えるのが特徴です。

LXDについては第521回の入門システムコンテナマネージャーLXD 3.0からリンクされている記事で基本的な使い方を紹介しています※1⁠。また第609回のLXDからコンテナではなく仮想マシンを起動するでも紹介しているように,LXD 3.19からコンテナだけでなく仮想マシンもサポートするようになりました。

※1
本連載のLXD記事をベースにいくつか修正・追記を行った『ふわっと知りたいLXD』も電子書籍版をBOOTH技術書典マーケットで販売しています。インターネットを活用できない環境でLXDを利用したい方はぜひご購入ください。ちなみに内容はLXD 3.0ベースと,現在のLXD 4.xよりも古いものの,書籍の中で言及している基本的な利用方法に大きな違いはありません。

LXDそのものはCLI経由で操作するインターフェースとして作られています。ただしlxcコマンドとlxdデーモンの間の通信はREST APIとして外部にも公開されていますし,Pythonを含む各種言語向けのバインディングも用意されています。よってその気になれば「LXDをサポートするツール」を作ることは簡単です。

最近だとコマンド操作よりはウェブブラウザーで管理できるほうが嬉しいことも多いでしょう。実際,直接の競合であるVMWare ESXiにはvSphere Web Clientが存在しますし,OpenStackやKubernetesにもウェブベースのダッシュボードが用意されています。virt-managerやVirtualBoxには公式のWeb UIはありませんが,それなりに強力なGUI管理ツールが存在します。これらに比べるとLXDはGUIで管理できないことがネックでした。

LXDの公式的にはOpenStackやOpenNebulaにLXDサポートプラグインを導入し,それをもって管理することを推奨している節があります※2⁠。第484回のUbuntuとOpenNebulaでKVMとLXDのインスタンスを起ち上げてみようなどはまさにLXDの管理ツールとしてOpenNebulaを使った例ですね。しかしながらLXDを操作したいだけなのに,別の管理システムを入れるのには若干の抵抗がありました。

※2
実際,Web UIの作成はそれ用の開発ノウハウが必要であることからも,自前で作るにはリソースが足りないという判断は納得できます。

そんな意見が多いからか,実はサードパーティのLXD管理システムがいくつか存在します。

LXDUI
AdaptiveScaleが開発しているPythonベースのWeb UIです。2018年ぐらいに1.0が登場してから品質・更新頻度も高く,LXD向けWeb UIの本命的位置づけではあったのですが,ここ数ヶ月開発が止まっているようにも見えます。
LXDManager
VueとJavaScriptで作られたシンプルなWeb UIです。ユーザー・グループ管理が充実しているのが特徴となります。ただ,こちらについてもここ数ヶ月開発が止まっているようです。デモサイトの証明書の期限が切れているのもご愛嬌。
LXD Mosaic
PHPベースのWeb UIです。おそらく今もっとも開発が活発なツールでしょう。LXDとは管理用API経由で通信する仕組みになっているので,LXDが動いているホストとネットワーク的に透過であれば,外部にインストールすることも可能です。仮想マシンにも対応しています。

今回は今注目の「LXD Mosaic」を紹介します。LXD Mosaicはなんといっても,ソフトウェアそのものをLXDコンテナの中に閉じ込めることを公式にサポートしていることから,導入がとても楽なのです。

LXD Mosaicのインストール

LXD Mosaicのインストール自体はとても簡単です。LXD Mosaic用のインスタンスを立ち上げて,インストールするクリプトを実行する,これだけです※3⁠。

※3
snap版のLXD Mosaicも存在しますが,まだ開発中というステータスです。

あらかじめ,LXDのREST APIを外部から実行できるように設定しておきます。

$ lxc config set core.https_address [::]
$ lxc config set core.trust_password (パスワード)

上記では[::]のように未指定アドレスを設定しているため,すべてのネットワークインターフェースに対してbind()することになります。たとえばLXDコンテナの中からのみREST APIを呼び出せるよう限定したい場合は,lxc network info lxdbr0で表示されるアドレスを指定すると良いでしょう。

あとは適当な名前のコンテナを作って,その中からインストールスクリプトを実行するだけです。

$ lxc launch ubuntu:20.04 lxdMosaic
$ lxc exec lxdMosaic bash
$ curl https://raw.githubusercontent.com/turtle0x1/LxdMosaic/master/examples/install_with_clone.sh >> installLxdMosaic.sh
$ chmod +x installLxdMosaic.sh
$ ./installLxdMosaic.sh

インストールスクリプトの中ではコンテナの中の管理者権限でさまざまなパッケージをインストールしたり,システムの設定を変更しているため,実行の前に一度中身は確認しておきましょう。基本的にはApache,PHP,MySQL,NodeJSあたりをインストールし,npmでNodeJS関連のパッケージを,ComposerでPHP関連のパッケージをインストールしているようです。

インストールに成功すると次のようなログが表示されます。

Installation successfull

You now need to point your browser at https://10.93.9.71 and
accept the self signed certificate

ServerName for LxdManager can be changed in /etc/apache2/sites-available/lxd_manager.conf,
followed by an apache restart (systemctl restart apache2)

上記のhttps://10.93.9.71はコンテナのIPアドレスです。ウェブブラウザーがLXDと同じホストで動いているのであれば,このままアクセス可能ですが,外部のサーバーにLXDがインストールされている場合は,何らかの方法でlxdMosaicコンテナのアドレスにアクセスできるようにしなくてはなりません。

一番手っ取り早いのはプロキシデバイスを設定してしまうことです。たとえばホストの443ポートを,lxdMosaicの10443ポートに転送してしまいましょう。

$ lxc config device add lxdMosaic port443 proxy \
  listen=tcp:0.0.0.0:10443 connect=tcp:127.0.0.1:443

これでhttps://(LXDが動いているホストのIPアドレス):10443でLXD Mosaicにアクセスできるようになるはずです※4⁠。

※4
プロキシデバイスはLXDのデーモン自体がforkproxyを起動し,指定したアドレスでlistenし,指定したコンテナにデータを転送します。それに対してLXD 3.3からサポートされるようになった,nat=trueオプションを付けると,NATの設定を行いforkproxyを経由せずに転送するようになるので,より効率的にアクセスできます。ただしNATオプションを有効化するためには,そのコンテナのIPアドレスを固定化しておく必要があります。

著者プロフィール

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

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