2 リモートコマンド
概要
リモートコマンドを使用すると、特定の条件が発生した際に、あらかじめ定義したコマンドを監視対象のホスト上で自動的に実行するよう設定できます。
このように、リモートコマンドはスマートなプロアクティブ監視を実現する強力な仕組みです。
この機能の最も一般的な使用例として、次のような処理を実行できます。
- 応答しなくなったアプリケーション(Webサーバー、ミドルウェア、CRMなど)を自動的に再起動する
- リクエストに応答しないリモートサーバーを、IPMIの「reboot」コマンドで再起動する
- ディスク容量が不足した場合に、古いファイルを削除したり
/tmpをクリーンアップしたりして、ディスク領域を自動的に解放する - CPU負荷に応じて、VMをある物理マシンから別の物理マシンへ移行する
- CPU、ディスク、メモリなどのリソースが不足した場合に、クラウド環境へ新しいノードを追加する
リモートコマンド用のアクションの設定は、メッセージ送信用のアクション設定と似ています。唯一の違いは、Zabbixがメッセージを送信する代わりにコマンドを実行する点です。
リモートコマンドは、Zabbixサーバー、Zabbixプロキシ、またはZabbixエージェントによって実行できます。 次の点に注意してください。
- Zabbixエージェント上のリモートコマンドは、Zabbixサーバーから直接、またはZabbixプロキシ経由で実行できます。
- Zabbixサーバーによって実行されるリモートコマンドは、終了コードの確認を含め、コマンドの実行で説明されている方法で実行されます。
- 対象のホストがメンテナンスモードの場合でも、リモートコマンドは実行されます。
リモートコマンドは、ZabbixエージェントとZabbixプロキシの両方でデフォルトでは無効になっています。 次の方法で有効にできます。
- Zabbixエージェントによって実行されるリモートコマンドの場合は、エージェント設定に、許可するコマンドごとに
AllowKey=system.run[<command>,*]パラメータを追加します。ここで、*は実行モード(waitまたはnowait)のいずれかに一致します。 - Zabbixプロキシによって実行されるリモートコマンドの場合は、プロキシ設定で
EnableRemoteCommandsパラメータを1に設定します。 Zabbixプロキシが監視するホスト上でZabbixエージェントによってリモートコマンドを実行する場合、Zabbixプロキシでリモートコマンドを有効にする必要はありません。
必要な場合を除き、AllowKey=system.run[*] は使用しないでください。これは、ホスト上で任意のコマンドの実行を許可します。
セキュリティ上の理由から、完全一致するコマンドのみを許可することを推奨します。system.run[*] はデフォルトで拒否されます(DenyKey=system.run[*])。
エージェントチェックの制限も参照してください。
リモートコマンドの上限
すべてのマクロを解決した後のリモートコマンドの上限は、データベースの種類と文字セットによって異なります(非ASCII文字の格納には1バイトを超える容量が必要です)。
| Database | Limit in characters | Limit in bytes |
|---|---|---|
| MySQL | 65535 | 65535 |
| Oracle Database | 2048 | 4000 |
| PostgreSQL | 65535 | not limited |
| SQLite (only Zabbix proxy) | 65535 | not limited |
リモートコマンドの実行出力(戻り値)は16MBに制限されます(末尾の空白も含まれ、切り詰められます)。 IPMIリモートコマンドの上限は、インストールされているIPMIライブラリに基づきます。 データベースの上限は、すべてのリモートコマンドに適用されることに注意してください。
設定
Zabbix エージェントで実行するリモートコマンド(カスタムスクリプト)は、まずエージェントの設定で有効にする必要があります。
特定のコマンドを nowait モードで実行できるようにするには、エージェントの設定で、許可する各コマンドに対して AllowKey=system.run[<command>,\*] パラメータが追加されていることを確認してください。
このパラメータを変更した場合は、エージェントデーモンを再起動します。
次に、アラート > アクション > トリガーアクション で新しいアクションを設定します。
- 適切な条件を定義します。たとえば、Apacheアプリケーションのいずれかで重大度が「致命的」の障害が発生したときにアクションを有効にするよう設定します。

- 実行内容タブで、実行内容、復旧時の実行内容、または更新時の実行内容ブロックの追加をクリックします。

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

事前定義済みスクリプト
アクションの実行(webhook、スクリプト、SSH、Telnet、IPMI)で使用できるスクリプトは、スコープとして アクションの実行 を選択した状態で、グローバルスクリプト に定義します。
例:
sudo /etc/init.d/apache restart
この場合、ZabbixはApacheプロセスの再起動を試みます。 このコマンドでは、実行場所 に対して Zabbixエージェント ボタンをクリックし、コマンドがZabbixエージェント上で実行されるようにしてください。
sudo の使用に注意してください。デフォルトでは、Zabbixユーザーにはシステムサービスを再起動する権限がありません。 sudo の設定方法については、以下の説明を参照してください。
Zabbixエージェント7.0以降では、アクティブモードで動作しているエージェント上でもリモートコマンドを実行できます。 アクティブまたはパッシブのどちらのモードであっても、Zabbixエージェントはリモートホスト上で実行され、バックグラウンドでコマンドを実行します。
Zabbixエージェント上のリモートコマンドは、system.run[,nowait] キーによってタイムアウトなしで実行され、実行結果は確認されません。
ZabbixサーバーおよびZabbixプロキシ上のリモートコマンドは、zabbix_server.conf または zabbix_proxy.conf ファイルの TrapperTimeout パラメータで設定されたタイムアウト時間内に実行され、実行結果が確認されます。
詳細については、スクリプトのタイムアウトを参照してください。
アクセス権限
設定したコマンドを実行する権限が、'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> - スペースを含まないIPMIコマンドのいずれか
- <value> - 「on」、「off」、または符号なし整数。 <value>はオプションのパラメータです。
例
アクションの実行内容でリモートコマンドとして使用できるグローバルスクリプトの例です。
例 1
特定の条件でWindowsを再起動します。
Zabbixが検出した障害に応じてWindowsを自動的に再起動するには、次のスクリプトを定義します。
| スクリプトパラメータ | 値 |
|---|---|
| スコープ | 'アクションの実行' |
| タイプ | 'スクリプト' |
| コマンド | c:\windows\system32\shutdown.exe -r -f |
例 2
IPMI制御を使用してホストを再起動します。
| スクリプトパラメータ | 値 |
|---|---|
| スコープ | 'アクションの実行' |
| タイプ | 'IPMI' |
| コマンド | reset |
例 3
IPMI制御を使用してホストの電源をオフにします。
| スクリプトパラメータ | 値 |
|---|---|
| スコープ | 'アクションの実行' |
| タイプ | 'IPMI' |
| コマンド | power off |