著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

データベースの監視は、データベースが時間の経過とともにどのように機能するかを理解するための鍵です。 これは、データベースで発生している隠れた使用上の問題やボトルネックを明らかにするのに役立ちます。 データベース監視システムの実装は、すぐに長期的な利点になる可能性があり、インフラストラクチャ管理プロセスにプラスの影響を与えます。 データベースのステータス変更に迅速に対応でき、監視対象サービスが通常の機能に戻ったときにすぐに通知されます。

Nagios Core は、管理対象データベースの監視に使用できる一般的な監視システムです。 このタスクにNagiosを使用する利点は、その汎用性(構成と使用が簡単)、使用可能なプラグインの大規模なリポジトリ、そして最も重要なこととして、統合されたアラートです。

このチュートリアルでは、 check_postgres Nagiosプラグインを使用して、 Nagios Core でPostgreSQLデータベースの監視を設定し、Slackベースのアラートを設定します。 最終的には、管理対象のPostgreSQLデータベースの監視システムが導入され、さまざまな機能のステータス変更がすぐに通知されます。

前提条件

  • root権限を持つUbuntu18.04サーバー、および2番目の非rootアカウント。 これは、この初期サーバーセットアップガイドに従ってセットアップできます。 このチュートリアルでは、root以外のユーザーは sammy.

  • サーバーにインストールされているNagiosCore。 これを実現するには、「Nagios4をインストールしてUbuntu18.04でサーバーを監視する方法」チュートリアルの最初の5つの手順を完了します。

  • DigitalOceanからプロビジョニングされたDigitalOceanアカウントとPostgreSQL管理データベース。接続情報が利用可能です。 サーバーのIPアドレスがホワイトリストに含まれていることを確認してください。 DigitalOceanマネージドデータベースの詳細については、 productdocsにアクセスしてください。

  • フルアクセス権を持つSlackアカウント。ステータスの更新を受信するワークスペースに追加され、

ステップ1—check_postgresをインストールする

このセクションでは、最新バージョンの check_postgres Githubのプラグインを使用して、NagiosCoreで利用できるようにします。 PostgreSQLクライアントもインストールします(psql)、 となることによって check_postgres 管理対象データベースに接続できるようになります。

次のコマンドを実行して、PostgreSQLクライアントをインストールすることから始めます。

  1. sudo apt install postgresql-client

次に、ダウンロードします check_postgres ホームディレクトリに移動します。 まず、それに移動します。

  1. cd ~

Githubリリースページに移動し、プラグインの最新バージョンのリンクをコピーします。 執筆時点で、最新バージョンの check_postgres だった 2.24.0; これは更新されることを覚えておいてください。可能な場合は、最新バージョンを使用することをお勧めします。

次に、curlを使用してダウンロードします。

  1. curl -LO https://github.com/bucardo/check_postgres/releases/download/2.24.0/check_postgres-2.24.0.tar.gz

次のコマンドを使用して抽出します。

  1. tar xvf check_postgres-*.tar.gz

これにより、ダウンロードしたファイルと同じ名前のディレクトリが作成されます。 そのフォルダには、 check_postgres 実行可能ファイル。Nagiosがプラグインを保存するディレクトリにコピーする必要があります(通常は /usr/local/nagios/libexec/). 次のコマンドを実行してコピーします。

  1. sudo cp check_postgres-*/check_postgres.pl /usr/local/nagios/libexec/

次に、あなたは与える必要があります nagios Nagiosから実行できるように、そのユーザー所有権:

  1. sudo chown nagios:nagios /usr/local/nagios/libexec/check_postgres.pl

check_postgres Nagiosで利用可能になり、そこから使用できるようになりました。 ただし、PostgreSQLのさまざまな側面に関連する多くのコマンドを提供します。サービスの保守性を高めるには、それらを分割して個別に呼び出すことができるようにすることをお勧めします。 これは、すべてのシンボリックリンクを作成することで実現できます check_postgres プラグインディレクトリのコマンド。

次のコマンドを実行して、Nagiosがプラグインを保存するディレクトリに移動します。

  1. cd /usr/local/nagios/libexec

次に、次のコマンドでシンボリックリンクを作成します。

  1. sudo perl check_postgres.pl --symlinks

出力は次のようになります。

