はじめに
こんにちは!地方の熊本でクラウドエンジニアをしていますkiyomura(@kiyomura742954)です。前回はk6で負荷テストする方法をブログ化しましたが、今回はAnsibleを使用してZabbixサーバーを構築したので、ブログにしたいと思います。
構築環境
ホスト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
構成図
ディレクトリ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ tree -L 2 . ├── ansible.cfg ├── inventory │ ├── group_vars │ └── hosts ├── playbook.yml └── roles ├── common ├── cron ├── mysql ├── nginx ├── php ├── wordpress ├── zabbix-agent ├── zabbix-api ├── zabbix-mysql ├── zabbix-nginx ├── zabbix-php └── zabbix-server |
実装
前提条件・準備
本記事では、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、設定)
1 2 3 |
roles/ ├── zabbix-server # Zabbix本体およびWeb UIのインストール ├── zabbix-api # Zabbix APIを用いた設定 |
WordPressサーバー(Zabbixエージェント)
1 2 |
roles/ └── zabbix-agent # WordPressサーバーへのエージェントインストール |
それぞれのサーバーで使用する接続情報や変数はinventory/に記述しています。
1 2 3 4 5 6 |
inventory/ ├── group_vars/ │ ├── wordpress-server.yml # WordPressサーバー用の変数 │ ├── zabbix-api.yml # Zabbix API操作に使用する認証情報やホスト定義など │ └── zabbix-server.yml # Zabbixサーバー用の変数 └── hosts # インベントリ本体。各サーバーのIPアドレスやグループ分けを定義 |
zabbixサーバーの構築
ロール:zabbix-server
まずは、zabbbixサーバーのダウンロードとインストールを行います。手順については以下公式ドキュメント通りに進めます。
以下項目を環境に合わせて選択します。手順が表示されるのでそれに沿ってダウンロードとインストールを行います。
- ZABBIXバージョン
- OSディストリビューション
- OSバージョン
- ZABBIX COMPONENT
- データベース
- WEB SERVER
zabbix パッケージのダウンロード
1 2 3 4 |
- name: Download Zabbix package get_url: url: "https://repo.zabbix.com/zabbix/5.0/ubuntu-arm64/pool/main/z/zabbix-release/zabbix-release_latest_5.0+ubuntu20.04_all.deb" dest: "/tmp/zabbix-release_latest_5.0+ubuntu20.04_all.deb" |
まず ZabbixのAPTリポジトリを追加する .deb パッケージをダウンロードします.deb ファイルを 指定URLから /tmp ディレクトリにダウンロードしています。
1 2 3 |
- name: Install Zabbix release package apt: deb: "/tmp/zabbix-release_latest_5.0+ubuntu20.04_all.deb" |
ダウンロードした.debパッケージをインストールします。インストールすることでZabbix用のAPTリポジトリが使用できるようになります。
Zabbixコンポーネントのインストール
1 2 3 4 5 6 7 8 9 10 |
- name: Install Zabbix components apt: name: - zabbix-server-mysql - zabbix-frontend-php - zabbix-nginx-conf - zabbix-agent - pip state: present update_cache: yes |
Zabbixを構成する主要コンポーネントを 一括でインストールします。ZabbixサーバーやWebフロントエンド、監視エージェントなど、Zabbixを動作させるために必要なソフトウェアをまとめて導入します。pipは後でzabbix-apiをインストールするために導入しています。
1 2 3 4 5 6 7 |
- name: Check if Zabbix database is already initialized mysql_query: login_user: zabbix login_password: "{{ lookup('env', 'ZABBIX_DB_PASSWORD') }}" login_db: zabbix query: "SHOW TABLES LIKE 'users';" register: db_check |
Zabbix用のデータベース(MySQL)に “users” テーブルが存在するかを確認します。これによりZabbixの初期データがインポート済みかどうかを判断できます。クエリの結果を「db_check」という変数に格納して、後続の処理で条件分岐に使用します。
Zabbixの初期データベーススキーマをインポート
1 2 3 4 5 |
- name: Import Zabbix database schema using zcat shell: zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -u zabbix -p"{{ lookup('env', 'ZABBIX_DB_PASSWORD') }}" zabbix args: executable: /bin/bash when: db_check.query_result[0] | length == 0 |
条件分岐でusersテーブルがなければZabbixの初期スキーマファイルを使用して初期化します。
1 2 3 4 5 |
- name: Set global log_bin_trust_function_creators to 0 mysql_query: query: "SET GLOBAL log_bin_trust_function_creators = 0" login_user: root login_unix_socket: /var/run/mysqld/mysqld.sock |
データベース スキーマをインポートした後、log_bin_trust_function_creators オプションを無効にします。
zabbix設定ファイルの配置と反映
1 2 3 4 5 |
- name: copy zabbox_server.conf copy: src: roles/zabbix-server/files/zabbix_server.conf dest: /etc/zabbix/zabbix_server.conf notify: restart zabbix-server |
zabbixサーバーの設定ファイル(zabbix_server.conf)をcopyモジュールを使用して配置します。設定変更があった場合はhandlersを使用してzabbix-serverを再起動します。
1 2 3 4 5 6 7 8 |
- name: Start required services systemd: name: "{{ item }}" state: started enabled: true loop: - zabbix-server - zabbix-agent |
zabbix-server と zabbix-agent が起動状態にします。また自動起動の設定も行います。
pipでzabbix-apiインストール
1 2 3 4 5 6 7 8 9 |
- name: Set Python 3 interpreter for this role set_fact: ansible_python_interpreter: /usr/bin/python3 - name: install zabbix-api pip: name: zabbix-api state: present executable: pip3 |
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
1 2 3 4 5 6 |
ansible_connection: httpapi ansible_network_os: community.zabbix.zabbix ansible_user: Admin ansible_httpapi_pass: zabbix ansible_httpapi_port: 80 ansible_zabbix_url_path: "" |
接続方式を HTTP API、使用する API プラグイン「community.zabbix.zabbix」の指定などを行なっています。
ホストの登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
- name: create host dev.menta.me zabbix_host: host_name: dev.menta.me host_groups: - Linux servers link_templates: - Template DB MySQL by Zabbix agent - Template OS Linux by Zabbix agent status: enabled state: present interfaces: - type: 1 # 1 = Zabbix agent main: 1 useip: 1 ip: 192.168.64.13 dns: "" port: 10050 |
新規ホスト dev.menta.me を Zabbix サーバ上に登録します。監視テンプレートを 2 つ(MySQL 用 & Linux OS 用)紐付けることで、自動的に多数のアイテム/トリガーを導入できます。
紐づけている以下のテンプレートはzabbixに準備されている公式テンプレートです。
- Template DB MySQL by Zabbix agent
- Template OS Linux by Zabbix agent
これらのテンプレートを利用することで簡単い基本的な監視設定をすることが可能です。ただし、テンプレートに含まれていない監視設定をしたい場合は自分でカスタムアイテムを作成します。カスタムアイテムの作成については後述します。
登録ホスト情報の取得とインターフェースIDの取得
1 2 3 4 5 6 7 8 |
- name: Get host info from Zabbix community.zabbix.zabbix_host_info: host_name: dev.menta.me register: host_info - name: set interface id set_fact: iface_id: "{{ host_info.hosts[0].hostinterfaces[0].interfaceid }}" |
直前に登録したホストの情報を取り出して「host_info」という変数に格納します。また、「host_info」に格納した情報からインターフェースidを取得して変数「iface_id」に格納します。インターフェースidは監視アイテム作成で使用します。
カスタム監視アイテムの作成
以下は、Zabbixの公式テンプレートに含まれていない監視項目を追加します。
ディスク使用率監視
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: Create disk usage (percent used) item become: false community.zabbix.zabbix_item: host_name: dev.menta.me name: Disk space used on / params: key: vfs.fs.size[/,pused] type: zabbix_agent value_type: numeric_unsigned delay: 30s interfaceid: "{{ iface_id }}" state: presentて |
対象の/(ルート)のディスク使用率を監視します。こちらは公式のテンプレートに含まれていなかったのでユーザー自身が作成するカスタムアイテムをとして設定を行います。
インターフェイスidには先ほど変数に格納した{{ iface_id }}を使用します。
プロセス監視(Nginx / MySQL)
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: create nginx process item become: false community.zabbix.zabbix_item: host_name: dev.menta.me name: Nginx process count params: key: proc.num[nginx] type: zabbix_agent value_type: numeric_unsigned delay: 30s interfaceid: "{{ iface_id }}" state: present |
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: create mysqld process item become: false community.zabbix.zabbix_item: host_name: dev.menta.me name: MySQL process count params: key: proc.num[mysqld] type: zabbix_agent value_type: numeric_unsigned delay: 30s interfaceid: "{{ iface_id }}" state: present |
NginxとMySQLのプロセスを監視するアイテムを作成します。プロセス数を監視することでミドルウェアが正常に動作しているかチェックできます。
MySQLのデッドロック検出
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: Create Zabbix item for MySQL deadlock detection become: false community.zabbix.zabbix_item: host_name: dev.menta.me name: MySQL Deadlock Count params: key: mysql.deadlocks["{$MYSQL.HOST}","{$MYSQL.PORT}"] type: zabbix_agent value_type: numeric_unsigned delay: 60s interfaceid: "{{ iface_id }}" state: present |
MySQL で発生したデッドロックの件数を収集する監視アイテムを作成しています。
この項目で使用している mysql.deadlocks[…] というキーは、Zabbixエージェントが標準で提供していないため、UserParameterを使用して拡張する必要があります。
UserParameterとは?
Zabbixエージェントに任意のコマンドやスクリプトを実行させ、ユーザー定義のキーとして監視対象を追加できる機能です。
Zabbixエージェントの設定ファイルに以下のように記述します:
UserParameter=<キー>,<コマンド>
グローバルマクロの設定
1 2 3 4 5 6 7 |
- name: Set global macro {$ZABBIX.URL} become: false community.zabbix.zabbix_globalmacro: macro_name: "{$ZABBIX.URL}" macro_value: http://{{ hostvars['zabbix']['ansible_host'] }}/zabbix/ macro_type: text state: present |
Zabbixで使用可能な変数(マクロ)を定義します。{$ZABBIX.URL} を定義し、ZabbixサーバーのURLに展開できるようにしています。
トリガーの作成(アラート設定)
1 2 3 4 5 6 7 8 9 10 11 |
- name: create zabbix trigger become: false community.zabbix.zabbix_trigger: name: Disk usage over 90% host_name: dev.menta.me params: severity: high expression: "{dev.menta.me:vfs.fs.size[/,pused].last()}>=90" manual_close: false enabled: true state: present |
「ディスク使用率が90%を超えたらアラートを出す」トリガー(アラート条件)を作成します。
ZabbixのアラートをSlackへ通知設定
Slack APIを使用して、zabbixとSlackを連携、通知をSlackで確認できるようにします。Slackの設定をする必要があるのでAnsibleではなく手動で行います。Slackへの通知設定は以下記事の手順で行いました。
また、運営メンバーのnayaさんもブログ書いていますので参考にしてください。
WordPressサーバー
WordPressサーバーには、Zabbixによる監視を行うためのZabbixエージェントをインストール・設定します。
ロール:zabbix-agent
Zabbixエージェントのインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- name: Download Zabbix package ansible.builtin.get_url: url: https://repo.zabbix.com/zabbix/5.0/ubuntu-arm64/pool/main/z/zabbix-release/zabbix-release_latest_5.0+ubuntu24.04_all.deb dest: /tmp/zabbix-release_latest_5.0+ubuntu24.04_all.deb - name: Install Zabbix release package ansible.builtin.apt: deb: /tmp/zabbix-release_latest_5.0+ubuntu24.04_all.deb force: true - name: Install Zabbix agent ansible.builtin.apt: name: - zabbix-agent state: present update_cache: true |
zabbixサーバーをインストールした時と同じ手順ですZabbix リポジトリ追加用の .deb パッケージを取得して追加後にzabbix-agentをインストールします。
エージェント設定ファイルの配置
1 2 3 4 5 |
- name: Copy template_db_mysql.conf ansible.builtin.copy: src: roles/zabbix-agent/files/template_db_mysql.conf dest: /etc/zabbix/zabbix_agentd.d/ notify: Restart zabbix agent |
MySQL監視用のZabbixエージェント設定ファイルを配置します。以下テンプレートのgitリポジトリです。
テンプレートの使用方法や設定ファイルが解説されていますREADME.mdに書いてあるテンプレートの使用方法を参考にansible化しています。またコピーしている設定ファイルはgitにある「template_db_mysql.conf」をベースにデッドロックを監視するためのユーザーパラメータを追加したものを配置しています。
Template DB MySQL by Zabbix agent
監視用MySQLユーザーの作成
1 2 3 4 5 6 7 8 9 10 |
- name: Create Zabbix monitor user community.mysql.mysql_user: name: zbx_monitor host: localhost password: "{{ lookup('env', 'ZABBIX_MONITOR_PASSWORD') }}" priv: zabbix.*:ALL state: present login_user: root login_unix_socket: /var/run/mysqld/mysqld.sock update_password: on_create |
Zabbix エージェントが MySQL を監視できるようにするために、MySQL 内に専用の監視ユーザー(zbx_monitor)を作成します。
Zabbixユーザーの環境準備
1 2 3 4 5 6 7 |
- name: Ensure /var/lib/zabbix directory exists ansible.builtin.file: path: /var/lib/zabbix state: directory owner: zabbix group: zabbix mode: "0750" |
Zabbix ユーザーのホームディレクトリに相当する/var/lib/zabbixを作成します。
1 2 3 4 5 6 7 |
- name: Copy .my.cnf ansible.builtin.template: src: .my.cnf dest: /var/lib/zabbix/.my.cnf owner: zabbix group: zabbix mode: "0600" |
先ほど作成したディレクトリ(/var/lib/zabbix)に.my.cnfを配置します。.my.cnfにはMySQLへのログイン情報を記載しておりZabbix エージェントが MySQL に自動ログインできるようにします。
1 2 3 4 5 |
- name: Start Zabbix agent ansible.builtin.systemd: name: zabbix-agent state: started enabled: true |
設定を反映するためにzabbix-agentを再起動します。以上となります。補足でZabbixのダッシュボードなどはGrafana連携も可能で、nayaさんがブログ書いていますので参考にしてみてください!
まとめ
Zabbixの設定をAnsibleで自動化することで、監視設定を簡単かつ効率的に行えるようになります。毎回手動で行っていたような設定もコード化しておくことで、作業の省力化だけでなく、ミスの防止や設定の再現性にもつながります。
繰り返し使う監視設定をAnsibleで管理できるのは非常に便利で、運用の信頼性とスピードの向上に役立つと感じました。次回はZabbixのダッシュボードなどもAnsible化してみたいと思います。ありがとうございました!

未経験からSIerに転職し、現在クラウドエンジニアとしてAWSの運用保守をしている。エンジニア歴は約1年で、クラウドの技術をもっと身につけたいのとSREについて興味を持ったことがきっかけでTechBullに参加。ブログでの執筆をメインに担当している。