Zabbixサーバー構築とAnsibleを活用して自動化する

はじめに

こんにちは!地方の熊本でクラウドエンジニアをしていますkiyomura(@kiyomura742954)です。前回はk6で負荷テストする方法をブログ化しましたが、今回はAnsibleを使用してZabbixサーバーを構築したので、ブログにしたいと思います。

k6を使って負荷テストをしてみた

構築環境

ホストOS

  • macOS Sonoma 15.1(Apple M1チップ)

ゲストOS(仮想環境)

  • Ubuntu 22.04(Multipass上で構築)


サーバー構成

WordPressサーバー

  • Webサーバー:Nginx(latest)

  • PHP:8.3

  • データベース:MySQL 8.0.40

  • CMS:WordPress

Zabbixサーバー

  • Zabbix:5.0.x

  • Webサーバー:Nginx(latest)

  • PHP:8.3

  • データベース:MySQL 8.0.40


使用ツール

  • Ansible:ansible-core 2.18.2

構成図

ディレクトリ構成

実装

前提条件・準備

本記事では、Multipassを使用して仮想サーバーを2台構築し、それぞれにZabbixサーバーおよびWordPressサーバーをセットアップします。Zabbixサーバーには、Zabbix本体および設定用のWeb UIをインストールし、WordPressサーバーには監視対象としてZabbixエージェントをインストールします。

この記事では、以下のAnsibleロールについて解説します。

・Zabbixサーバー関連(Zabbix本体、Web UI、および基本的な設定)
・Zabbixエージェント(WordPressサーバーへの導入)
・Zabbixの設定操作に使用するAPI関連ロール

なお、ZabbixサーバーおよびWordPressサーバーには、それぞれNginx、MySQL、PHPのインストールが必要ですが、それらの詳細は割愛します。

使用するAnsibleロール構成

Zabbixサーバー(Zabbix本体、Web UI、設定)

WordPressサーバー(Zabbixエージェント)

それぞれのサーバーで使用する接続情報や変数はinventory/に記述しています。

zabbixサーバーの構築

ロール:zabbix-server

まずは、zabbbixサーバーのダウンロードとインストールを行います。手順については以下公式ドキュメント通りに進めます。

Download and install Zabbix

以下項目を環境に合わせて選択します。手順が表示されるのでそれに沿ってダウンロードとインストールを行います。

  • ZABBIXバージョン
  • OSディストリビューション
  • OSバージョン
  • ZABBIX COMPONENT
  • データベース
  • WEB SERVER
zabbix パッケージのダウンロード

まず ZabbixのAPTリポジトリを追加する .deb パッケージをダウンロードします.deb ファイルを 指定URLから /tmp ディレクトリにダウンロードしています。

ダウンロードした.debパッケージをインストールします。インストールすることでZabbix用のAPTリポジトリが使用できるようになります。

Zabbixコンポーネントのインストール

Zabbixを構成する主要コンポーネントを 一括でインストールします。ZabbixサーバーやWebフロントエンド、監視エージェントなど、Zabbixを動作させるために必要なソフトウェアをまとめて導入します。pipは後でzabbix-apiをインストールするために導入しています。

Zabbix用のデータベース(MySQL)に “users” テーブルが存在するかを確認します。これによりZabbixの初期データがインポート済みかどうかを判断できます。クエリの結果を「db_check」という変数に格納して、後続の処理で条件分岐に使用します。

Zabbixの初期データベーススキーマをインポート

条件分岐でusersテーブルがなければZabbixの初期スキーマファイルを使用して初期化します。

データベース スキーマをインポートした後、log_bin_trust_function_creators オプションを無効にします。

zabbix設定ファイルの配置と反映

zabbixサーバーの設定ファイル(zabbix_server.conf)をcopyモジュールを使用して配置します。設定変更があった場合はhandlersを使用してzabbix-serverを再起動します。

zabbix-server と zabbix-agent が起動状態にします。また自動起動の設定も行います。

pipでzabbix-apiインストール

pipやzabbixモジュールはPython3を使用したいのでAnsibleの変数で指定します。zabbixの設定自動化のためにzabbix-apiを利用するのでインストールします。

ロール:zabbix-api

このロールは、インストール済みのZabbixサーバーに対して設定を行うためのものです。主に、Ansibleのzabbixモジュールを使用し、Zabbix上の各種設定(ホスト登録、アイテム追加、トリガー設定など)を自動化します。

通常、AnsibleはSSHで管理対象ノードに接続して操作を行いますが、zabbixモジュールはZabbixのAPIを使用して設定を行うため、対象ホストにSSH接続する必要はありません。

Zabbix モジュールを使用する際の接続設定はinventory/group_vars/zabbix-api.ymlに記載しています。

zabbix-api.yml

接続方式を HTTP API、使用する API プラグイン「community.zabbix.zabbix」の指定などを行なっています。

ホストの登録

