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サーバの起動」の状態が「はい」になり、正しく表示されるようになります。