この記事は公開されてから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が設定されています。
テンプレートは、指定したものが適用されています。
マクロには、自動登録された日時が設定されています。
ホストが登録済みの場合、以下のように表示されます。
$ 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の運用自動化が実現出来そうです。 くコ:彡