刺身タンポポを殲滅する consul template

38
Masahito Zembutsu @zembutsu Technology Evangelist; Creationline , Inc. Shinjuku Tokyo, Mar 25 2015 Tech-Circle #4 Consul Hands-on Lightning Talks session #techcircleja 刺身タンポポを殲滅する Consul Template Consul Template beat dandelions on Sashimi

Upload: masahito-zembutsu

Post on 15-Jul-2015

12.382 views

Category:

Technology


0 download

TRANSCRIPT

Masahito Zembutsu @zembutsu Technology Evangelist; Creationline , Inc. Shinjuku Tokyo, Mar 25 2015 Tech-Circle #4 Consul Hands-on Lightning Talks session #techcircleja

刺身タンポポを殲滅する Consul Template Consul Template beat dandelions on Sashimi

刺身タンポポを殲滅する Consul Template 2 / 38

今日の内容

• 刺身タンポポを駆逐する#とは? 動機:死ぬほど退屈な単純作業の繰り返しを、生まれる前に消し去りたい。

• Consul Templateとは?導入方法 gitからソースコードを取得、Go言語開発環境を用意するだけ。あとは別途Consulでクラスタを構成。

• Consul TemplateでMunin監視設定を自動化 動的に変わる環境を、無駄な手を掛けず、正確・迅速に監視したい。

Topics

A man is not finished when he is defeated. He is finished when he quits.

人間は負けたら終わりなのではない、やめたら終わりなのだ。

出典:タンポポとは (タンポポとは) [単語記事] - ニコニコ大百科

“ 近年インターネット上で、「誰にでもできる簡単な仕事」かつ「やりがいのない単調な仕事」を 表現する時に、もしくは「非常に過酷な仕事」を表現するネタとして、刺身の上にタンポポを 乗せる」という仕事がしばしば引き合いに出される。本当にそのような、タンポポを乗せる「だけ」 の仕事があり、その上きちんと給料が出るのかは不明。”

http://en.wikipedia.org/wiki/Taraxacum#/media/File:T_japonicum04.jpg Creative Commons License BY-SA 3.0

刺身タンポポを殲滅する Consul Template 5 / 38

刺身タンポポ的な手作業

• 苦痛 painful

• 時間を消費する time-consuming

• 退屈でつまらない tedious process

刺身タンポポを殲滅する Consul Template 6 / 38

現状整理

• 動的に変化するシステム基盤が当たり前 自動化や省力化を推進する、クラウド・コンピューティングの価値。もう普通に使える技術。

• 変化に応じて設定ファイルの書き換えが発生 例:監視設定ファイル、リバース・プロキシ設定、サーバ情報一覧の追加・削除が都度発生

• 変化に対応できないと、この先生きのこれないかも

例:銀行の窓口対応よりも、24時間稼働するATMを使うほうが正確で速く便利。

??「駆逐してやる!!」

刺身タンポポを殲滅する Consul Template 10 / 38

Consul Templateとは?

• サーバ内の定型作業を自動化 ➡ テンプレートを元に設定ファイルを自動更新

Consulサーバに問い合わせ、Consulノードやサービス・Key-Valueの変化をトリガとして、自動実行。

➡ ファイル更新時、コマンドを自動実行(オプション) 例:Apache・Nginx・HAProxy等々の再起動など、コマンドライン上での手作業を代替。

• 2014年10月公開・オープンソース HasihCorpによるツールとして開発・提供中 http://www.consul.io/downloads_tools.html

consul サーバ

• ホスト名1 • IPアドレス1 • サービス名1 • タグ1 • ヘルスチェック1

• ホスト名2 • IPアドレス2 • サービス名2 • タグ2 • ヘルスチェック2

• ホスト名N • IPアドレスN • サービス名N • タグN • ヘルスチェックN

consul ノード

• ホスト名1 • IPアドレス1 • サービス名1 • タグ1 • ヘルスチェック1

• ホスト名2 • IPアドレス2 • サービス名2 • タグ2 • ヘルスチェック2

• ホスト名N • IPアドレスN • サービス名N • タグN • ヘルスチェックN

kvs

consul サーバ consul ノード

コマンドラインで実行できる常駐プログラム。 Consul サーバの情報を参照する。

kvs

consul サーバ

テンプレートを元に新しい 設定ファイルを自動生成。 その後コマンドを実行も可 (オプション)。

• ホスト名1 • IPアドレス1 • サービス名1 • タグ1 • ヘルスチェック1

• ホスト名2 • IPアドレス2 • サービス名2 • タグ2 • ヘルスチェック2

• ホスト名N • IPアドレスN • サービス名N • タグN • ヘルスチェックN

