ZabbixAPIでEC2を自動登録してみた

2016.04.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、あべいかです。

Zabbixでホストを自動登録する仕組みを考えてみました。
AWS SDKとZabbix APIを使ったスクリプトを作ってみたので、ご紹介します。

Zabbix API

概要

Zabbix APIはZabbix 1.8から実装されているWeb APIです。
GUIを介さずに、Zabbixの監視設定を行う事が出来ます。

Zabbix APIを利用するためのサードパーティ製ツールが数多く公開されています。
今回はzabbixapiを利用しました。

インストール

gemでインストールする事が出来ます。

gem install zabbixapi

使い方

zabbixapiの使い方はこちらにまとめられています。

検証環境

  • Red Hat Enterprise Linux Server release 7.2
  • Zabbix Server 3.0.1
  • AWS SDK for Ruby 2.2.26
  • zabbixapi 2.4.7

スクリプト

自動登録の対象はEC2です。
指定したホストグループにEC2インスタンスが存在するか確認し、存在しない場合は以下の処理を行います。

  • ホストの作成
  • テンプレートの適用
  • マクロの適用

実行方法

事前にZabbixで、ホストグループ:EC2の作成が必要です。
SDKの認証はIAM Roleを使います。

# ruby register_ec2_hosts

実行結果

ZabbixのGUIから結果を確認します。 ホスト名には、SDKで取得したインスタンスIDが設定されています。

自動登録1

テンプレートは、指定したものが適用されています。

自動登録2

マクロには、自動登録された日時が設定されています。

自動登録3

ホストが登録済みの場合、以下のように表示されます。

$ ruby register_ec2_hosts
"i-12345678:登録済みです"
"i-abcdefgh:登録済みです"
$

コード

ZabbixApi.connectのパラメータは適宜書き換えが必要です。

#!/usr/bin/ruby

require "rubygems"
require "aws-sdk"
require "zabbixapi"

zbx = ZabbixApi.connect(
  :url => 'http://localhost/zabbix/api_jsonrpc.php',
  :user => 'Admin',
  :password => '*****'
)

# AWSリージョンの指定
Aws.config[:region] = 'ap-northeast-1'

# Zabbixグループ
Zabbix_group = 'EC2'
zgroupid = zbx.hostgroups.get_id(:name => Zabbix_group)

# Zabbixテンプレート
ztemplates = Array.new()
ztemplates << zbx.templates.get_id(:host => "Template OS Linux")
ztemplates << zbx.templates.get_id(:host => "Template ICMP Ping")

# EC2インスタンスIDを取得
client = Aws::EC2::Client.new()
ec2desc = client.describe_instances

# 指定したグループのZabbixホスト情報を取得
zhosts = zbx.query(
  :method => "host.get",
  :params => {
    :groupids => zgroupid
  }
)
zhostnames = Array.new
zhosts.each do |zhost|
  zhostnames << zhost["name"]
end

# ホストが登録されていない場合、登録する
ec2desc.reservations.each do |instance|
  if !zhostnames.include?(instance.instances[0].instance_id)
    zbx.hosts.create(
      # ホストの作成
      :host => instance.instances[0].instance_id,
      :interfaces => [
        {
          :type => 1,
          :main => 1,
          :ip => instance.instances[0].private_ip_address,
          :dns => instance.instances[0].private_dns_name,
          :port => 10050,
          :useip => 0
        }
       ],
       :groups => [ :groupid => zgroupid ]
    )

    # テンプレートの適用
    zbx.templates.mass_add(
      :hosts_id => [zbx.hosts.get_id(:host => instance.instances[0].instance_id)],
      :templates_id => ztemplates
    )

    # マクロの適用
    zbx.usermacros.create(
      :hostid => zbx.hosts.get_id(:host => instance.instances[0].instance_id),
      :macro => "{$AUTO_ADD_TIME}",
      :value => Time.now
    )
  else
    p "#{instance.instances[0].instance_id}:登録済みです"
  end
end

参考

以下を参考にさせて頂きました。ありがとうございます。

おわりに

AWS SDKとZabbix APIを使った、自動登録を試してみました。 APIは豊富に用意されており、Zabbixの運用自動化が実現出来そうです。 くコ:彡