5.1 ホスト管理

Zabbixにおける監視対象ホストの効率的な管理手法とベストプラクティス

概要

ホスト管理は、Zabbixで監視を行うための基盤となる重要な機能です。ホストは監視対象となるサーバー、ネットワーク機器、仮想マシン、コンテナなどを論理的に表現するZabbixの基本エンティティです。効率的なホスト管理により、スケーラブルで保守性の高い監視環境を構築できます。

ホスト管理の重要性

機能効果適用場面
グループ化管理効率向上部門別・環境別分類
マクロ活用設定の一元化共通パラメータ管理
インターフェース管理通信最適化複数通信方式対応
一括操作運用工数削減大規模環境での設定変更
プロトタイプ化動的管理自動ディスカバリ連携

ホストの追加と設定

基本的なホスト作成

Zabbixにおけるホスト作成は、監視対象の論理的な表現を定義する重要なプロセスです。

必須設定項目

ホスト名

  • 内部識別子として使用される一意な名前
  • 英数字、ピリオド、ダッシュ、アンダースコアが使用可能
  • DNS名またはIPアドレスとは独立
例:web-server-01, db-primary.tokyo, k8s-worker-001

表示名

  • UIで表示される人間が読みやすい名前
  • 日本語を含む多言語対応
  • 検索やソート時に使用
例:Webサーバー01号機, 東京本社データベース, 本番環境ロードバランサー

ホストグループ

  • 必須設定(最低1つのグループに所属)
  • 管理権限とアクセス制御の基盤
  • 論理的な分類と整理に使用

実践的なホスト設定例

yaml
# Webサーバーの設定例
ホスト名: web-prod-01
表示名: 本番Webサーバー01
グループ: 
  - Linux servers
  - Production Web Tier
  - Tokyo DataCenter

インターフェース:
  - エージェント: 192.168.10.100:10050
  - SNMP: 192.168.10.100:161 (v2c)
  - JMX: 192.168.10.100:12345

マクロ:
  - {$SERVICE_NAME}: "apache"
  - {$LOG_PATH}: "/var/log/httpd"
  - {$MAX_CONNECTIONS}: "1000"

インターフェース設定詳細

エージェントインターフェース

接続方式の選択

ini
# パッシブエージェント設定
接続先: 192.168.10.100
ポート: 10050
接続方式: パッシブ
ini
# アクティブエージェント設定
# ホスト側でサーバーに接続
接続方式: アクティブ
# IPアドレス不要(エージェントから接続)

セキュリティ設定

yaml
暗号化設定:
  証明書認証: 有効
  PSK認証: 有効
  PSKキー: "a1b2c3d4e5f6..."
  PSK識別子: "PSK-web-01"

SNMP設定

SNMP v2c設定

yaml
SNMPバージョン: v2c
コミュニティ: "{$SNMP_COMMUNITY}"
ポート: 161
セキュリティ名: ""  # v2cでは未使用

SNMP v3設定(推奨)

yaml
SNMPバージョン: v3
セキュリティ名: "zabbix-monitor"
セキュリティレベル: "authPriv"
認証プロトコル: "SHA256"
認証パスフレーズ: "{$SNMP_AUTH_PASS}"
暗号化プロトコル: "AES256"
暗号化パスフレーズ: "{$SNMP_PRIV_PASS}"

ホストグループの活用

グループ分類戦略

環境別分類

Production/
├── Linux servers
├── Windows servers
├── Network devices
└── Database servers

Staging/
├── Linux servers
├── Windows servers
└── Application servers

Development/
├── Linux servers
└── Test environments

技術スタック別分類

Technology/
├── Apache servers
├── MySQL databases
├── Redis cache
├── Kubernetes nodes
└── Docker containers

地理的分類

Location/
├── Tokyo DataCenter
│   ├── DMZ Zone
│   ├── App Zone
│   └── DB Zone
├── Osaka BackupSite
└── AWS Tokyo Region

グループ権限管理

部門別アクセス制御

yaml
# インフラチーム
グループ: 
  - Linux servers (全権限)
  - Windows servers (全権限)
  - Network devices (全権限)