Output
Created "check_postgres_archive_ready" Created "check_postgres_autovac_freeze" Created "check_postgres_backends" Created "check_postgres_bloat" Created "check_postgres_checkpoint" Created "check_postgres_cluster_id" Created "check_postgres_commitratio" Created "check_postgres_connection" Created "check_postgres_custom_query" Created "check_postgres_database_size" Created "check_postgres_dbstats" Created "check_postgres_disabled_triggers" Created "check_postgres_disk_space" Created "check_postgres_fsm_pages" Created "check_postgres_fsm_relations" Created "check_postgres_hitratio" Created "check_postgres_hot_standby_delay" Created "check_postgres_index_size" Created "check_postgres_indexes_size" Created "check_postgres_last_analyze" Created "check_postgres_last_autoanalyze" Created "check_postgres_last_autovacuum" Created "check_postgres_last_vacuum" Created "check_postgres_listener" Created "check_postgres_locks" Created "check_postgres_logfile" Created "check_postgres_new_version_bc" Created "check_postgres_new_version_box" Created "check_postgres_new_version_cp" Created "check_postgres_new_version_pg" Created "check_postgres_new_version_tnm" Created "check_postgres_pgagent_jobs" Created "check_postgres_pgb_pool_cl_active" Created "check_postgres_pgb_pool_cl_waiting" Created "check_postgres_pgb_pool_maxwait" Created "check_postgres_pgb_pool_sv_active" Created "check_postgres_pgb_pool_sv_idle" Created "check_postgres_pgb_pool_sv_login" Created "check_postgres_pgb_pool_sv_tested" Created "check_postgres_pgb_pool_sv_used" Created "check_postgres_pgbouncer_backends" Created "check_postgres_pgbouncer_checksum" Created "check_postgres_prepared_txns" Created "check_postgres_query_runtime" Created "check_postgres_query_time" Created "check_postgres_relation_size" Created "check_postgres_replicate_row" Created "check_postgres_replication_slots" Created "check_postgres_same_schema" Created "check_postgres_sequence" Created "check_postgres_settings_checksum" Created "check_postgres_slony_status" Created "check_postgres_table_size" Created "check_postgres_timesync" Created "check_postgres_total_relation_size" Created "check_postgres_txn_idle" Created "check_postgres_txn_time" Created "check_postgres_txn_wraparound" Created "check_postgres_version" Created "check_postgres_wal_files"

Perlは、シンボリックリンクを作成したすべての関数をリストしました。 これらは、通常どおりコマンドラインから実行できるようになりました。

ダウンロードしてインストールしました check_postgres プラグイン。 また、プラグインのすべてのコマンドへのシンボリックリンクを作成して、Nagiosから個別に使用できるようにしました。 次のステップでは、接続サービスファイルを作成します。 check_postgres 管理対象データベースへの接続に使用します。

ステップ2—データベースの構成

このセクションでは、データベースの接続情報を含むPostgreSQL接続サービスファイルを作成します。 次に、を呼び出して接続データをテストします check_postgres その上に。

接続サービスファイルは、慣例により、 pg_service.conf、およびの下に配置する必要があります /etc/postgresql-common/. お気に入りのエディター(nanoなど)で編集するために作成します。

  1. sudo nano /etc/postgresql-common/pg_service.conf

次の行を追加し、強調表示されたプレースホルダーを、接続の詳細セクションの下の管理対象データベースのコントロールパネルに表示される実際の値に置き換えます。

/etc/postgresql-common/pg_service.conf
[managed-db]
host=host
port=port
user=username
password=password
dbname=defaultdb
sslmode=require

接続サービスファイルには、複数のデータベース接続情報グループを格納できます。 グループの始まりは、その名前を角かっこで囲むことによって示されます。 その後、接続パラメータ(host, port, user, password、など)、値を指定する必要がある新しい行で区切られます。

終了したら、ファイルを保存して閉じます。

次に、を介してデータベースに接続することにより、構成の有効性をテストします。 check_postgres 次のコマンドを実行します。

  1. ./check_postgres.pl --dbservice=managed-db --action=connection

ここで、あなたは言います check_postgres パラメータで使用するデータベース接続情報グループ --dbservice、および指定することによってのみ接続を試行する必要があることも指定します connection アクションとして。

出力は次のようになります。

Output
POSTGRES_CONNECTION OK: service=managed-db version 11.4 | time=0.10s

この意味は check_postgres からのパラメータによると、データベースへの接続に成功しました pg_service.conf. エラーが発生した場合は、その構成ファイルに入力した内容を再確認してください。

