Ubuntu 18.04でNagios Coreを使用して管理対象のPostgreSQLデータベースを監視する方法

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにFree and Open Source Fundを選択しました。

前書き

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

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

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

前提条件

  • ルート権限を持つUbuntu 18.04サーバー、およびセカンダリの非ルートアカウント。 これは、this initial server setup guideに従って設定できます。 このチュートリアルでは、root以外のユーザーはsammyです。

  • サーバーにインストールされたNagios Core。 これを実現するには、How To Install Nagios 4 and Monitor Your Servers on Ubuntu 18.04チュートリアルの最初の5つのステップを完了します。

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

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

[[step-1 -—- installing-check_postgres]] ==ステップ1—check_postgresのインストール

このセクションでは、check_postgresプラグインの最新バージョンをGithubからダウンロードし、NagiosCoreで利用できるようにします。 また、PostgreSQLクライアント(psql)をインストールして、check_postgresが管理対象データベースに接続できるようにします。

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

sudo apt install postgresql-client

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

cd ~

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

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

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

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

tar xvf check_postgres-*.tar.gz

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

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

次に、nagiosにユーザー所有権を付与して、Nagiosから実行できるようにする必要があります。

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

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

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

cd /usr/local/nagios/libexec

次に、次を使用してシンボリックリンクを作成します。

sudo perl check_postgres.pl --symlinks

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

OutputCreated "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が管理対象データベースへの接続に使用します。

[[step-2 -—- configuring-your-database]] ==ステップ2—データベースの構成

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

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

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

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

/etc/postgresql-common/pg_service.conf

[managed-db]
host=host
port=port
user=username
password=password
dbname=defaultdb
sslmode=require

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

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

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

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

ここでは、パラメーター--dbserviceで使用するデータベース接続情報グループをcheck_postgresに指示し、アクションとしてconnectionを指定することによってのみ接続を試行するように指定します。

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

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

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

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

[[step-3 -—- creating-monitoring-services-in-nagios]] ==ステップ3—Nagiosでの監視サービスの作成

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

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

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

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

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

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$
}

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

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

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

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

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を渡し、ステップ2で定義したmanaged-dbを監視する必要があることを詳しく説明します。

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

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

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

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
...

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

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

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

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

OutputTotal Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

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

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

sudo systemctl restart nagios

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

PostgreSQL Monitoring Services - Pending

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

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

[[step-4 -—- configuring-slack-alerting]] ==ステップ4—Slackアラートの構成

このセクションでは、ワークスペースの目的のチャンネルにイベントを投稿することにより、Slackを介してイベントについて警告するようにNagiosを設定します。

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

次に、Slack App DirectoryのNagios appに移動し、Add Configurationを押します。 Nagios統合を追加するためのページが表示されます。

Slack - Add Nagios Integration

Add Nagios Integrationを押します。 ページが読み込まれたら、下にスクロールしてトークンをメモします。これはさらに必要になるからです。

Slack - Integration Token

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

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

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

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

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

sudo chmod +x slack.pl

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

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に送信できるようになりました。次のコマンドを実行してテストします。

./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 - Nagios Test Message

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

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

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連絡先を介したアラートを有効にするには、/usr/local/nagios/etc/objects/の下にあるcontacts.cfg構成ファイルで定義されているadmin連絡先グループにアラートを追加する必要があります。 。 次のコマンドを実行して、編集用に開きます。

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スクリプトが必要とするものです。 これを修正するには、nagios.cfgenable_environment_macros設定を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設定の有効性をテストします。

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

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

OutputTotal Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

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

sudo systemctl restart nagios

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

Nagios - Custom Service Notification

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

Slack - Status Alert From Nagios

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

結論

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

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

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

Related