Zabbixのスクリプト実行時エラー対処方法

zabbixに登録されたホストに対して設定したスクリプト(デフォルトだとpingとtracerouteが設定されている)
を実行しようとした場合に下記のようなfsockopenでエラーが発生した。

fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known[/usr/share/zabbix/include/scripts.inc.php:68]

/usr/share/zabbix/include/scripts.inc.phpの68行目を見てみると下記のようになっている。

 65 function execute_script($scriptid,$hostid){
 66         global $ZBX_SERVER, $ZBX_SERVER_PORT, $ZBX_MESSAGES;
 67 
 68         if(!$socket = fsockopen($ZBX_SERVER, $ZBX_SERVER_PORT, $errorCode, $errorMsg, ZBX_SCRIPT_TIMEOUT)){
 69                 array_pop($ZBX_MESSAGES);
 70                 error(S_SCRIPT_ERROR_DESCRIPTION.': '.$errorMsg);
 71                 show_messages(false, '', S_SCRIPT_ERROR);
 72                 return false;
 73         }

$ZBX_SERVERに対してオープンをかけようとして失敗している模様。
$ZBX_SERVERには何が入っているかを確認してみると、/usr/share/zabbix/conf/zabbix.conf.phpに書かれているようでした。

$ZBX_SERVER             = 'zabbix-server';
$ZBX_SERVER_PORT        = '10051';

こんな感じです。

名前解決できるか確認してみると、どうやらzabbix_serverが名前解決できていないみたいです。

$ ping zabbix-server
ping: unknown host zabbix-server

これが原因なので、hostsに書いてあげて名前解決できるようにしてあげるととりあえずエラーが変わった。

まだ下記のようなPermission deniedのエラーが発生。
どうやら更にここの記事の内容の設定が必要みたい
http://blog.livedoor.jp/tani_masaru/archives/51726525.html

phpのプログラムからZabbixServerにソケット接続してリモートのサーバに対してコマンド実行するという処理を行っており、
その実行過程でSELinuxが拒否をかけているよう。

SELinuxを無効にするか、下記のように接続許可設定を追加してあげるとうまくいくようなので、実施してみる。
まずはzabbix serverでSELinuxが有効か無効かを確認

# /usr/sbin/getenforce
Enforcing

有効になっている。(※無効の場合はPermissiveと表示される)

スクリプトでソケット通信を許可する設定は下記のhttpd_can_network_connectをon(1)にすることで可能となる。

# setsebool -P httpd_can_network_connect 1

正しく設定されているか確認するにはgetseboolコマンドで確認。

# getsebool -a | grep httpd
allow_httpd_anon_write --> off
allow_httpd_bugzilla_script_anon_write --> off
allow_httpd_cvs_script_anon_write --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_nagios_script_anon_write --> off
allow_httpd_prewikka_script_anon_write --> off
allow_httpd_squid_script_anon_write --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_network_connect --> on      ←ここがonになっていればOK!
httpd_can_network_connect_db --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> on
httpd_disable_trans --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> on
httpd_read_user_content --> off
httpd_rotatelogs_disable_trans --> off
httpd_ssi_exec --> off
httpd_suexec_disable_trans --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_nfs --> off

これでやっと実行できるようになった。

上記記事の内容にもある通り、tracerouteの実行についてはパスが異なっているため実行に失敗します。
CentOSの場合、tracerouteのコマンドのパスはデフォルトだと/bin/tracerouteになっているはずなので、
ZabbixのTracerouteスクリプトの実行コマンドを/usr/bin/tracerouteから/bin/tracerouteに変更する必要があります。

Zabbixの設定を変えずに実施したい場合は参考記事のように/usr/bin/tracerouteにシンボリックリンクを貼ってもOKです。

ちなみにこの設定を行うことでダッシュボードの「Zabbixサーバの起動」の状態が「はい」になり、正しく表示されるようになります。