接続文字列として機能するPostgreSQL接続サービスファイルを作成して入力しました。 また、を実行して接続データをテストしました check_postgres その上で、出力を観察します。 次のステップでは、データベースのさまざまな部分を監視するようにNagiosを構成します。

ステップ3—Nagiosでのモニタリングサービスの作成

次に、ホストと複数のサービスを定義することにより、データベースのさまざまなメトリックを監視するようにNagiosを構成します。 check_postgres プラグインとそのシンボリックリンク。

Nagiosはカスタム設定ファイルを下に保存します /usr/local/nagios/etc/objects. そこに追加する新しいファイルは、次の場所にある中央のNagios構成ファイルで手動で有効にする必要があります。 /usr/local/nagios/etc/nagios.cfg. 次に、コマンド、ホスト、および複数のサービスを定義します。これらを使用して、Nagiosで管理対象データベースを監視します。

まず、下にフォルダを作成します /usr/local/nagios/etc/objects 次のコマンドを実行して、PostgreSQL関連の構成を保存します。

  1. sudo mkdir /usr/local/nagios/etc/objects/postgresql

Nagiosコマンドを保存します check_nagios 名前のファイルで commands.cfg. 編集用に作成します。

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/commands.cfg

次の行を追加します。

/usr/local/nagios/etc/objects/postgresql/commands.cfg
define command {
    command_name           check_postgres_connection
    command_line           /usr/local/nagios/libexec/check_postgres_connection --dbservice=$ARG1$
}

define command {
    command_name           check_postgres_database_size
    command_line           /usr/local/nagios/libexec/check_postgres_database_size --dbservice=$ARG1$ --critical='$ARG2$'
}

define command {
    command_name           check_postgres_locks
    command_line           /usr/local/nagios/libexec/check_postgres_locks --dbservice=$ARG1$
}

define command {
    command_name           check_postgres_backends
    command_line           /usr/local/nagios/libexec/check_postgres_backends --dbservice=$ARG1$
}

ファイルを保存して閉じます。

このファイルでは、のさまざまな部分を呼び出す4つのNagiosコマンドを定義します。 check_postgres プラグイン(接続の確認、ロックと接続の数、データベース全体のサイズの取得)。 それらはすべて、に渡される引数を受け入れます --dbservice パラメータを指定し、で定義されているデータベースを指定します pg_service.conf 接続する。

The check_postgres_database_size コマンドは、に渡される2番目の引数を受け入れます --critical データベースストレージがいっぱいになるポイントを指定するパラメータ。 受け入れられる値は次のとおりです 1 KB キロバイトの場合、 1 MB メガバイトの場合など、エクサバイトまで(EB). 容量単位のない数値は、バイト単位で表されるものとして扱われます。

必要なコマンドが定義されたので、次の名前のファイルでホスト(基本的にはデータベース)とその監視サービスを定義します。 services.cfg. お気に入りのエディターを使用して作成します。

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/services.cfg

次の行を追加して、置き換えます db_max_storage_size データベースの使用可能なストレージに関連する値を使用します。 割り当てたストレージサイズの90%に設定することをお勧めします。

/usr/local/nagios/etc/objects/postgresql/services.cfg
define host {
      use                    linux-server
      host_name              postgres
      check_command          check_postgres_connection!managed-db
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Connection
      check_command          check_postgres_connection!managed-db
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Database Size
      check_command          check_postgres_database_size!managed-db!db_max_storage_size
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Locks
      check_command          check_postgres_locks!managed-db
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Backends
      check_command          check_postgres_backends!managed-db
      notification_options   w,u,c,r,f,s
}

最初にホストを定義して、Nagiosがサービスがどのエンティティに関連しているかを認識できるようにします。 次に、定義したコマンドを呼び出す4つのサービスを作成します。 それぞれが合格 managed-db 議論として、その詳細 managed-db 手順2で定義したものを監視する必要があります。

通知オプションに関しては、各サービスは、サービス状態が次のようになったときに通知を送信するように指定しています WARNING, UNKNOWN, CRITICAL, OK (ダウンタイムから回復したとき)、サービスが flapping を開始したとき、またはスケジュールされたダウンタイムが開始または終了したとき。 このオプションに値を明示的に指定しないと、手動でトリガーされた場合を除いて、通知は(利用可能な連絡先に)まったく送信されません。

ファイルを保存して閉じます。

次に、一般的なNagios構成ファイルを編集して、この新しいディレクトリから構成ファイルを読み取るようにNagiosに明示的に指示する必要があります。 次のコマンドを実行して、編集用に開きます。

  1. sudo nano /usr/local/nagios/etc/nagios.cfg