consul ノード

刺身タンポポを殲滅する Consul Template 14 / 38

Consul Template セットアップ方法

• Golang 開発環境を用意 $ sudo yum -y install git golang $ export GOPATH=/usr/local/src/go $ git clone https://github.com/hashicorp/consul-template.git $ cd consul-templae $ make $ sudo cp ./bin/consul-template /usr/bin/ $ consul-template --version consul-template v0.7.1.dev

刺身タンポポを殲滅する Consul Template 15 / 38

使い方

• consul-template コマンドを実行

➡ -consul <Consulサーバ> • 実行するサーバで consul を稼働させる必要がない

➡ -template “テンプレート : 出力先 : 変更後実行コマンド” • 複数指定可能

$ consul-template ¥ -consul 127.0.0.1:8500 ¥ -template “nginx.ctmpl:/etc/nginx/sites-available/default:service nginx reload"

昨日、近所の吉野家行ったんです。吉野家。 そしたらなんか人がめちゃくちゃいっぱいで座れないんです。 で、よく見たらなんか垂れ幕下がってて、150円引き、とか書いてあるんです。 もうね、アホかと。馬鹿かと。 お前らな、150円引き如きで普段来てない吉野家に来てんじゃねーよ、ボケが。 150円だよ、150円。 なんか親子連れとかもいるし。一家4人で吉野家か。おめでてーな。 よーしパパ特盛頼んじゃうぞー、とか言ってるの。もう見てらんない。 お前らな、150円やるからその席空けろと。 吉野家ってのはな、もっと殺伐としてるべきなんだよ。 Uの字テーブルの向かいに座った奴といつ喧嘩が始まってもおかしくない、 刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。 で、やっと座れたかと思ったら、隣の奴が、大盛つゆだくで、とか言ってるんです。 そこでまたぶち切れですよ。 あのな、つゆだくなんてきょうび流行んねーんだよ。ボケが。 得意げな顔して何が、つゆだくで、だ。 お前は本当につゆだくを食いたいのかと問いたい。問い詰めたい。小1時間問い詰めたい。 お前、つゆだくって言いたいだけちゃうんかと。 吉野家通の俺から言わせてもらえば今、吉野家通の間での最新流行はやっぱり、 ねぎだく、これだね。 大盛りねぎだくギョク。これが通の頼み方。 ねぎだくってのはねぎが多めに入ってる。そん代わり肉が少なめ。これ。 で、それに大盛りギョク(玉子)。これ最強。 しかしこれを頼むと次から店員にマークされるという危険も伴う、諸刃の剣。 素人にはお薦め出来ない。 まあお前らド素人は、牛鮭【ぎゅうしゃけ】定食でも食ってなさいってこった。

昨日、近所のファーム行ったんです。ファーム。 そしたらなんかエージェントがめちゃくちゃいっぱいなんです。 で、よく見たらなんか垂れ幕下がってて、レジスタンス、とか書いてあるんです。 もうね、アホかと。馬鹿かと。 お前らな、証人如きで普段来てない緑のファームに来てんじゃねーよ、ボケが。 28日だよ、28日。 なんか親子連れとかもいるし。一家4人でイングレスか。おめでてーな。 よーしパパリンクアンプさしちゃうぞー、とか言ってるの。もう見てらんない。 嫁に夜のウ お前らな、28日に焼かせてやるから敵ファームでのFFは勘弁してと。 イングレスってのはな、もっと殺伐としてるべきなんだよ。 道路挟んで向かいに座った奴といつ喧嘩が始まってもおかしくない、 刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。 で、やっと帰ったかと思ったら、味方が、リンク引いてるんです。 そこでまたぶち切れですよ。 あのな、リンクなんてきょうび流行んねーんだよ。ボケが。 得意げな顔して何が、リンクで多重CFだ。 お前は本当にCFを作りたいのか作れるのかと問いたい。問い詰めたい。小1時間問い詰めた お前、多重って言いたいだけちゃうんかと。 CF通の俺から言わせてもらえば今、意識の高いエージェントの間での最新流行はやっぱり、 クソリンク、これだね。 リンクアンプ大盛りクソリンク。これが通のポータル作り。 クソリンクってのは浪漫が多めに入ってる。そん代わり実用性が少なめ。これ。 で、それに大盛りリングアンプ。これ最強。 しかしこれを引くと次から味方エージェントにマークされるという危険も伴う、諸刃の剣。 素人にはお薦め出来ない。 まあお前らド素人は、マルチハックでも刺してなさいってこった。 参考出典: https://plus.google.com/117608901077915926883/posts/9RsZbAzgAPV

汎用的コピペ用テンプレの例

