基本ポリシー
設定に関する基本的なポリシーです
- サービスごとにホストグループを作る
- サービスごとに固定スクリーンを1つ作る
- OS、アプリケーションごとにテンプレートを1つ作る
- テンプレートごとにダイナミックスクリーンを1つ作る
Zabbixのスクリーンでめんどうなのはダイナミックスクリーンの選択です。
![f:id:mikeda:20120804175753p:image:w640 f:id:mikeda:20120804175753p:image:w640](http://cdn-ak.f.st-hatena.com/images/fotolife/m/mikeda/20120804/20120804175753.png)
※ホスト削除時に設定が消えるのを防ぐため、ダミーのホストを使って設定しています。
めんどうな理由はこの2つです。
- プルダウンで3箇所も選択する
- ホストとスクリーンが関連づいてないので、関係ないホストがいっぱい出てくる
ただ3、4のルールを実施すれば
ホスト⇔テンプレート⇔スクリーン
というふうに、テンプレートを挟んでホストとスクリーンを関連付けることができるので、
『ホストグループに所属するホストの、関連するスクリーンを抽出したリンク集』
を動的生成することができます。
![f:id:mikeda:20120804175754p:image:w400 f:id:mikeda:20120804175754p:image:w400](http://cdn-ak.f.st-hatena.com/images/fotolife/m/mikeda/20120804/20120804175754.png)
ソースコードはこんな感じです。
※プロトタイプ版ということで、汚くてすみません(==
<?php
$zabbix_path = "http://admin01/zabbix/";
$zabbix_db = array(
host => "localhost",
db => "zabbix",
user => "zabbix",
pass => "zabbixpass"
);
$templates_screens = array(
10001 => 11,
10002 => 12,
10603 => 13,
10004 => 14,
10005 => 15,
10606 => 16,
10007 => 17,
);
$groupid = $_GET["groupid"];
db_connect($zabbix_db);
$templateids = array_keys($templates_screens);
$templates = get_templates($templateids);
$screenids = array_values($templates_screens);
$screens = get_screens($screenids);
$hosts = get_hosts($groupid);
$hosts_templates = get_hosts_templates($templateids);
echo "<table border=4>\n";
echo "<tr bgcolor='#cccccc'>\n";
echo '<th>Host</th>';
foreach($templateids as $templateid){
$screenid = $templates_screens[$templateid];
echo '<th>'. $screens[$screenid]["name"] ."</th>";
}
echo "</tr>\n";
foreach($hosts as $hostid => $host){
echo "<tr>\n";
echo "<td>". $host["name"] ."</td>";
foreach($templateids as $templateid){
if(in_array($templateid, $hosts_templates[$hostid])){
$screenid = $templates_screens[$templateid];
$screenname = $screens[$screenid]["name"];
echo "<td>"
. '<a href="'.$zabbix_path.'screens.php?'
. 'elementid='.$screenid.'&groupid='.$groupid.'&hostid='.$hostid.'&period=86400" target="_blank">'
. $screenname
. "</a>"
. "</td>";
}else{
echo "<td>-</td>";
}
}
echo "</tr>\n";
}
echo "</table>\n";
exit(0);
function db_connect($db){
$conn = mysql_connect($db["host"], $db["user"], $db["pass"]);
if (!$conn) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}
if (!mysql_select_db($db["db"])) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
}
function get_templates($templateids){
$templates = array();
$sql = "SELECT hostid,host FROM hosts WHERE hostid IN ("
. implode(",", $templateids) . ")";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
$templates[$row["hostid"]] = array(
"name" => $row["host"]
);
}
return $templates;
}
function get_screens($screenids){
$screens = array();
$sql = "SELECT screenid,name FROM screens WHERE screenid IN ("
. implode(",", $screenids)
. ")";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
$screens[$row["screenid"]] = array(
"name" => preg_replace("/^(OS|App)_/", "", $row["name"]),
);
}
return $screens;
}
function get_hosts_templates($templateids){
$hosts_templates = array();
$sql = "SELECT hostid,templateid FROM hosts_templates WHERE templateid IN ("
. implode(",", $templateids)
.")";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
$hostid = $row["hostid"];
$templateid = $row["templateid"];
if(!array_key_exists($hostid, $hosts_templates)){
$hosts_templates[$hostid] = array();
}
$hosts_templates[$hostid][] = $templateid;
}
return $hosts_templates;
}
function get_hosts($groupid){
$hosts = array();
$sql = "SELECT hostid, host FROM hosts WHERE hostid IN (SELECT hostid FROM hosts_groups WHERE groupid = ".$groupid.")";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
$hosts[$row["hostid"]] = array(
"name" => $row["host"]
);
}
return $hosts;
}
function quote_string($string){
return "'". mysql_real_escape_string($string) ."'";
}
function quote_array($strings){
$quoted_strings = array();
foreach($strings as $s){
$quoted_strings[] = quote_string($s);
}
return $quoted_strings;
}
Zabbixのスクリーンには特定のURLをGETした結果を埋め込めるので、
その機能を使ってスクリーンにリンク集を埋め込みます。
![f:id:mikeda:20120804181008p:image:w360 f:id:mikeda:20120804181008p:image:w360](http://cdn-ak.f.st-hatena.com/images/fotolife/m/mikeda/20120804/20120804181008.png)