ファイル内でこの強調表示された行を見つけます。

/usr/local/nagios/etc/nagios.cfg
...
# directive as shown below:

cfg_dir=/usr/local/nagios/etc/servers
#cfg_dir=/usr/local/nagios/etc/printers
...

その上に、次の強調表示された行を追加します。

/usr/local/nagios/etc/nagios.cfg
...
cfg_dir=/usr/local/nagios/etc/objects/postgresql
cfg_dir=/usr/local/nagios/etc/servers
...

ファイルを保存して閉じます。 この行は、Nagiosにすべての構成ファイルをからロードするように指示します /usr/local/nagios/etc/objects/postgresql 構成ファイルが配置されているディレクトリ。

Nagiosを再起動する前に、次のコマンドを実行して構成の有効性を確認してください。

  1. sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

出力の終わりは次のようになります。

Output
Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check

これは、Nagiosが構成にエラーを検出しなかったことを意味します。 エラーが表示された場合は、何が問題だったかについてのヒントも表示されるため、エラーをより簡単に修正できます。

Nagiosに構成をリロードさせるには、次のコマンドを実行してサービスを再起動します。

  1. sudo systemctl restart nagios

これで、ブラウザでNagiosに移動できます。 ロードしたら、左側のメニューからServicesオプションを押します。 が表示されます postgres ホストとサービスのリスト、およびそれらの現在のステータス:

それらはすべてすぐに緑色に変わり、 OK 状態。 ステータス情報列の下にコマンド出力が表示されます。 サービス名をクリックすると、そのステータスと可用性に関する詳細情報が表示されます。

追加しました check_postgres データベースを監視するためのコマンド、ホスト、およびNagiosインストールへの複数のサービス。 また、Nagios Webインターフェイスを介してサービスを調べることにより、サービスが正しく機能していることを確認しました。 次のステップでは、Slackベースのアラートを構成します。

ステップ4—Slackアラートを設定する

このセクションでは、ワークスペース内の目的のチャネルにイベントを投稿することで、Slackを介してイベントについてアラートを出すようにNagiosを構成します。

開始する前に、Slackで目的のワークスペースにログインし、Nagiosからステータスメッセージを受信する2つのチャネルを作成します。1つはホスト用、もう1つはサービス通知用です。 必要に応じて、両方の種類のアラートを受信するチャネルを1つだけ作成できます。

次に、SlackAppDirectoryのNagiosapp に移動し、 AddConfigurationを押します。 Nagios統合を追加するためのページが表示されます。

NagiosIntegrationの追加を押します。 ページが読み込まれたら、下にスクロールしてトークンをメモします。これは、さらに先に必要になるためです。

次に、サーバーにNagios用のSlackプラグイン(Perlで記述)をインストールして構成します。 まず、次のコマンドを実行して、必要なPerlの前提条件をインストールします。

  1. sudo apt install libwww-perl libcrypt-ssleay-perl -y

次に、プラグインをNagiosプラグインディレクトリにダウンロードします。

  1. sudo curl https://raw.githubusercontent.com/tinyspeck/services-examples/master/nagios.pl -o slack.pl

次のコマンドを実行して実行可能にします。

  1. sudo chmod +x slack.pl

次に、Slackから取得したトークンを使用してワークスペースに接続するように編集する必要があります。 編集のために開きます:

  1. sudo nano slack.pl

ファイル内で次の行を見つけます。

/usr/local/nagios/libexec/slack.pl
...
my $opt_domain = "foo.slack.com"; # Your team's domain
my $opt_token = "your_token"; # The token from your Nagios services page
...

交換 foo.slack.com ワークスペースドメインと your_token Nagiosアプリ統合トークンを使用して、ファイルを保存して閉じます。 これで、スクリプトはSlackに適切なリクエストを送信できるようになります。これをテストするには、次のコマンドを実行します。

  1. ./slack.pl -field slack_channel=#your_channel_name -field HOSTALIAS="Test Host" -field HOSTSTATE="UP" -field HOSTOUTPUT="Host is UP" -field NOTIFICATIONTYPE="RECOVERY"

交換 your_channel_name ステータスアラートを受信するチャネルの名前を指定します。 スクリプトは、Slackに対して行ったHTTPリクエストに関する情報を出力します。すべてが正しく実行された場合、出力の最後の行は次のようになります。 ok. エラーが発生した場合は、指定したSlackチャネルがワークスペースに存在するかどうかを再確認してください。