刺身タンポポを殲滅する Consul Template 17 / 38

テンプレートの扱い方が重要

• テキスト形式のファイルに記述

• 繰り返しは {{range service}} ~ {{end}}

• 変数部を {{ }} で囲む • {{.Node}} … ホスト名

• {{.Address}} … IPアドレス

• {{.Port}} … ポート番号 他多数 https://github.com/hashicorp/consul-template

刺身タンポポを殲滅する Consul Template 18 / 38

例1 /etc/hosts {{range services}}# {{.Name}}{{range service .Name}} {{.Address}} {{.Node}}{{end}} {{end}}

# consul 192.168.39.3 consul-server # munin-node 192.168.39.11 node1.pocketstudio.net 192.168.39.12 node2.pocketstudio.net

刺身タンポポを殲滅する Consul Template 19 / 38

例2 ApacheのProxy <Proxy balancer://frontend>{{range service "frontend"}} BalancerMember http://{{.Address}}:{{.Port}}{{end}} </Proxy> ProxyPass / balancer://frontend

<Proxy balancer://frontend> BalancerMember http://192.168.39.11:80 BalancerMember http://192.168.39.12:80 </Proxy> ProxyPass / balancer://frontend

刺身タンポポを殲滅する Consul Template 20 / 38

例3 NginxのProxy upstream frontend { {{range service "web@sfo1"}} server {{.Address}}:{{.Port}};{{end}} } server { listen 80 default_server; location / { proxy_pass http://frontend; } }

upstream frontend { server 192.168.39.11:80; server 192.168.39.12:80; ...

刺身タンポポを殲滅する Consul Template 21 / 38

Consul Templateの便利な所

• 軽量なコマンドライン・ツールを実行するだけ ローカルに Consul サーバや Consul ノードを動作させる必要がない。同居も可能。

• ドライ・モードがあるので検証が楽 「-dry」オプションは、実際にファイルを書き出さず、コンソール画面で検証ができる。

• 豊富なメッセージ うまくいかない時の確認やデバッグもやりやすい

刺身タンポポを殲滅する Consul Template 22 / 38

これ、Serfとどう違うの?

• Serf でも出来ますが、Serf はスクリプトが必要 イベント・ハンドラを実行するスクリプトを自分で書かなくてはいけないので、手間になります。

• Consul は”サービス”や”正常性”をトリガにできる Serfでサービスの正常性をチェックするのは面倒ですが、Consulであれば比較的楽です。

• 可用性を考慮すると Consul Template が楽かも 障害のことや、現在の環境を複製する場合であれば、Serf より使い勝手良いのではないでしょうか。

で、

Muninにも使えるのでは…?

刺身タンポポを殲滅する Consul Template 26 / 38

Muninとは?

• サーバ上のリソース監視ツール 監視エージェントを通して複数台のサーバ上のリソースを取得し、RRDToolに保管・グラフ化する。

• “性能を潰しているのは何か?”を特定する CPU、メモリ、ディスクI/O、ネットワーク等やウェブサーバ・データベースの情報も時系列で視覚化。

• 設定やメンテナンスが比較的単純 yumやaptを使うだけで設定は完了し、主要なリソース推移グラフを自動的に作成。

刺身タンポポを殲滅する Consul Template 28 / 38

Muninで解決したい課題

• 動的に変化する監視対象の追加・削除自動化 監視対象の追加・削除は、Muninサーバ上で、都度設定ファイルを書き換える必要がある。多いと大変。

• 手作業による設定反映の遅延を回避したい アプリ担当は今すぐ監視をしたいのに、設定担当者が反映するまでのタイムラグが発生しがち。

• 手作業による設定ミスを回避したい しかし、設定ミスを防ぐための手順化やダブルチェックは、設定反映に更に時間を要し、面倒な仕事になりがち。

刺身タンポポを殲滅する Consul Template 29 / 38

実はSerf版は既に作っていた

• https://github.com/zembutsu/serf-munin

serf-muninでmunin-nodeの監視自動追加/削除 http://pocketstudio.jp/log3/2013/11/01/serf-munin-eventhander-auto-monitorin

刺身タンポポを殲滅する Consul Template 30 / 38

Munin + Consul Templateの利点

• 動的に監視設定の追加と削除を実現 ホスト名とIPアドレスの管理から解放。

• Muninの設定時間を短縮 ダブルチェックの回避や、担当者毎のスキルの違いをカバー。

• 正確な作業 手作業による設定ミスを回避。

kvs

consul サーバ

• ホスト名1 • IPアドレス1 • ポート番号1

• ホスト名2 • IPアドレス2 • ポート番号2

• ホスト名N • IPアドレスN • ポート番号N

consul ノード health check health check health check

consul サーバ

health check health check

192.168.39.3 192.168.39.11 192.168.39.12

$ sudo yum -y install unzip wget $ wget -O 0.5.0_linux_amd64.zip https://dl.bintray.com/mitchellh/consul/0.5.0_linux_amd64.zip $ unzip ./0.5.0_linux_amd64.zip $ sudo cp ./consul /usr/bin $ consul agent -node=web1 -dc=munin -bind=192.168.39.12 -data-dir=/opt/consul/data -join=192.168.39.3

consul セットアップ・サーバモードで起動

health check $ wgaet https://raw.githubusercontent.com/zembutsu/muninwalk/master/muninwalk.pl $ chmod 755 ./muninwalk.pl $ sudo mv muninwalk.pl /usr/bin/ $ muninwalk.pl localhost load localhost::load.load = 1.24

{ "service": { "name": "munin-node", "port": 4949, "check": { "script": "muninwalk.pl localhost load >/dev/null 2>&1", "interval": "5s" } } }

/opt/consul/conf/munin.json

ヘルスチェック用スクリプトの配置

Consulノード起動

$ consul agent -dc=munin ¥ -bind=192.168.39.12 ¥ -data-dir=/opt/consul/data ¥ -join=192.168.39.3 ¥ -config-dir=/opt/consul/conf

$ dig @127.0.0.1 -p 8600 munin-node.service.munin.consul munin-node.service.munin.consul. 0 IN A 192.168.39.11 munin-node.service.munin.consul. 0 IN A 192.168.39.12

192.168.39.3

## Updated by Consul Template: {{timestamp}} {{range service "munin-node" "any"}} [web;{{.Node}}] address {{.Address}} port {{.Port}} use_node_name yes {{end}}

/opt/consul/template/munin.ctmpl

$ consul-template ¥ -consul 127.0.0.1:8500 ¥ -template "/opt/consul/template/munin.ctmpl:/etc/munin/conf.d/consul.conf"

consul-templateの起動

/etc/munin/conf.d/consul.conf ## Updated by Consul Template: 2015-03-24T12:23:15Z [web;node1.pocketstudio.net] address 192.168.39.11 port 4949 use_node_name yes [web;node2.pocketstudio.net] address 192.168.39.12 port 4949 use_node_name yes

consulで”munin-node”サービスが検出されると 自動的に consul-template は、Munin向け設定 ファイル consul.conf を自動出力。 ※ munin-node 等の再起動は不要

192.168.39.3

## Updated by Consul Template: {{timestamp}} {{range service "munin-node" "any"}} [test;{{.Node}}] address {{.Address}} port {{.Port}} use_node_name yes {{end}}

/opt/consul/template/munin.ctmpl

$ consul-template ¥ -consul 127.0.0.1:8500 ¥ -template "/opt/consul/template/munin.ctmpl:/etc/munin/conf.d/consul.conf"

consul-templateの起動

/etc/munin/conf.d/consul.conf ## Updated by Consul Template: 2015-03-24T12:23:15Z [web;node1.pocketstudio.net] address 192.168.39.11 port 4949 use_node_name yes [web;node2.pocketstudio.net] address 192.168.39.12 port 4949 use_node_name yes

192.168.39.3

## Updated by Consul Template: {{timestamp}} {{range service "munin-node" "any"}} [test;{{.Node}}] address {{.Address}} port {{.Port}} use_node_name yes {{end}}

/opt/consul/template/munin.ctmpl

$ consul-template ¥ -consul 127.0.0.1:8500 ¥ -template "/opt/consul/template/munin.ctmpl:/etc/munin/conf.d/consul.conf"

consul-templateの起動

/etc/munin/conf.d/consul.conf ## Updated by Consul Template: 2015-03-24T12:23:15Z [test;node1.pocketstudio.net] address 192.168.39.11 port 4949 use_node_name yes [test;node2.pocketstudio.net] address 192.168.39.12 port 4949 use_node_name yes

このように自動的に追加されます。 • rangeからanyを削除すると、自動削除も可能。 • datacenter毎にtemplateを出力したり、 タグを応用して、グループ生成の自動化も出来そう。

Consul Template は刺身タンポポを殲滅する有用武器

Consul Template は定型作業の省力化に貢献

Muninのような監視ツールだけでなく、広く応用できる

まとめ

刺身タンポポを殲滅する Consul Template 38 / 38

参考資料

• Introducing Consul Template – HashiCorp ➡ https://hashicorp.com/blog/introducing-consul-template.html

• hashicorp/consul-template – GitHub ➡ https://github.com/hashicorp/consul-template

References