ZabbixAPIでホストグループからマップを作成

Zabbix2.0の新機能でこんなのがあるようです
【ラトビアの生活とZabbix 2.0 & カンファレンスの話】 by @


ホストを並べたマップは確かにホストの状態が一目でわかって便利ですね!
でもZabbix1.8では作るのがけっこうめんどうです。
(要素のコピーができないので手動だと・・・XMLで作ってインポートすればまだ楽)


というわけでAPI経由で作ってみました。
こんな感じでできました。

ソースコード

ZabbixAPI.pmを使ってます。

#!/usr/bin/perl
use strict;
use warnings;

use lib 'lib';
use Data::Dumper;
use ZabbixAPI;

my $hostgroup  = 'Linux servers'; # マップにまとめるホストグループ

# MAPの設定
my %params = (
  name           => "test-map01",
  width          => 450,
  height         => 350,
  backgroundid   => 0,
  label_type     => 0, # 0:label 1:IP address 2:icon name 3:only status
  label_location => 2, # 0:bottom 1:left 2:right 3:top
  highlight      => 0,
  expandproblem  => 1,
  markelements   => 0,
  show_unack     => 0
);


my $za = ZabbixAPI->new("http://127.0.0.1/zabbix/");
$za->login("apiuser", "apipass");

# ホストグループのIDを取得
my $groupid = $za->hostgroup_get(
  {
    filter => { name => [ $hostgroup ] }
  }
)->[0]->{groupid};

# ホスト情報を取得
my $hosts = $za->host_get(
  {
    groupids  => [ $groupid ],
    sortfield => 'host',
    output    => 'extend'
  }
);

# マップの要素情報を作成
my @selements;
my ($basex, $basey) = (10, 50);
my ($x, $y) = ($basex, $basey);
for my $host (@$hosts){
  push @selements, {
    elementid     => $host->{hostid},
    elementtype   => 0, # 0:host 1:map 2:trigger 3:host group 4:image
    # icon
    iconid_off         => 19, # OK
    iconid_on          => 0,  # PROBLEM
    iconid_unknown     => 0,  # UNKNOWN
    iconid_disabled    => 0,  # Disabled
    iconid_maintenance => 0,  # Maintenance
    # label
    label          => $host->{host},
    label_location => 0, # 0:bottom 1:left 2:right 3:top -1:map setting
    # position
    x => $x,
    y => $y,
    # URLに適切なスクリーンをセットしておくと便利!!!
    url => "http://mikeda.jp/zabbix/screens.php?&elementid=3&groupid=6&hostid=".$host->{hostid}
  };
  $x += 100;
  if($x > $params{width} - 100){
    $x = $basex;
    $y += 100;
  }
}
$params{selements} = \@selements;

# マップ作成
my $result = $za->map_create( [ \%params ]);

print Dumper $result;