これで、Slackワークスペースに移動して、指定したチャネルを選択できます。 Nagiosからのテストメッセージが表示されます。

これにより、Slackスクリプトが適切に構成されていることが確認されます。 次に、このスクリプトを使用してSlack経由でアラートを出すようにNagiosを構成します。

Slackの連絡先と、Slackにメッセージを送信する2つのコマンドを作成する必要があります。 この構成を次の名前のファイルに保存します slack.cfg、前の構成ファイルと同じフォルダーにあります。 次のコマンドを実行して、編集用に作成します。

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/slack.cfg

次の行を追加します。

/usr/local/nagios/etc/objects/postgresql/slack.cfg
define contact {
      contact_name                             slack
      alias                                    Slack
      service_notification_period              24x7
      host_notification_period                 24x7
      service_notification_options             w,u,c,f,s,r
      host_notification_options                d,u,r,f,s
      service_notification_commands            notify-service-by-slack
      host_notification_commands               notify-host-by-slack
}

define command {
      command_name     notify-service-by-slack
      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#service_alerts_channel
}

define command {
      command_name     notify-host-by-slack
      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#host_alerts_channel
}

ここで、という名前の連絡先を定義します slack、いつでも連絡できることを述べ、サービスおよびホスト関連のイベントを通知するために使用するコマンドを指定します。 これらの2つのコマンドはその後に定義され、構成したばかりのスクリプトを呼び出します。 交換する必要があります service_alerts_channelhost_alerts_channel それぞれ、サービスメッセージとホストメッセージを受信するチャネルの名前を使用します。 必要に応じて、同じチャネル名を使用できます。

最後のステップでのサービスの作成と同様に、連絡先にサービスとホストの通知オプションを設定することは、連絡先が受信するアラートの種類を制御するため、非常に重要です。 これらのオプションを省略すると、Webインターフェイスから手動でトリガーされた場合にのみ通知が送信されます。

編集が終わったら、ファイルを保存して閉じます。

経由でアラートを有効にするには slack 定義した連絡先に追加する必要があります admin で定義された連絡先グループ contacts.cfg 下にある設定ファイル /usr/local/nagios/etc/objects/. 次のコマンドを実行して、編集用に開きます。

  1. sudo nano /usr/local/nagios/etc/objects/contacts.cfg

次のような構成ブロックを見つけます。

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin
}

追加 slack 次のように、メンバーのリストに:

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin,slack
}

ファイルを保存して閉じます。

デフォルトでは、スクリプトを実行するとき、Nagiosは環境変数を介してホストとサービスの情報を利用可能にしません。これはSlackスクリプトが意味のあるメッセージを送信するために必要なものです。 これを修正するには、を設定する必要があります enable_environment_macros の設定 nagios.cfg1. 次のコマンドを実行して、編集用に開きます。

  1. sudo nano /usr/local/nagios/etc/nagios.cfg

次のような行を見つけます。

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=0

値をに変更します 1、 そのようです:

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=1

ファイルを保存して閉じます。

次のコマンドを実行して、Nagios構成の有効性をテストします。

  1. sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

出力の終わりは次のようになります。

Output
Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check

次のコマンドを実行して、Nagiosの再起動に進みます。

  1. sudo systemctl restart nagios

Slack統合をテストするには、Webインターフェイスを介してカスタム通知を送信します。 ブラウザにNagiosServicesステータスページをリロードします。 ページが読み込まれたら、 PostgreSQLバックエンドサービスを押し、右側のカスタムサービス通知の送信を押します。

選択したコメントを入力し、コミットを押してから、完了を押します。 Slackですぐに新しいメッセージが届きます。

これでSlackとNagiosが統合されたため、重要なイベントやステータスの変更に関するメッセージをすぐに受け取ることができます。 また、Nagios内から手動でイベントをトリガーすることにより、統合をテストしました。

結論

これで、管理対象のPostgreSQLデータベースを監視し、ステータスの変更とイベントをSlackに報告するようにNagios Coreが構成されたため、データベースで何が起こっているかを常に把握できます。 これにより、ステータスフィードがリアルタイムで取得されるため、緊急時に迅速に対応できます。

の機能について詳しく知りたい場合 check_postgres、その docs をチェックしてください。ここには、使用できる可能性のあるさらに多くのコマンドがあります。

PostgreSQLマネージドデータベースでできることの詳細については、 productdocsにアクセスしてください。