コンテンツへスキップ

zabbixのマクロはテンプレートからだけではなく、ホストグループやホストから作成できることを知ったので試してみた。

zabbixのGUIにて適用なホストを選択後、マクロに移動する。
以下のようなマクロを作成した。

マクロ名は{$TESTF}にし、値は50にした。

トリガーにマクロを反映させる。

トリガーの内容はひとまず置いておき、{$TEST}を反映させた。

反映されているか、グラフで確認するとしきい値が50以上になっていたので反映されていることを確認。

実際にアラートを意図的に発生させるとダッシュボードにて反応を確認した。

アイテムの数値は98なので、マクロの値を100に変更した。

しきい値が100にかわり、アラートが消えたことを確認したので検証を終了した

zabbixのアイテムについてはキーが重要だと認識した
キーはあらかじめzabbixagentの公式に用意されているが、大量なので
テンプレから確認したほうがはやいと思う
今回はそのキーをchatgptに聞きながら自作してみた。

zabbix.agnet.confに定義する

agentの設置先のサーバ側のconfに以下を記載した


UserParameter=custom.logs.count[*],/bin/ls $1 | wc -l

上記は、*内のディレクトリ先にあるファイルの数をチェックする
custom.logs.countがアイテム名で、[*]内はzabbixのアイテム作成時に
指定したディレクトリを指定したらよい

記載後はzabbix.agentを再起動する

反映されているかは以下コマンドで確認可能


zabbix_agentd -t custom.logs.count[/var/log]
custom.logs.count[/var/log] [t|98]

上記の場合は、98個のファイルが/var/logにあることがわかる

webインターフェースにてアイテムを作成する

zabbixのwebにて対象のホストに「アイテムの作成」後、上記画像のように設定した。
テストにて問題なければトリガー作成に進む

トリガーを作成する

アイテム同様にトリガー作成から上記画像のように設定した。
条件式についてはchatgptでは式が違ったので、他のトリガーを参考にして作成した。
(構文については今後、学習予定)
/var/log/以下のファイル数が98個とわかっていたので、アラートを鳴らすために80以上になったら
アラート発生するようにした。
有効になっていれば以下のようにアラート発生となる

トリガーの条件を80から100に変えると上記アラートが消えたことを確認した。

今回の個人的な気づきとして、アイテムが監視間隔を決めていたこと。
トリガーはあくまで判定のみの役割であった。

データ収集>テンプレートからマクロの設定が可能

サーバ内のメモリを確認して、memoryの値が5000M以下ならアラートがでるように変更した

上記のように変更して保存するとアラートが発生した

上記確認後、設定を5000Mから20Mに変更するとアラートが消えたことを確認した

https://tech-win.jp/2024/08/18/ubuntu%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bzabbix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A-apache%E3%81%A8mysql%E3%82%92%E5%88%A9%E7%94%A8/#toc11

上記を参考に解消

これまでのapiの取得方法だとapiのauth認証の問題によりエラーが発生。
chatGPTと粘って会話したところ以下の方法にて成功したので、メモをする
python3 コマンドにて実行可能

hosts_get.py

import requests
import json

url = "https://yourdomain/zabbix/api_jsonrpc.php"
headers = {
    'Authorization': 'Bearer apitoken',
    'Content-Type': 'application/json-rpc'
}

# host.get リクエスト
def get_hosts():
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid", "host", "name"],
            "sortfield": "name"  # 名前順にソート
        },
        "id": 1
    }

    # リクエストを送信
    response = requests.post(url, headers=headers, data=json.dumps(payload))
    data = response.json()

    # 結果を見やすく表示
    if 'result' in data:
        with open("hosts.txt", "w") as file:
            for host in data['result']:
                line = f"Host ID: {host['hostid']}, Host: {host['host']}, Name: {host['name']}\n"
                print(line.strip())  # コンソールにも出力
                file.write(line)  # ファイルに書き込み
        print("✅ ホスト一覧を 'hosts.txt' に出力しました。")
    else:
        print(f"Error: {data.get('error', 'Unknown error')}")

# 実行
if __name__ == "__main__":
    get_hosts()

/etc/zabbix/apache.confの
php_value memory_limit 128Mを512Mに変更する。

あとはapacheの再起動

php,iniと勘違いしていたためにハマったエラー

Zabbix7.0にてサーバ内ではphp8.3なのになぜ上記のエラーがでるのか。不思議だった。

php -vで確認しても8.3なのだが、chatgptに相談したところapacheでは、php7.4が採用されていたからであった。以下引用

確認方法 Apacheで有効なモジュールを確認:

bapache2ctl -M | grep php

結果に php8.3 のモジュールが含まれていない場合、php7.xなど古いバージョンが有効になっている可能性があります。

修正方法 古いPHPモジュールを無効化し、PHP 8.3を有効化:

bashコードをコピーするsudo a2dismod php7.x
sudo a2enmod php8.3
sudo systemctl restart apache2

PHPの動作確認

ApacheがPHP 8.3を使用しているか確認します。次の手順で動作確認を行います。

  1. info.phpファイルの作成:
    echo "<?php phpinfo(); ?>" > /var/www/html/info.php
  2. ブラウザでアクセス: サーバーのIPアドレスまたはドメインに以下を追加してアクセスします。
    http://<サーバーのIP>/info.php

ひとまず目的はタイトルの通り、今後7.0にあげる予定だけど、ひとまずここまでをまとめる。

参考にした記事は以下
https://tech.virtualtech.jp/entry/2022/07/28/172316

上記を参考にすると上手くいったが、データベースを5.0から6.0にアップグレードする前に、zabbixのバージョンを5.0から6.0にあげないとエラーを吐くので気を付けてほしい。
以下によると順序が重要らしい。

https://www.zabbix.com/forum/zabbix-help/446375-specified-key-was-too-long-max-key-length-is-3072-bytes

上記でもメモリ不足を吐いたので、キャッシュサイズを増やすと解決した。
etc/zabbix/zabbix_server.conf に以下を追記・変更します:

CacheSize=512M

本当はubuntu24.04にてアップグレードしたかったけど、zabbixserver5.0のソースがなかったので断念した。だれか教えてほしい

Zabbixでホストを大量に抱えていると一気にアラート発生したときに確認に苦労する。
例えば、「aaa.comでアラートが発生しました」とアラートが発生したら、
まず、踏み台サーバーのコンソールにログインし、aaa.comのIPをnslookupで取得する。
次に取得したIPでssh接続。原因を調べて解決。のような流れ。

今回は、nslookupでドメインからIPを取得する流れが面倒だったため、/etc/hostsファイルに追記することで、
ドメインでssh接続できるシェルスクリプトを考えてみた。

mkhosts.sh

#!/bin/bash
header='Content-Type:application/json-rpc'
apiurl='http://000.000.000/zabbix/api_jsonrpc.php'
json='{"jsonrpc": "2.0","method": "user.login","params": {"user": "zabbixのユーザー名","password": "Zabbixのパスワード"},"id": 1,"auth": null}'

zbxauth=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -r ".result")
echo $zbxauth

json='{"jsonrpc": "2.0","method": "host.get","params": {"output": ["hostid","host"]},"id": 2,"auth": "'$zbxauth'"}'
echo $json | jq

hostlist=`curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq | grep "host"| grep -v "hostid" | awk -F: '{print $2}' | sed "s/\"/""/g" `

for i in $hostlist 
do

#任意でnslookupの結果をIPのみに整形する
iplist=`nslookup $i | grep "Address" | grep -v "\#53" |  awk -F: '{print $2}'` 
echo "$iplist $i"| sed 's/^[ \t]*//' >> /etc/hosts 
done

全体の流れとして、ZabbixのAPIからホスト名を取得し整形する。
次に取得したホスト名を引数にしてfor文でnslookupをかけてIPを取得する変数をつくる
最後に、echoで「IP ホスト名」の形にしたものを、/etc/hosts ファイルの最終行に追記する。
mkhosts.sh 実行後、/etc/hostsファイルを確認すると、
IP ホスト名
となっているはず。
その後、

ssh ホスト名

で対象のホストに接続できると思うので確認してみてほしい。

参考
https://www.zabbix.com/documentation/4.4/en/manual/api
https://tech-mmmm.blogspot.com/2019/02/zabbix-api.html
https://orebibou.com/ja/home/201607/20160712_003/
https://ex1.m-yabe.com/archives/3306

Zabbixでweb監視とはhttpが落ちたアラートが表示されることだと思っていたけど、
どうやら違うようで調べてみた。

とりあえずZabbix内の設定>>ホストを確認してみる。
すると「web」があったのでアクセスする。
「webシナリオの作成」をアクセス。

まず、シナリオの箇所では、赤色の必須の箇所だけ記入する。


次に「ステップ」のカテゴリで「追加」を押して、名前とURLに自分のサイトのURLを記入する

上記設定で問題がなければ、「web」カテゴリから下記画像のようにダウンロードやレスポンスの速さを確認できる

サイトが落ちたことを知りたい場合、トリガー作成を選んで下記画像のように条件式を記入する。
条件式は「追加」から選べる

その後、自分のサイトのhttpdをストップしてサイトが表示できなくするとアラートが表示される。

この後、httpdをスタートしたらアラートが消えた。

自分のサーバー内に何個もサイトがあったら便利そう。