ZabbixAPIでEC2を自動登録してみた
はじめに
こんにちは、あべいかです。
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の運用自動化が実現出来そうです。 くコ:彡