Upload
sugawara-genki
View
2.321
Download
1
Embed Size (px)
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管理ツールだれかつくりませんか(泣
ご静聴ありがとうございました