新規ホスト dev.menta.me を Zabbix サーバ上に登録します。監視テンプレートを 2 つ(MySQL 用 & Linux OS 用)紐付けることで、自動的に多数のアイテム/トリガーを導入できます。

紐づけている以下のテンプレートはzabbixに準備されている公式テンプレートです。

  • Template DB MySQL by Zabbix agent
  • Template OS Linux by Zabbix agent

これらのテンプレートを利用することで簡単い基本的な監視設定をすることが可能です。ただし、テンプレートに含まれていない監視設定をしたい場合は自分でカスタムアイテムを作成します。カスタムアイテムの作成については後述します。

登録ホスト情報の取得とインターフェースIDの取得

直前に登録したホストの情報を取り出して「host_info」という変数に格納します。また、「host_info」に格納した情報からインターフェースidを取得して変数「iface_id」に格納します。インターフェースidは監視アイテム作成で使用します。

カスタム監視アイテムの作成

以下は、Zabbixの公式テンプレートに含まれていない監視項目を追加します。

ディスク使用率監視

対象の/(ルート)のディスク使用率を監視します。こちらは公式のテンプレートに含まれていなかったのでユーザー自身が作成するカスタムアイテムをとして設定を行います。

インターフェイスidには先ほど変数に格納した{{ iface_id }}を使用します。

プロセス監視(Nginx / MySQL)

NginxとMySQLのプロセスを監視するアイテムを作成します。プロセス数を監視することでミドルウェアが正常に動作しているかチェックできます。

MySQLのデッドロック検出

MySQL で発生したデッドロックの件数を収集する監視アイテムを作成しています。

この項目で使用している mysql.deadlocks[…] というキーは、Zabbixエージェントが標準で提供していないため、UserParameterを使用して拡張する必要があります。

UserParameterとは?
Zabbixエージェントに任意のコマンドやスクリプトを実行させ、ユーザー定義のキーとして監視対象を追加できる機能です。

Zabbixエージェントの設定ファイルに以下のように記述します:

UserParameter=<キー>,<コマンド>

グローバルマクロの設定

Zabbixで使用可能な変数(マクロ)を定義します。{$ZABBIX.URL} を定義し、ZabbixサーバーのURLに展開できるようにしています。

トリガーの作成(アラート設定)

「ディスク使用率が90%を超えたらアラートを出す」トリガー(アラート条件)を作成します。

ZabbixのアラートをSlackへ通知設定

Slack APIを使用して、zabbixとSlackを連携、通知をSlackで確認できるようにします。Slackの設定をする必要があるのでAnsibleではなく手動で行います。Slackへの通知設定は以下記事の手順で行いました。

ZabbixのアラートをSlackへ通知させる方法

また、運営メンバーのnayaさんもブログ書いていますので参考にしてください。

ZabbixのアラートをSlackへ通知させる方法

WordPressサーバー

WordPressサーバーには、Zabbixによる監視を行うためのZabbixエージェントをインストール・設定します。

ロール:zabbix-agent
Zabbixエージェントのインストール

zabbixサーバーをインストールした時と同じ手順ですZabbix リポジトリ追加用の .deb パッケージを取得して追加後にzabbix-agentをインストールします。

エージェント設定ファイルの配置

MySQL監視用のZabbixエージェント設定ファイルを配置します。以下テンプレートのgitリポジトリです。

テンプレートの使用方法や設定ファイルが解説されていますREADME.mdに書いてあるテンプレートの使用方法を参考にansible化しています。またコピーしている設定ファイルはgitにある「template_db_mysql.conf」をベースにデッドロックを監視するためのユーザーパラメータを追加したものを配置しています。

Template DB MySQL by Zabbix agent

監視用MySQLユーザーの作成

Zabbix エージェントが MySQL を監視できるようにするために、MySQL 内に専用の監視ユーザー(zbx_monitor)を作成します。

Zabbixユーザーの環境準備

Zabbix ユーザーのホームディレクトリに相当する/var/lib/zabbixを作成します。

先ほど作成したディレクトリ(/var/lib/zabbix)に.my.cnfを配置します。.my.cnfにはMySQLへのログイン情報を記載しておりZabbix エージェントが MySQL に自動ログインできるようにします。

設定を反映するためにzabbix-agentを再起動します。以上となります。補足でZabbixのダッシュボードなどはGrafana連携も可能で、nayaさんがブログ書いていますので参考にしてみてください!

ZabbixとGrafanaの連携方法

まとめ

Zabbixの設定をAnsibleで自動化することで、監視設定を簡単かつ効率的に行えるようになります。毎回手動で行っていたような設定もコード化しておくことで、作業の省力化だけでなく、ミスの防止や設定の再現性にもつながります。

繰り返し使う監視設定をAnsibleで管理できるのは非常に便利で、運用の信頼性とスピードの向上に役立つと感じました。次回はZabbixのダッシュボードなどもAnsible化してみたいと思います。ありがとうございました!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール