ほわいとぼーど

ぷろぐらまのメモ帳

Ansible入門を開催した話

だいぶ時間がたってしまいましたが、 7月1日にAnsible入門をハンズオン形式で 開催しました。
弊社ではエンジニア・デザイナー・ライター陣の取り組みとして 毎日何かしらの勉強会を開催 していてその一環ですが、 折角なので何かテーマを持って実施したいと思って、 『開発環境をAnsibleで作る』を目標として入れてみました。 インフラエンジニアがProvisioningとして使うだけでなく、 アプリケーションエンジニアも開発を補助する環境を Vagrant+Ansibleで作れるようになろう、という意味です。

実際にハンズオンに使った資料は以下にあります。

https://github.com/ki38sato/ansible-hands-on

ハンズオンと言っても大量の細かい設定をもつplaybookを その場で1から書くのは難しいので、 サンプルレシピを用意してその内容を説明しつつ手元のVagrantで実行してもらって 動作を体験してもらうという形にしました。 目標を達成できたかは微妙なのですが、Ansibleをある程度動かせる知識を 垣間見てもらうことは出来たのではないでしょうか。

当日は何故かその日に限ってVagrantfileに問題が起きていて、 ansibleをインストールするためのyum repoが読み取れない状態になって 講師の自分が環境を構築できず、バタバタしてしまいました。 最終的に@key_ambさんに助けていただきました。さすがすぎる。ありがとうございました。 1年くらいほぼ同じの使ってるのに初めて問題がこのタイミングで起きるのは 日ごろの行いのせいでしょうか。

当日喋るつもりだった内容の1/3も話せなかった気がしますが、 折角資料作ったのでブラッシュアップしつつまた開催したり、 あるいは次のステップ(more..と書いているがやってない部分の説明とか)も 計画できたらいいなぁと思っていますが、 根性がないタイプなのでどうなるかわかりません。

Mackerel Meetup #4 Tokyo で発表してきた話

5/26 (Tue.)にMackerel Meetup #4 Tokyo にて、自社サービスでMackerel導入して使っている話をしてきました。

www.slideshare.net

発表にいたるには色々と乗り越えなきゃならない壁があって、 自分なんかでいいのかとか、全然技術的な話がないとか、 台風とか、更には開発してるサービスが正式リリースの当日 みたいなのがあって追い込まれすぎた結果一周して開き直れました。

ただやっぱり不慣れな面は出るもので、画面解像度合わずに端切れてたり、 話すつもりの内容が飛んで発表時間が短くなったりご迷惑をおかけしました。 説明の少ない資料で当日うまく話せなかった部分もあるので少しだけ補足しておこうと思います。

Host metric: 60+ Role, 100+(host)相当

productionと検証、開発リソース全てを含んでいます。 インフラリソース(JenkinsとかKibanaとか)も含んでいます。 リリース日前後ということでサーバによっては統廃合ある関係で平常時よりも多かったりもします。 マイクロサービスアーキテクチャということで、台数のわりに種類が多いです。
そんな状況ですがMackerelのService&Role機能がフィットして運用上の負担を感じていません。 %で横断的に設定できるのでスケールしやすいです。

Service metric: 50+ Services

マルチサービスアーキテクチャで機能毎に分割してるので、 例えば、メインAPIにサブ機能が2つあったら、APIサーバが3つになります。 当然それぞれELBとRDSがつく構成である場合が多いです。 これだけなら、Serviceを3つ作ってやればServiceは増えちゃうけど一応回る。 しかし、

  • メインAPIは外部に公開されると共に内部の別のサーバからも叩かれる=>ELB複数
  • RDSを別サーバからも見たい=>リードレプリカでRDS複数

とかで、溢れたELBやRDSを単独で収容するServiceが出来たりします。 それにそもそも3つのAPIが同じような機能グループだったら1つのServiceRoleとして同居したい、という風に思ったりもします。(好みはあると思いますが)

またService metricはHost metricと違って1項目毎に監視が独立してるので、 RDSx3台x3項目+ELBx3台x1項目を設定しなければなりませんし、 こちらは%設定じゃないのでそれぞれの閾値を値で設定する必要があります。 監視登録APIが出来ればあるいは解決する話かもしれませんが、例えば

  • 共通ルールを作って割り当てれる
  • MaxとCurrentを指定して%チェックルール作れたり

とか、妄想してます。(これは伝え忘れた、、、)
やはりhost metricと同種の便利さをService metricにも期待したい。
複数のELBやRDSを1つのServiceRoleっぽく紐付けて、、、

と、色々尽きないので大変だとは思いますが素敵なソリューションを期待します。

mkr + cron

発表では触れ忘れましたがmkr + cronは少しだけ課題があって、 mackerel-agent同様に1分間隔でmetric送信を実施していて、 ELB/RDSが増えるにしたがってTIME_WAITが溜まるようになったので注意が必要です。 cronでこの量を毎分起動するのはイマイチだなぁとも思っているので、 何かスケジューラーを入れるか、あるいはmackerel-agentがservice metricも キックできてその辺の問題も勝手にクリアされればと思っていたりします。

Notification

通知を課題にあげようとしたら発表されてた。改良早い。Mackerelサイコー

運用コスト

自分が最初に楽をしたいと思ったのは監視サーバ自体の運用の部分で、 プラスでSlack連携やスマホ対応がついてきて総合的にも便利という話。

mackerelの導入についての関心

コミュ障ながらも懇親会で何人かの方とお話させてもらった話題の中に、 Saasなだけに導入の説得をどうするか、という関心はけっこうあったみたいです。 自分としても「ゆるふわ運用でも楽で便利」みたいな線は狙ってはいたのですが、 試した後で導入に漕ぎ付ける部分では期待には応えれてない。 それでも今後も便利さは加速すると思うので機会があれば是非。

まとめ

発表者特典で色んな人に声かけてもらえましたが話せなかった人も多くて、 後で名刺交換のつもりが時間切れになってしまっていたりとか。 songmuさん、腰低すぎ。鯖T、リクエストすれば良かった。言いたいことがまとまらないのでこの辺りで。 めったにない機会だったので色々思い残すこともあったのですが、無事済んで良かったという思いで一杯です。 (WBS放映は普段よりアクセス来ましたが想定内で事なきを得ました。)

はてなさん、フリークアウトさん、参加者の皆さん、ありがとうございました。お疲れ様でした。

rootでjstatできなかった話(Jdk8u40)

※この話は時限的なものなので注意が必要です。

sudo jstat が実行できずにハマりました。
sudo jpsを実施するとprocess information unavailableと表示されます。
最初はjdk 8u40で遭遇したのですが、jdk 8u31以降のようです。
java実行ユーザでは実行できます。

実行ユーザ以外はrootでも実行できなくする仕様変更か?とか疑いましたが、調べた所、Issueっぽいのを見つけました。
https://bugs.launchpad.net/ubuntu/+source/openjdk-6/+bug/1417962
https://bugs.openjdk.java.net/browse/JDK-8073858?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab
jdk 8u60でも直ってない?

Java8に上げたらmackerel-plugin-jvmの結果がとれてなさそうだったので調べた所、mackerel-plugin-jvmの内部で使用しているjps, jstatに問題を発見したという流れです。
現在はmackerelのconfigで

[plugin.metrics.jvm]
command = "sudo -u 実行ユーザ /path/to/mackerel-plugin-jvm ..."

みたいにして回避しています。

(5/2追記) プログラムでsudoするにはttyの設定も必要です。

Ansible1.9+centos6.5でAlternativesが動かなくてハマッた話

※この話は時限的なものなので注意が必要です。
※自分が把握してるのはcentos 6.5 + ansible 1.9.0.1-2.el6の話です。
※(4/30追記)Ansible1.9.1が4/28にリリースされcentos6.5でもAlternativesモジュールが動作しました。

2015/03/25にAnsible 1.9 がリリースされて結構なアップデートが入り、
AWS関係で利用したいものが結構あったので手元で試してみました。
その結果、たまたまJDKを入れる際に使っているAlternativesモジュールが動かない問題にあたりました。

原因は、今まで対応されてなかったcentos(RHEL)の処理がcentos7相当のupdate-alternativesのoptionを用いて実装された結果、該当optionの存在しないcentos6以前で失敗するようになった、らしいです。
それ以前はcentos対応無かったけどelseでうまいこと動いていたというものらしい。

