LXD + LXD-UI + cloud-init で快適なおうちクラウドを実現しよう

Posted on Nov 19, 2023

LXDやらハイパーバイザーでたくさんVMを生やしたい。でも毎回セットアップするのは面倒くさい。sshのセキュリティ設定とか後回しにしてたらそのまま本番運用してしまった。 私のような面倒くさがりにとってこのような問題は常について回るものです。しかしどこかのすごい人™が開発したlxd-uiとcloud-initを組み合わせ使うと数クリックで初期設定済みのコンテナが立ち上がるという素晴らしいおうちクラウドを実現できたというお話です。

セットアップ

LXDをセットアップ

# lxdがsnapで入ってない場合
sudo apt install snapd
sudo snap install lxd

# Ubuntuなどで既にインストールされてる場合
sudo snap refresh --stable lxd

# WebUIを有効にする
sudo snap set lxd ui.enable=true
sudo snap restart --reload lxd
lxc config set core.https_address "[::]:8443"

WebUIの証明書周りの設定をする

[サーバーのIP]:8443 にhttpsでアクセスするとセットアップ画面が出てきます。基本的にこの画面の指示に従って証明書周りの設定をします。
ここでは詳細は省きますがコケたらこのサイトが参考になるかも

cloud-initの準備

  1. 左にあるナビゲーションのprofilesから適当なプロファイル(普通はdefault)を選びます。
  2. “configuration” タブに移動し右下の"edit profile"をクリックします
  3. “yaml-configuration” を選択し編集します。
cloud-initの中身の例

文法はyamlですが**cloud-init.user-dataの下に#cloud-configと書かないと動きません。**
この例では必要なパッケージを入れてユーザーを追加し、ssh周りの設定をしtailscaleを入れています。

config:
  cloud-init.user-data: |
    #cloud-config
    package_upgrade: true

    packages:
      - openssh-server
      - nano
      - curl
      - wget
      - unzip
      - nftables

    users:
      - name: myname
        shell: /usr/bin/bash
        groups: wheel
        ssh-authorized-keys:
          - ssh-ed25519 [SSHの公開鍵]

    ssh_pwauth: no

    runcmd:
      - curl -fsSL https://tailscale.com/install.sh | sh
      - sed -i -e 's/^#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
      - systemctl reload sshd

保存とインスタンスの作成

編集できたら"save changes"をクリックして保存して、左ナビゲーションバーの"instances"から適当にインスタンスを生やします。
ここで注意ですが全てのイメージ(ディストリビューション)がcloud-initに対応してるわけではありません。Variantが"cloud"のやつを選びましょう。

トラブルシューティング

cloud-initのステータスを確認する
[root@test1 ~]# cloud-init status
status: done
cloud-initのログを見る

/var/log/cloud-init.logにあります