ホームラボで使えるDevOps・SysAdmin向け最高の無料ツール【2024年スタック】

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

手動サーバー管理の問題点

最初は1台のサーバーから始まる。次に2台目、Raspberry Pi、NAS、さらにはVMホストと増えていく。気づけば5台のマシンにSSH接続しながら、先週火曜日にディスク容量の問題があったのはどのサーバーか、なぜあのcronjobが動いていないのか、セキュリティパッチをすべてのマシンに適用したかどうか、必死に思い出そうとしている。

私もそんな状況を経験した。Linuxマシンを3台手動管理するだけで、あっという間にフルタイムの仕事になる。しかも無給で、何かが壊れるのはいつも夜11時だ。同じ作業の繰り返しは生産性を著しく低下させる。さらに悪いことに、可視性がなければ問題は静かに進行し、気づいたときには大規模な障害になっている。

手動アプローチが破綻する理由

これは技術力の問題ではなく、適切なツールがないことが原因だ。手動でインフラを管理するときに実際に起こることを整理しよう:

  • 設定のドリフト:各サーバーが少しずつ独自の状態になっていく。1台で動くものが別の台では謎の理由で失敗する。
  • 可視性ゼロ:ユーザー(もしくは自分)が何かおかしいと気づくまで、問題の発生に気づけない。
  • 変更履歴なし:誰が何を、いつ変更したのか?ログがなければ答えようがない。
  • 再現性ゼロ:サーバーをゼロから再構築するには、ドキュメントが存在すればの話だが、何時間もかけてそれを読み解く必要がある。

Linuxコマンドを知っていることは難しくない。インフラを観察可能再現可能、かつ自動化できる状態にするツールチェーンを持つこと——それが本当のスキルだ。そしてそれに費用はかからない。

本当に問題を解決する無料ツール

以下のツールはすべて現在私のホームラボで稼働している。すべてオープンソース。すべてプロダクション品質。すべて永久無料だ。

Ansible — サーバー間での繰り返し作業をやめよう

Ansibleは設定のドリフトと手動の繰り返し作業を解決する。プレイブックを一度書けば、指定したすべてのマシンに一貫して適用される——ターゲットホストにエージェントは不要だ。

コントロールノードにインストールする:

sudo apt install ansible -y

# または pip で最新バージョンをインストール
pip install ansible

すべてのサーバーにNginxをインストールして起動する最小限のプレイブック:

---
- name: Nginxのインストールと起動
  hosts: all
  become: true
  tasks:
    - name: nginxをインストール
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: nginxを起動して自動起動を有効化
      service:
        name: nginx
        state: started
        enabled: yes

インベントリに対して実行する:

ansible-playbook -i hosts.ini site.yml

同じタスクが1台のサーバーに対して実行するのと同じように、10台でも同一に実行される。マシンをゼロから再構築する時間が、3時間の苦労から約5分に短縮される。

Prometheus + Grafana + Node Exporter — すべてを可視化する

3つのツールで1つの統合ビューを実現する。Node ExporterはCPU、RAM、ディスク、ネットワークなどのシステムメトリクスを各マシンから公開する。Prometheusはそれらを設定可能なインターバルで収集・保存する——通常は15秒ごと。Grafanaはそれらすべてを実際に読めるダッシュボードに変換する。

Docker Composeが最も手軽な方法だ。最小構成のスタックを示す:

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=yourpassword

  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
    pid: host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro

接続するための prometheus.yml

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100', '192.168.1.10:9100', '192.168.1.11:9100']
docker compose up -d

起動したら、GrafanaダッシュボードID 1860(Node Exporter Full)をインポートする。すぐに完全なシステムビューが得られる——手動でダッシュボードを構築する必要はない。

Portainer — コマンドラインの苦労なしでDockerを管理

Docker CLIは1台のホストなら問題ない。3〜4台のマシンにまたがってターミナルでコンテナを管理するのはすぐに辛くなる。Portainerはコンテナのデプロイ、管理、監視をWebUIで行える——リモートのDockerホストも含めて。

docker volume create portainer_data

docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

ブラウザで https://your-server-ip:9443 にアクセスすればすぐに使える。Docker Composeスタックのデプロイ、コンテナログのリアルタイム確認、イメージの管理——ターミナルを一切触らずに行える。不安定な接続でホームラボをリモート管理していてSSHセッションが頻繁に切れる場合に特に重宝する。

Loki — 消えないログ管理

ほとんどのホームラボにはロギングの盲点がある。午前2時に何か壊れたとき、各マシンで journalctl -xe を一つずつ実行するのは苦痛だ。Grafana Lokiはすべてのシステムからログを収集し、すでに稼働しているGrafanaインスタンスからクエリできるようにしてくれる。

LokiとPromtailをDocker Composeに追加する:

  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

基本的な promtail-config.yml

server:
  http_listen_port: 9080

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*.log

GrafanaでLokiをデータソースとして追加し、LogQLでログをクエリする——PromQLと同じ構文ファミリーだ。メトリクスとログを1つのインターフェースで管理できる。

Netdata — 設定不要のリアルタイム監視

新しいマシンにすぐ可視性が欲しいだけのときに、Prometheusのセットアップは大がかりに感じることがある。Netdataはその近道だ。コマンド1つで即座に結果が得られる。

wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh
sudo sh /tmp/netdata-kickstart.sh

ポート19999にアクセスするとWebダッシュボードが開き、CPU、メモリ、ディスクI/O、ネットワーク、Dockerコンテナ、そして数十のアプリケーションレベルのメトリクスを含む2,000以上のメトリクスが毎秒更新される。私がすべての新しいサーバーに他の何よりも先にインストールするのがこれだ。残りのスタックをセットアップしている間も完全な可視性が確保される。

一度にすべてではなく、段階的に構築する

一度にすべてをインストールしようとしないこと。実際に理にかなった順序を示す:

  1. まず各マシンにNetdataを導入する——即座に可視性が得られ、手間ゼロ。
  2. Ansibleを追加して設定を管理する——ユーザーとSSHキー用のシンプルなプレイブックから始め、徐々に拡張していく。
  3. メインのDockerホストにPortainerをデプロイする——日常的なコンテナ管理が簡単になる。
  4. 本格的なメトリクスの準備ができたらPrometheus + Grafana + Node Exporterを立ち上げる——3台以上になったらAlertmanagerも設定する。
  5. 最後にLoki + Promtailを追加する——集中ログ管理で可視性の全体像が完成する。

フルスタック全体が、控えめなマシン1台で快適に動作する。2コア・4GBのRAMを持つマシンでもすべての監視インフラを余裕で処理できる。ここに挙げたものはすべてオープンソースで永久無料だ。

これらは使い捨てのおもちゃではない。Ansible、Grafana、Prometheus、Lokiは数百台のサーバーを運用する企業のインフラを支えている。ホームラボ専用の近道ではなく、実際のツールチェーンを学んでいるのだ。

「一台ずつSSH接続する状態」から「完全な可視性と自動化」への移行は週末1回で完結する。その後は消火活動に追われることなく、インフラを本当の意味でエンジニアリングできるようになる。

Share: