動かざることバグの如し

近づきたいよ 君の理想に

cloud-initで初期設定を爆速に終わらせる

環境

やりたいこと

VPSさくっと借りてすぐ捨てたい。が、その度にサーバーセットアップするの面倒。

GCPは自動でユーザー作成と公開鍵登録までやってくれるが、AWSとかlinodeとか個別に設定しなきゃいけないのダルくなってきた。

cloud-initと呼ばれる共通設定規格があるのを知ったのでGCPで動くようにした

cloud-initとは

cloud-initとはcloud-initは、クラウド環境でのインスタンス初期化を自動化するためのツールだ。これを使えば、VPSを立ち上げる際に毎回行う面倒なセットアップ作業を省略できる。YAML形式で設定を記述し、インスタンス起動時に自動的に環境構築が行われる。

設定したい要件

  • タイムゾーン設定: Asia/Tokyoに設定
  • ロケール設定: 英語(米国)に設定
  • パッケージ更新: システム起動時にパッケージリストの更新とアップグレードを実施
  • SSHパスワード認証無効化: セキュリティ向上のためパスワード認証を無効に設定
  • ユーザーとグループの設定: thr3aというユーザーを作成し、dockerグループに追加
  • 公開鍵の登録: thr3aユーザーのSSH公開鍵を登録
  • sudo権限の設定: thr3aユーザーにパスワードなしでsudoを実行する権限を付与
  • 必要なパッケージのインストール: apt-transport-https、ca-certificates、curlgnupg、lsb-release、unattended-upgrades、zshをインストール
  • Dockerのインストールと設定: Docker関連のパッケージをインストールし、サービスを有効化・起動
  • Oh My Zshのインストール: thr3aユーザーのシェルをZshに変更し、Oh My Zshをインストール

設定

#cloud-config
timezone: Asia/Tokyo
locale: en_US.UTF-8
package_update: true
package_upgrade: true

ssh_pwauth: false

groups:
  - docker

users:
  - lock_passwd: true
    name: thr3a
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGXSyuKIS8LBdrDVLn8GcjYqyG3dpGlP/iRVuctqMBhS thr3a@thr3a-m2.local
    sudo: "ALL=NOPASSWD:ALL"
    groups: ["docker"]

packages:
  - apt-transport-https
  - ca-certificates
  - curl
  - gnupg
  - lsb-release
  - unattended-upgrades
  - zsh

# Install docker
runcmd:
  - mkdir -p /etc/apt/keyrings
  - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  - apt-get update
  - apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  - systemctl enable docker
  - systemctl start docker
  - runuser -l thr3a sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  - chsh -s /bin/zsh thr3a

確認コマンド

cloud-initの設定が正しいかどうかを確認するには、以下のコマンドを実行する。

cloud-init schema --config-file cloud-config.yml

このコマンドは、指定した設定ファイルがcloud-initのスキーマに従っているかを検証する。エラーがあれば、それを指摘してくれる。

VSCodeで設定する場合

VSCodeでcloud-initの設定を行う場合、以下の設定をsettings.jsonに追加する。

"yaml.schemas": {
    "https://raw.githubusercontent.com/canonical/cloud-init/main/cloudinit/config/schemas/versions.schema.cloud-config.json": "cloud-config.yml"
},

この設定により、VSCodeはcloud-initのスキーマを使用してYAMLファイルを検証し、オートコンプリートやエラーチェックを提供する。これで、cloud-initの設定ファイルをより簡単に作成・編集できるようになる。