ザビ家の野望 〜 全自動ZABBIX AWS編 〜

Post on 12-Jun-2015

4.443 views 6 download

description

社内LT大会で発表した資料です。

Transcript of ザビ家の野望 〜 全自動ZABBIX AWS編 〜

ザビ家の野望!~全自動ZABBIX AWS編~

け や ぼ う

2014.05.15 株式会社 サイバード

三浦 克浩

自己紹介•名前:三浦 克浩

• Twitter ID:@MiuraKatsu

•仕事:ソーシャゲ開発

•好きなフレームワーク:CakePHP、Yacafi

•浦和レッズ:

全自動ZABBIX AWS編

• 全自動で登録

• 全自動で削除

• 全自動で登録 Mk-II

• 全自動で削除 改

• 分散監視について

• Zabbix API

• サーバ設定の自動化

• 全自動Zabbix 完全版

ZABBIXで自動登録

・ネットワークディスカバリ ポーリング型 !

・Zabbix Agent アクティブチェック  PUSH型  

ネットワークディスカバリ• ポーリング型

• 定期ポーリング

• 登録も削除も

• IPアドレスの範囲指定

• SNMPとかでも

• 時間がかかる

ネットワークディスカバリZABBIX Server

Node

Node Node Node

Agent アクティブチェック• PUSH型

• 起動時にサーバから監視項目のリスト取得

• 登録されてなかったら登録

• 削除はできない

• Zabbix Agentのみ

Agent アクティブチェック

ZABBIX Server

Node

Node Node Node

全自動で登録 AWS編

AWSだと増えたり減ったり

ZABBIX Server

Node

Node Node Node

Node

Node Node

全自動で登録 AWS編• アクティブチェックを使う

• zabbix_agentd.conf 

→ ServerActive に 設定 (Server は パッシブ)

• amiでもchefでも

• 「アクション」-「自動登録」で「ホストの追加」

こんな感じ

ここまでは 全自動ZABBIXでも

やってる

全自動で削除 AWS編

AWSだと増えたり減ったり

ZABBIX Server

Node

Node Node Node

Node

Node Node

全自動で削除 AWS編• ディスカバリを使う

• 「ディスカバリ」-「ルールの作成」で アベイラビリティゾーン毎にIPアドレスの範囲を指定

• 「アクション」-「ディスカバリ」で「ディスカバリのステータス」が「Down」のとき「ホストの削除」

こんな感じ

そしてこんな感じ

問題が

• 登録しているIPアドレスの範囲を全部チェック

• Terminateしてから削除まで時間がかかる

• いつになったら削除されるか分からない

そこで

全自動で登録 Mk-II• 「アイテム」:インスタンスIDを取得