# 開発チーム
グループ:
  - Development/* (読み取り専用)
  - Staging/Application servers (設定変更可)

# 運用チーム
グループ:
  - Production/* (監視のみ)
  - Problem management (問題対応)

ホストマクロの使用

マクロの種類と優先順位

グローバルマクロ < テンプレートマクロ < ホストマクロ

グローバルマクロ例

yaml
{$SNMP_COMMUNITY}: "public"
{$AGENT_TIMEOUT}: "30s"
{$DISC_RULE_INTERVAL}: "3600s"
{$MAINTENANCE_WINDOW}: "02:00-04:00"

ホストマクロ例

yaml
# Webサーバー固有設定
{$SERVICE_NAME}: "nginx"
{$CONFIG_PATH}: "/etc/nginx"
{$LOG_LEVEL}: "warn"
{$MAX_WORKERS}: "8"

# データベースサーバー固有設定
{$DB_TYPE}: "mysql"
{$DB_PORT}: "3306"
{$SLOW_QUERY_TIME}: "2"
{$MAX_CONNECTIONS}: "500"

実用的なマクロ活用例

動的ディスク監視

yaml
# ディスク使用量閾値
{$VFS.FS.PUSED.MAX.CRIT}: "95"
{$VFS.FS.PUSED.MAX.WARN}: "85"

# 除外ディスク
{$VFS.FS.FSNAME.NOT_MATCHES}: "^(/dev|/sys|/run|/proc)"

# サーバー別カスタマイズ
{$VFS.FS.PUSED.MAX.CRIT:"/var"}: "99"  # /varは使用率99%まで許容

サービス別ポート監視

yaml
# 基本サービスポート
{$SERVICE.HTTP.PORT}: "80"
{$SERVICE.HTTPS.PORT}: "443"
{$SERVICE.SSH.PORT}: "22"

# アプリケーション固有ポート
{$SERVICE.APP.PORT}: "8080"
{$SERVICE.DB.PORT}: "5432"
{$SERVICE.CACHE.PORT}: "6379"

ホストプロトタイプ(ディスカバリ)

プロトタイプの基本概念

プロトタイプは、自動ディスカバリルールによって動的に作成されるホストのテンプレートです。

プロトタイプの構成要素

yaml
プロトタイプ名: "VM-{#VM.NAME}"
表示名: "仮想マシン {#VM.NAME}"
グループプロトタイプ: 
  - "Virtual Machines"
  - "Environment: {#VM.ENV}"

テンプレートリンク:
  - "Template OS Linux by Zabbix agent"
  - "Template VM VMware"

マクロプロトタイプ:
  - {$VM.ID}: "{#VM.ID}"
  - {$VM.UUID}: "{#VM.UUID}"

実践的な活用例

Kubernetesノード自動発見

yaml
# ディスカバリルール
名前: "Kubernetes nodes discovery"
キー: kubernetes.nodes.discovery
タイプ: HTTP agent
URL: "https://k8s-api.example.com/api/v1/nodes"

# プロトタイプ設定
ホスト名: "k8s-node-{#NODE.NAME}"
表示名: "K8s Node: {#NODE.NAME}"
グループ: 
  - "Kubernetes nodes"
  - "Cluster: {#CLUSTER.NAME}"

インターフェース:
  エージェント: "{#NODE.IP}:10050"

マクロ:
  {$NODE.ROLE}: "{#NODE.ROLE}"
  {$KUBELET.PORT}: "10250"

VMware仮想マシン自動発見

yaml
# ディスカバリルール
名前: "VMware VM discovery"
キー: vmware.vm.discovery[{$VMWARE.URL}]
タイプ: Simple check

# プロトタイプ設定
ホスト名: "vm-{#VM.NAME}"
表示名: "VM: {#VM.NAME}"
グループ: 
  - "Virtual machines"
  - "ESXi: {#ESXI.NAME}"

テンプレート:
  - "Template VM VMware"
  - "Template OS {#VM.OS}"

マクロ:
  {$VM.UUID}: "{#VM.UUID}"
  {$VM.CPU.CORES}: "{#VM.CPU.NUM}"

一括設定変更

Zabbix API活用

ホスト一括作成スクリプト

python
#!/usr/bin/env python3
import json
import requests

# Zabbix APIエンドポイント
ZABBIX_URL = "https://zabbix.example.com/api_jsonrpc.php"
USERNAME = "admin"
PASSWORD = "password"

def zabbix_auth():
    """Zabbix認証"""
    data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": USERNAME,
            "password": PASSWORD
        },
        "id": 1
    }
    response = requests.post(ZABBIX_URL, json=data)
    return response.json()["result"]

def create_host_bulk(auth_token, hosts_data):
    """ホスト一括作成"""
    hosts = []
    for host_data in hosts_data:
        host = {
            "host": host_data["hostname"],
            "name": host_data["display_name"],
            "groups": [{"groupid": host_data["group_id"]}],
            "interfaces": [{
                "type": 1,  # Zabbix agent
                "main": 1,
                "useip": 1,
                "ip": host_data["ip"],
                "port": "10050"
            }],
            "templates": [{"templateid": host_data["template_id"]}],
            "macros": host_data.get("macros", [])
        }
        hosts.append(host)
    
    data = {
        "jsonrpc": "2.0",
        "method": "host.create",
        "params": hosts,
        "auth": auth_token,
        "id": 1
    }
    
    response = requests.post(ZABBIX_URL, json=data)
    return response.json()

# 使用例
hosts_to_create = [
    {
        "hostname": "web-01",
        "display_name": "Webサーバー01",
        "ip": "192.168.1.100",
        "group_id": "4",
        "template_id": "10001",
        "macros": [
            {"macro": "{$SERVICE_NAME}", "value": "nginx"},
            {"macro": "{$LOG_PATH}", "value": "/var/log/nginx"}
        ]
    },
    {
        "hostname": "web-02",
        "display_name": "Webサーバー02",
        "ip": "192.168.1.101",
        "group_id": "4",
        "template_id": "10001",
        "macros": [
            {"macro": "{$SERVICE_NAME}", "value": "nginx"},
            {"macro": "{$LOG_PATH}", "value": "/var/log/nginx"}
        ]
    }
]

auth_token = zabbix_auth()
result = create_host_bulk(auth_token, hosts_to_create)
print(json.dumps(result, indent=2))

一括マクロ更新

bash
#!/bin/bash
# 特定グループの全ホストにマクロを追加

ZABBIX_URL="https://zabbix.example.com/api_jsonrpc.php"
AUTH_TOKEN="your_auth_token"
GROUP_NAME="Production Web Tier"

# グループID取得
GROUP_ID=$(curl -s -X POST "$ZABBIX_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
      "filter": {"name": ["'$GROUP_NAME'"]}
    },
    "auth": "'$AUTH_TOKEN'",
    "id": 1
  }' | jq -r '.result[0].groupid')

# グループ内のホスト取得
HOSTS=$(curl -s -X POST "$ZABBIX_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
      "groupids": ["'$GROUP_ID'"],
      "output": ["hostid", "host"]
    },
    "auth": "'$AUTH_TOKEN'",
    "id": 1
  }')

# 各ホストにマクロ追加
echo "$HOSTS" | jq -r '.result[] | .hostid' | while read -r hostid; do
  curl -s -X POST "$ZABBIX_URL" \
    -H "Content-Type: application/json" \
    -d '{
      "jsonrpc": "2.0",
      "method": "usermacro.create",
      "params": {
        "hostid": "'$hostid'",
        "macro": "{$MAINTENANCE_MODE}",
        "value": "disabled"
      },
      "auth": "'$AUTH_TOKEN'",
      "id": 1
    }'
done

CSVインポート活用

CSVファイル形式

csv
hostname,display_name,ip_address,group_name,template_name,service_type,environment
web-prod-01,本番Webサーバー01,192.168.1.100,Production Web,Linux Template,nginx,production
web-prod-02,本番Webサーバー02,192.168.1.101,Production Web,Linux Template,nginx,production
db-prod-01,本番DBサーバー01,192.168.1.200,Production DB,MySQL Template,mysql,production

CSVインポートスクリプト

python
#!/usr/bin/env python3
import csv
import json
import requests
from typing import List, Dict

def import_hosts_from_csv(csv_file: str, auth_token: str):
    """CSVファイルからホストをインポート"""
    hosts_data = []
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            host_data = {
                "host": row["hostname"],
                "name": row["display_name"],
                "groups": [{"groupid": get_group_id(row["group_name"], auth_token)}],
                "interfaces": [{
                    "type": 1,
                    "main": 1,
                    "useip": 1,
                    "ip": row["ip_address"],
                    "port": "10050"
                }],
                "templates": [{"templateid": get_template_id(row["template_name"], auth_token)}],
                "macros": [
                    {"macro": "{$SERVICE_TYPE}", "value": row["service_type"]},
                    {"macro": "{$ENVIRONMENT}", "value": row["environment"]}
                ]
            }
            hosts_data.append(host_data)
    
    return create_hosts_batch(hosts_data, auth_token)

def get_group_id(group_name: str, auth_token: str) -> str:
    """グループ名からグループIDを取得"""
    data = {
        "jsonrpc": "2.0",
        "method": "hostgroup.get",
        "params": {"filter": {"name": [group_name]}},
        "auth": auth_token,
        "id": 1
    }
    response = requests.post(ZABBIX_URL, json=data)
    result = response.json()["result"]
    return result[0]["groupid"] if result else None

def get_template_id(template_name: str, auth_token: str) -> str:
    """テンプレート名からテンプレートIDを取得"""
    data = {
        "jsonrpc": "2.0",
        "method": "template.get",
        "params": {"filter": {"host": [template_name]}},
        "auth": auth_token,
        "id": 1
    }
    response = requests.post(ZABBIX_URL, json=data)
    result = response.json()["result"]
    return result[0]["templateid"] if result else None

高度なホスト管理

条件付きホスト管理

環境別設定の自動化

yaml
# ホスト作成時の条件分岐
条件: ホスト名に "prod" が含まれる場合
アクション:
  - グループ: "Production servers" に追加
  - マクロ: {$ENVIRONMENT} = "production"
  - 監視間隔: 1分
  - 保存期間: 90日

条件: ホスト名に "dev" が含まれる場合
アクション:
  - グループ: "Development servers" に追加
  - マクロ: {$ENVIRONMENT} = "development"
  - 監視間隔: 5分
  - 保存期間: 7日

メンテナンス期間管理

定期メンテナンス設定

yaml
メンテナンス名: "月次システムメンテナンス"
期間: 毎月第2土曜日 02:00-06:00
対象ホストグループ: 
  - "Production Web Tier"
  - "Production DB Tier"

メンテナンスタイプ: データ収集あり
通知: 無効
イベント生成: 無効

緊急メンテナンス用API

python
def create_emergency_maintenance(hostids: List[str], duration_hours: int = 4):
    """緊急メンテナンス作成"""
    from datetime import datetime, timedelta
    
    start_time = int(datetime.now().timestamp())
    end_time = int((datetime.now() + timedelta(hours=duration_hours)).timestamp())
    
    data = {
        "jsonrpc": "2.0",
        "method": "maintenance.create",
        "params": {
            "name": f"Emergency Maintenance {datetime.now().strftime('%Y%m%d-%H%M')}",
            "active_since": start_time,
            "active_till": end_time,
            "hostids": hostids,
            "maintenance_type": 0,  # データ収集あり
            "description": "緊急メンテナンス作業"
        },
        "auth": auth_token,
        "id": 1
    }
    
    response = requests.post(ZABBIX_URL, json=data)
    return response.json()

ベストプラクティス

命名規則

体系的な命名戦略

# サーバー命名規則
{environment}-{service}-{instance_number}
例: prod-web-01, stg-db-02, dev-app-03

# 表示名規則
{環境}環境 {サービス名} {インスタンス番号}
例: 本番環境 Webサーバー 01号機

# グループ名規則
{Environment} {Service Type}
例: Production Web Servers, Staging Database Servers

パフォーマンス最適化

効率的なインターフェース設定

yaml
# 高負荷環境でのエージェント設定
StartAgents: 10
ServerActive: 192.168.1.10
RefreshActiveChecks: 120
BufferSend: 5
BufferSize: 100

# タイムアウト設定
Timeout: 30
UnsafeUserParameters: 0

監視間隔の最適化

yaml
# 重要度別監視間隔
Critical Services: 1分
Standard Services: 5分
Baseline Metrics: 30分
Capacity Planning: 1時間

# ディスカバリ間隔
Network Discovery: 1時間
LLD Rules: 30分
Template Updates: 1日1回

セキュリティ考慮事項

エージェント通信の暗号化

ini
# zabbix_agentd.conf
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK001
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk

# SNMP v3認証設定
SNMPv3SecurityName=zabbix
SNMPv3SecurityLevel=authPriv
SNMPv3AuthProtocol=SHA256
SNMPv3PrivProtocol=AES256

アクセス制御の実装

yaml
# ネットワークセグメント別制御
DMZ Zone:
  - Web servers only
  - HTTPS monitoring
  - Limited SNMP access

Internal Zone:
  - Full agent access
  - Database monitoring
  - Application metrics

Management Zone:
  - Infrastructure devices
  - SNMP v3 required
  - Network equipment monitoring

まとめ

効果的なホスト管理は、Zabbix監視システムの基盤となる重要な要素です。

重要ポイント

  1. 体系的な分類: グループ、マクロ、命名規則の統一
  2. 自動化の活用: プロトタイプ、API、一括操作の効果的な使用
  3. セキュリティ重視: 暗号化通信、認証、アクセス制御の実装
  4. 運用効率化: メンテナンス管理、監視間隔の最適化

次のステップ

次章では、効率的なテンプレート設計について詳しく解説し、ホスト管理と連携した包括的な監視設定手法を学習します。


関連リンク