リモートコマンド

概要

リモートコマンドを使用すると、特定の事前定義済みコマンドを、ある条件が発生したときに監視対象のホスト上で自動的に実行するように定義できます。

このため、リモートコマンドは、インテリジェントでプロアクティブな監視を実現する強力な仕組みです。

この機能の最も一般的な使用例として、次のようなことができます。

  • 応答しなくなった場合に、アプリケーション(Webサーバー、ミドルウェア、CRMなど)を自動的に再起動する
  • リクエストに応答しないリモートサーバーを、IPMIの「reboot」コマンドを使用して再起動する
  • ディスク容量が不足した場合に、古いファイルを削除したり /tmp をクリーンアップしたりして、ディスク領域を自動的に解放する
  • CPU負荷に応じて、VMをある物理マシンから別の物理マシンへ移行する
  • CPU、ディスク、メモリなどのリソースが不足した場合に、クラウド環境へ新しいノードを追加する

リモートコマンド用のアクションの設定は、メッセージ送信用のアクションの設定と似ています。唯一の違いは、Zabbixがメッセージを送信する代わりにコマンドを実行する点です。

リモートコマンドは、Zabbixサーバー、Zabbixプロキシ、またはZabbixエージェントによって実行できます。 次の点に注意してください。

  • Zabbixエージェント上のリモートコマンドは、Zabbixサーバーから直接、またはZabbixプロキシ経由で実行できます。
  • Zabbixサーバーによって実行されるリモートコマンドは、終了コードの確認を含め、コマンドの実行で説明されている方法で実行されます。
  • 対象のホストがメンテナンスモードの場合でも、リモートコマンドは実行されます。

リモートコマンドは、ZabbixエージェントとZabbixプロキシの両方でデフォルトでは無効になっています。 次のように有効にできます。

  • Zabbixエージェントによって実行されるリモートコマンドの場合、エージェント設定に、許可する各コマンドに対して AllowKey=system.run[<command>,*] または AllowKeyRegexp=^system\.run\[<command>,.*\]$ パラメータを追加します。* は、どちらの実行モード(wait または nowait)にも一致します。
  • Zabbixプロキシによって実行されるリモートコマンドの場合、プロキシ設定で EnableRemoteCommands パラメータを 1 に設定します。

プロキシによって監視されているホスト上でZabbixエージェントがリモートコマンドを実行する場合、Zabbixプロキシでリモートコマンドを有効にする必要はありません。

必要な場合を除き、AllowKey=system.run[*] または AllowKeyRegexp=^system\.run\[.*\]$ は使用しないでください。これらを使用すると、ホスト上で任意のコマンドを実行できるようになります。 セキュリティ上の理由から、完全に一致するコマンドのみを許可することを推奨します。system.run[*] はデフォルトで拒否されています(DenyKey=system.run[*])。

エージェントチェックの制限も参照してください。

リモートコマンドの制限

すべてのマクロを解決した後のリモートコマンドの制限は、データベースの種類と文字セット(非ASCII文字は格納に1バイト以上必要)によって異なります。

データベース 文字数の制限 バイト数の制限
MySQL 65535 65535
PostgreSQL 65535 無制限
SQLite (Zabbixプロキシのみ) 65535 無制限

リモートコマンドの実行出力(戻り値)は16MBに制限されています(末尾の空白も含み、切り捨てられます)。 IPMIリモートコマンドの制限は、インストールされているIPMIライブラリに基づきます。 データベースの制限は、すべてのリモートコマンドに適用されることに注意してください。

設定

Zabbixエージェントが実行するリモートコマンドは、まず AllowKey または AllowKeyRegexp パラメータを使用して、エージェントの設定 で許可する必要があります。

各コマンドを nowait モードで実行できるようにするには、許可するコマンドごとに AllowKey=system.run[<command>,*] または AllowKeyRegexp=^system\.run\[<command>,.*\]$ パラメータがエージェントの設定に追加されていることを確認してください。 パラメータを変更した後、エージェントデーモンを再起動します。

次に、障害 > アクション > トリガーアクション で新しいアクションを設定する場合:

  1. 適切な条件を定義します。たとえば、いずれかのApacheアプリケーションで重大度が「致命的」の障害が発生したときにアクションが有効になるように設定します。

  1. 実行内容タブで、実行内容、復旧時の実行内容、または更新時の実行内容セクションの追加をクリックします。

  1. 実行内容ドロップダウンリストから定義済みスクリプトのいずれかを選択し、スクリプトの対象リストを設定します。

定義済みスクリプト

アクション操作で利用できるスクリプト(webhook、script、SSH、Telnet、IPMI)は、スコープとして Action operation を選択した global scripts で定義されます。

例:

sudo /etc/init.d/apache restart 

この場合、Zabbix は Apache プロセスの再起動を試みます。このコマンドでは、コマンドが Zabbix エージェント上で実行されるようにしてください(Execute on に対して Zabbix agent ボタンをクリックします)。

sudo の使用に注意してください。Zabbix ユーザーには、デフォルトではシステムサービスを再起動する権限がありません。sudo の設定方法については、以下のヒントを参照してください。

Zabbix エージェント 7.0 以降では、アクティブモードで動作しているエージェント上でもリモートコマンドを実行できます。 Zabbix エージェントは、アクティブ/パッシブのいずれであってもリモートホスト上で動作し、コマンドをバックグラウンドで実行します。

Zabbix エージェント上のリモートコマンドは、system.run[,nowait] キーによってタイムアウトなしで実行され、実行結果は確認されません。 Zabbix サーバーおよび Zabbix プロキシでは、リモートコマンドは zabbix_server.conf または zabbix_proxy.conf ファイルの TrapperTimeout パラメータで設定されたタイムアウト付きで実行され、実行結果は 確認 されます。 詳細については、Script timeout を参照してください。

アクセス権限

zabbix ユーザーに、設定されたコマンドの実行権限があることを確認してください。特権コマンドへのアクセスを許可するために sudo を使用するとよい場合があります。アクセスを設定するには、root として次を実行します。

visudo

sudoers ファイルで使用できる例は次のとおりです。

# 'zabbix' ユーザーがパスワードなしで全コマンドを実行できるようにします。
zabbix ALL=NOPASSWD: ALL

# 'zabbix' ユーザーがパスワードなしで apache を再起動できるようにします。
zabbix ALL=NOPASSWD: /etc/init.d/apache restart

一部のシステムでは、sudoers ファイルによりローカル以外のユーザーがコマンドを実行できないようになっています。これを変更するには、/etc/sudoers 内の requiretty オプションをコメントアウトしてください。

複数のインターフェースを持つリモートコマンド

ターゲットシステムが選択されたタイプ( ZabbixエージェントまたはIPMI)の複数のインターフェースを持っている場合、リモートコマンドはデフォルトのインターフェースで実行されます。

Zabbixエージェント以外のインターフェースを使用して、SSHおよびTelnet経由でリモートコマンドを実行することも可能です。使用可能なインターフェースは、次の順序で選択されます:

  • Zabbixエージェントのデフォルトインターフェース
  • SNMPのデフォルトインターフェース
  • JMXのデフォルトインターフェース
  • IPMIのデフォルトインターフェース

IPMI リモートコマンド

IPMI リモート コマンドの場合、次の構文を使用する必要があります。

<command> [<value>]

内容

  • <command> - スペースなしの 1 つのIPMI コマンド
  • <value> - 'on', 'off'または任意の符号なし整数。 <value> はオプションパラメーターです。

例

アクションの実行内容でリモートコマンドとして使用できるグローバルスクリプトの例。

例 1

特定の条件で Windows を再起動します。

Zabbix によって障害が検出されたときに Windows を自動的に再起動するには、次のスクリプトを定義します。

Script parameter Value
Scope 'Action operation'
Type 'Script'
Command c:\windows\system32\shutdown.exe -r -f

例2

IPMI制御を使用してホストを再起動します。

スクリプトパラメータ 値
スコープ 'アクションオペレーション'
タイプ 'IPMI'
コマンド reset

例3

IPMI制御を使用してホストの電源をオフにします。

スクリプトパラメータ 値
スコープ 'アクションオペレーション'
タイプ 'IPMI'
コマンド power off