• → Zabbixエージェント:system.run[curl http://169.254.169.254/latest/meta-data/instance-id ]

• 「トリガー」:インスタンスIDがnot nullになったら

• →スクリプト実行:マクロのユーザ変数にinstance-id登録 (Zabbix APIで!)

• 各サーバのインスタンスIDがスクリプトで使える!

こんな感じ

そしてこう

さらにこう

そしてこうなる

全自動で登録 Mk-II• 「アイテム」:インスタンスIDを取得

• → Zabbixエージェント:system.run[curl http://169.254.169.254/latest/meta-data/instance-id ]

• 「トリガー」:インスタンスIDがnot nullになったら

• →カスタムスクリプト:マクロのユーザ変数にinstance-id登録 (Zabbix APIで!)

• 各サーバのインスタンスIDがスクリプトで使える!

なので

全自動で削除 改• 「アイテム」:インスタンスIDを使ってec2のステータスを取得

• →外部チェック:スクリプト実行(aws command line interfaceで)

• 「トリガー」:running -> terminated

• →スクリプト実行:ホスト削除(Zabbix APIで!)

• Terminateしたらすぐ消えた!

こんな感じ

ちなみに

スクリプトの実行結果を監視・ユーザパラメータ  Agent側で実行  zabbix_agentd.conf  →UserParameter=key[*],command !

・外部チェック  サーバ側で実行  zabbix_server.conf  →ExternalScripts=SCRIPT_PATH  →script[<parameter1>,<parameter2>,...]

スクリプトの中身

RESULT=`aws --output json ec2 describe-instances \ --instance-id ${INSTANCE_ID} | \ /usr/lib/zabbix/externalscripts/jq \ ".Reservations[0].Instances[0].${JSON_PATH}"`

AWS commandline interface を叩いて jsonをjqに食わせて、resultを取る

そしてこうなる

まだちょっと問題

• ec2のステータスが「terminated」を返す時間が短すぎる

• トリガーが起動しない場合も

結局• 「スクリプト」:ホスト削除スクリプトを登録

• →グローバルスクリプト

• →アラート発生時のオペレーションとしても実行できる

• 手動でも簡単に消せる!

こんな感じ

さらにこう

こんな風にも使える

ところで

Zabbixサーバって どんどん増えますよね。

複数ZabbixサーバZABBIX Server

ZABBIX Server ZABBIX Server

ZABBIX Server

分散&統合監視ZABBIX Server

ZABBIX Server ZABBIX Server

ZABBIX Server

Node Node Node Node

分散監視について

• プロキシ

• ノード → 2.4で廃止

Zabbixサーバの構成

ZABBIX Server

Web

DB

Server

Agent

全部別のサーバでもOK}

プロキシZABBIX Server

ZABBIX Server ZABBIX Server

ZABBIX Server

Node Node Node Node

Server Server

Server

Server DB

ノードZABBIX Server

ZABBIX Server ZABBIX Server

ZABBIX Server

Node Node Node Node

Server DB

Server

DB

Server

DB

Server

DB

設定が面倒くさい

廃止になるくらい

それぞれ独立ZABBIX Server

ZABBIX Server ZABBIX Server

ZABBIX Server

Node Node Node Node

変更を全部に反映するのが面倒くさい

ZABBIX API

わりと何でもできる

• マクロに登録

• ホストを削除

• テンプレートのexport/import

• てゆうか全部できる

Sample (Python)#!/usr/bin/env python !

zbxsv = "http://localhost/zabbix/api_jsonrpc.php" headers = {"Content-Type":"application/json-rpc"} !

argvs = sys.argv zbx_hostname = argvs[1] zbx_auth = argvs[2]

Sample (Python)### delete host ### json_str = { 'jsonrpc':'2.0', 'method':'host.delete', 'params':[{ 'hostid':zbx_hostid, }], 'auth':zbx_auth, 'id':1} ! API 認証キー

内部管理用ホストID

Sample (Python)### post request ### auth_post = json.dumps(json_str) request = urllib2.Request(zbxsv, auth_post, headers) contents = urllib2.urlopen(request) contents_str = contents.read() contens_dict = json.loads(contents_str) !

print contens_dict["result"]

Samplejson_str = { 'jsonrpc':'2.0', 'method':'script.create', 'params':{ "name":"delete terminated host", "command":"/usr/lib/zabbix/apiscripts/delete_host.py {HOST.NAME} " + zbx_auth , "host_access":"2", "usrgrpid":"0", "groupid":"0", "description":"", "confirmation":"", "type":"0", "execute_on":"1" }, 'auth':zbx_auth, 'id':1}

JenkinsのJOB

変更をJenkinsからJenkins

ZABBIX Server ZABBIX Server

ZABBIX Server

サーバ構築はChefで自動化済

サーバの構築時Jenkins

ZABBIX Server

Jenkins APIZabbix API

サーバ設定も自動化

サーバが増えても安心

スクリプトでの設定変更 Chefのレシピ作成中 (20%くらい)

全自動ZABBIX 完全版 乞うご期待