20140930 anything as_code

Preview:

DESCRIPTION

20140930 anything as_code

Citation preview

Anything(as(CodeGenki&Sugawara

お前誰よ• 弊社でインフラまわりやってます

• twi%er:)@sgwr_dts

• github/bitbicket:)winebarrel

アジェンダ• Roadworkerの話

• Ridgepoleの話

• Anything3as3Codeの話

Roadworkerの話

Roadworker

• github.com/winebarrel/roadworker

• Route53の管理ツール

• DSLでRoute53を定義する

• 冪等性を保証hosted_zone "winebarrel.jp." do rrset "winebarrel.jp.", "A" do ttl 300 resource_records( "127.0.0.1", "127.0.0.2" ) end

Demo

ワークフロー

DSLを修正

プルリク・レビュー

マージ・適用

Roadworker以前• ときは2013年

• R53(Foxというツールを使っていました

• github.com/cookpad/r53;fox

以前のワークフロー1. DNSの更新を宣言

2. R53*FoxでRoute53を変更

3. JSONにエクスポートしてgitで保存

問題点• 事前確認できない

• エクスポートを忘れると変更履歴が残らない

• 元の状態を復元しにくい(できなくはない)

オペミス発生• MXを消してメールが届かない

• 誰がいつ更新したのかよく分からない…

一方その頃…

• puppetlabsのリポジトリをあさっていました

• puppetlabs/puppetlabs+dns

Puppet的に管理するのもありかな?

Puppet/Chef?

• Chefもありました

• github.com/hw1cookbooks/route53

• どっちも文法が気に入らない

• じゃあ作るか→できた

知見• 設定ファイル化するとGitで管理できる

• GitHubのワークフローに乗せられる

• 管理が楽になる

いろいろ作った

Piculet

• github.com/winebarrel/piculet

• セキュリティグループの管理ツールec2 "vpc-XXXXXXXX" do security_group "default" do description "default VPC security group"

ingress do permission :tcp, 22..22 do ip_ranges( "0.0.0.0/0", ) end

Kelbim

• github.com/winebarrel/kelbim

• ELBの管理ツールec2 "vpc-XXXXXXXXX" do load_balancer "my-load-balancer", :internal => true do instances( "nyar", "yog" )

listeners do listener [:tcp, 80] => [:tcp, 80] listener [:https, 443] => [:http, 80] do

Radiosonde

• github.com/winebarrel/radiosonde

• CloudWatch7Alarmの管理ツールalarm "alarm1" do namespace "AWS/EC2" metric_name "CPUUtilization" dimensions "InstanceId"=>"i-XXXXXXXX" period 300 statistic :average threshold ">=", 50.0 evaluation_periods 1 actions_enabled true

Meteorlog

• github.com/winebarrel/meteorlog

• CloudWatch6Logsの管理ツールlog_group "/var/log/messages" do log_stream "my-stream"

metric_filter "MyAppAccessCount" do metric :name=>"EventCount", :namespace=>"YourNamespace", :value=>"1" end

metric_filter "MyAppAccessCount2" do

バカの一つ覚えなんですがCode化しておくといろいろ捗るので…

Ridgepoleの話

Ridgepole

• github.com/winebarrel/ridgepole

• DBスキーマの管理ツール

• Rails9DSLでスキーマを定義する

• 冪等性を保証

• dry9runできる

• 弊社ブログでバズったcreate_table "articles", force: true do |t| t.string "title" t.text "text" t.datetime "created_at" t.datetime "updated_at"end

Demo

作成の経緯• 別プロジェクトで死んでいた

• GW最終日「会社行きたくないでござる」

• 現実を忘れるためにコーディング

• できた

Rails&DSL• SQL::Translator→Perlメンテできない

• SQLのパース→絶対メンテできない

• RailsのDSLならよいかな…

DBまわりのワークフロー

開発環境のデータをできるだけ本番に近づけるtechlife.cookpad.com/entry/2014/10/03/110806

歴代のスキーマ管理ツール

一代目• Google'Spreadseat

• DDL・記入者・実施日

• DDLを記入して実行以来

• 「クエリを実行してください」「完了しました」

二代目• Webツール

• 基本はスプレッドシートと同じ

• DDL・作成者をポスト

• ボタンを押すとステージングに反映

• 本番への適用はインフラ作業

• AWS移行のどさくさで消滅

三代目• GitHub(Enterprise

• mysqldump+Rakeタスク

• ステージング環境からスキーマをエクスポート

• テーブル定義の差分+ALTER文のDDLをプルリク

• レビュー

• マージ後、RakeタスクでDDLを適用

三代目以前• 主要DBのテーブルが増え続けていた

• いらないテーブルも多かった

• スキーマの情報は$show create table

• ステージングと本番には乖離があった

三代目以後• (一応)GitHubのワークフローには乗せられた

• DDLは手書き…

• DDLのテストが微妙

• メタ情報を書きにくい

• 本番とステージングで別ファイル定義

なんかやだ

Ridgepoleの導入• できたので導入したかった"(現実逃避)

• Rails"DSLに置き換えただけだとメリットが少ない

• 「DDLのCIやるか」

DDL#CI

知見• スキーマ定義もGitで管理すると楽

• DDLのCI便利

• CloudForma1onはCIに使える

Anything(as(Codeの話

DSL管理のアイデア• Puppet・Chefのパクリ

• Puppet+GitHubによるインフラ管理がすごくよかった

• なんでもGitHubで管理しよう

仕組み1. APIで現在の状態を取得→Hashにする

2. DSLの定義をパース→Hashにする

3. Hash化された定義を比較

4.差分をAPIで実行(dry4runの場合はログ出力)

技術的にたいしたことはやってませんしかし…

応用範囲が広い• AWS全般

• LDAP等アカウント管理

• インフラ定義

• サービス定義

• ほにゃらら定義…

なにがなんでも!as!Code?

技術的な学びはすくないしかし、何でもコード化したくなる

モチベーションは「無駄をなくしたい」「労力!>!/dev/nul」の撲滅

Nothing(as(Code• 開発者「DNS変更してください」

• インフラ「わかりました」

• 開発者「ポート空けてください」

• インフラ「分かりました」

• 開発者「スキーマ変更してください」

• インフラ「(ry」

問題点• 権限を適切に分離できない

• 全員に強力な権限を与えるのも問題

• 開発者:#めんどくさい

• インフラ:#人間バッチ化・無駄なスリル

Code化+GitHub

• プルリクで手軽・明確に変更を依頼できる

• 明確な変更を適切にレビューできる

• 自動化により本番適用時の心労が減る

_人人人人人人人_> 突然の幸せ <‾Y^Y^Y^Y^Y^Y‾

まとめ• 便利ツール作ったのでどうぞご利用ください

• DSL管理ツール作るのは簡単です

• Anything,as,Codeで幸せになりましょう

ところでZabbixのDSL管理ツールだれかつくりませんか(泣

ご静聴ありがとうございました

Recommended