(参考: Ansible Extraとalternativesモジュールの話 | Ansible Advent Calendar2014 <= 後半部)
(参考: Fix multiple issues with alternatives module #313)

既にこの件についてはパッチが出ているので、取り込まれるまで静観しよう、
と3月の時点でなって一旦忘れておりました。

ところがつい先週、同僚氏から
「なんかアプリのvagrantが失敗するようになってしまいました。」
と言われてこの問題が再燃するわけです。

アプリのvagrantは、とあるプロジェクト専用のローカル開発環境用に用意したVagrantfileのことで、
vagrant up時にansibleをguest box内にインストールしレシピを流して環境を作っています。
こうすることで各人の環境依存が減ったり、個人のインストール作業の手間が減りますし、
Vagrantfileはプロジェクトのレポジトリに入れてあるので、 アプリ依存の変更内容も、該当プルリクを教えてもらうことで、 setup用のレシピにフィードバックできたりもしています。

という代物だったのですが、ansibleはprovision時にyum*1*2で入れていたので
そのタイミングで上記の問題が急に発生するようになったのでした。
setup用に使用している1.8.4では発生してなかったので1.8.4のrpmを探したのですが見つからなかったので、 Ansibleインストール後に上記のGithubのファイルを上書きする強硬手段で解決しました。
setup用のAnsibleもこの方法でバージョン上げてしまうか悩んでいるのですが、 入れてもすぐにアップデート分を採用するレシピを書く余裕がないので素直に待ちでしょうか・・・

*1: setup用の方はpipで入れてます。

*2: もしかしたらローカルインストール用はyumで入れないとyumモジュール実行時にこけるかも ?

2014年振り返り

2014年振り返り

今年は色々とタフな1年でした。

7月にSIerからIT事業会社に転職しました。
元々はJava屋でしたが、今はインフラ担当的なところをやってます。
DevOpsっぽい立ち居地でいければいいかなと。
新鮮な気持ちで色々挑戦してます。

あとは転職後すぐに母が亡くなって親孝行もしきれないままという想いが強いですが、
今の会社で頑張ることで恩返ししたい気持ち。

今年初挑戦したこと
- Scala/play
- AWS operation
- Ansible
- sensu/graphite/influxdb/grafana
- mackerel/newrelic
- kibana4

今年買った本 - ハイパフォーマンスブラウザネットワーキング
- 検索エンジン自作入門
- Chef実践入門
- Chef活用ガイド
- Team Geak
- インフラデザインパターン
- マスタリングTCP/IP入門編
- 実践Vagrant
- すごいErlang ゆかいに学ぼう!
- エンジニアのためのデータ可視化実践入門
- Rubyによるクローラー開発技法
- ElasticSearch Server
- GitHub実践入門
- Java逆引きレシピ
- Scala逆引きレシピ
- 入門Ansible
- WEB+DB PRESSや養成読本等

全然読めてなry
転職後ChefからAnsibleに環境が変わったのでChef本2冊がだいぶ浮いてる。
Scalaの環境になったので逆引きレシピ様様でしたがコップ本にいく前にインフラ担当に、、、

今年参加した勉強会
- 1/29 asakusa framework勉強会
- 2/7 elasticsearch勉強会
- 3/5 自作サーバ同窓会
- 3/7 歌舞伎座tech #3 Erlang/OTP
- 3/17 sonic garden study RubyMine
- 4/7 JVM Operation Casual Talks
- 4/21 elasticsearch勉強会 #4
- 5/14 gree tech talk #05 平行/並列プログラミング
- 6/3 WebRTC Meetup Tokyo #2
- 6/24 sonic garden study
- 7/14 elasticsearch勉強会 #5
- 7/20 hbstudy #60 Serf Consul
- 8/29 MQTT Meetup Tokyo
- 9/16 elasticsearch勉強会 #6
- 9/22 Ansible meetup
- 9/24 gree tech talk #06 Go
- 10/31 AWS casual talk #03
- 11/18 elasticsearch勉強会 #7
- 12/10 ISUCON Maker Casual Talks

毎月何かしら参加。
社内勉強会もあるので今後は頻度減るかもしれませんが、継続していきたいと思います。
しかし人見知りなので特に社外に知り合いも増えてないのが残念なところ。

新環境になって色々やってるものの全然アウトプットできてないのも残念。
2015年はもっとアウトプットできるようにと思ってます。
振り返りってよりメモっぽいけど細かいこと考え出すとキリ無いのでこの辺で終了。

Windows環境のVagrantでsynced_folder時にpermission設定する話

最近、Ansibleを使い始めていてその時に起きた問題。

自分は例のごとくWindows環境なのでChefとかのレシピはWindows上でEditorで書いて、
実行はVagrantで立てたVM内にsynced_folderでレシピのレポジトリを同期して
VMからVMに対してknife-soloとかしていました。

当然、Ansibleでも同様の方法でやろうとしたのですが、
特に設定しないとsynced_folderで同期したフォルダ内のファイル権限が0777になっていて、
Ansibleはhostsとして指定されたファイルに実行権限が付いていると怒られる。

ERROR: The file hosts is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x hosts`.

Dynamic Inventoryとして判定してるのにDynamic Inventoryとして有効じゃない!みたいなことらしい。
もちろん、Dynamic Inventoryの要件を満たしていれば問題ないのだけれど、ここで指定しているのは通常のhosts形式

これはAnsibleの問題というよりVagrantのsynced_folderの問題なので、
Tweetで憂さ晴らしせずにさっさとググッたらすぐ解決するという話。

以下のように指定する。

guest.vm.synced_folder "ansible-repo", "/vagrant", :mount_options => ["dmode=777","fmode=666"]

これでhostsファイルの権限が0666になったので問題なく実行できるようになった。
試してないけど他にowner/groupも指定できるようである。

そういやAnsible meetup tokyo参加報告書いてないなと思いつつ、そっとじ

fluent-plugin-multimapぽいのを書いた話

fluentd-plugin-dstat_stdinぽいのを書いた話に引き続きfluentdオレオレplugin第2弾
fluent-plugin-mapのmultiにフォーカスしたconfigurationを提供するfluent-plugin-multimapを書きました。

何を解決したかったか

dstatをkibanaで可視化+3.0.0milestone5新機能でも説明しているのですが、
Kianaでの可視化のためにfluentd-plugin-mapを使って、1レコードを複数レコードに分割します。
具体的には、

timestamp hostname:host a:1 b:2 c:3
↓
timestamp hostname:host stat:a value:1
timestamp hostname:host stat:b value:2
timestamp hostname:host stat:c value:3

という変換を行います。
そのための設定は例えば以下のようになります。

<match dstat.*>
  type copy
  <store>
    type map
    tag  "map.dstat.a"
    time time
    record {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.b"
    time time
    record {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.c"
    time time
    record {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}
  </store>
</match>

上記はパラメータが3つだから良いものの実際には縦に長くなって大変です。

もしくは、次のような記述も可能です。

<match dstat.*>
  type map
  map [["map.dstat.a", time, {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}], ["map.dstat.b", time, {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}], ["map.dstat.c", time, {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}]]
  multi true
</match>

縦にはかなり短くなりましたが、代わりに横に長くなってしまいました。
適切な位置で改行がないと見通しが悪くて死んでしまいます。
じゃぁ、どうなれば良いのか

解決策

こんな感じに書きたい。

<match dstat.*>
  type map
  format multimap
  mmap1 ["map.dstat.a", time, {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}]
  mmap2 ["map.dstat.b", time, {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}]
  mmap3 ["map.dstat.c", time, {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}]
</match>

繰り返しがまとめて縦に並ぶので修正もやりやすくなるのではと思います。
1...Nな形式はin_tailのformat multilineからお借りしました。

元記事がkazeburoさんに参照されたこともあって早々にどうにかしたかったのですが、
忙しかったり記事の環境を使わなくなってしまったりとなんだかんだで数ヶ月。

実際には書き方追加以外にも色々やってて、
formatが明示的じゃないとわかりにくいので指定できるようにしたり、
そのための新しい形式名称はどうしようとか、後方互換性はどうしようとかで悩んだり、
multilineは上限20個だったけど自分のdstatは36個くらい出力してたので50くらいにしようだとか、
emitの所が場合分けされてるけどconfigure側で吸収するようにリファクタしたりだとか、
そんな感じで適当に書いてmap本家にpullReq出しました。

しかし色々詰め込みすぎて正直pullReqマージしづらいだろうなという気もしています。
そんなわけで新しいformatにのみ切り出したものを作ってみた。

Kibana4で複数パラメータの同時表示が可能になる予定らしいので、
そうなったら分割する必要は無くなるかもしれません。
ただその場合はmappingをパラメータ種類分書く必要が出るので面倒なんですけどね。
時代は数値変換か?!