itamaeに入門してDocker調理してみた

2,052 views

Published on

とっとるびー19回で発表しました
itamae+Dockerを触ってみたのでその紹介になります

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,052
On SlideShare
0
From Embeds
0
Number of Embeds
626
Actions
Shares
0
Downloads
3
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

itamaeに入門してDocker調理してみた

  1. 1. 自己紹介 •石橋 直樹 ( paty_fakename @ twitter ) •Rubyを真面目に触り始めて7年ぐらい? •認定資格のSilverとGold v2.1は取ったけどほぼ忘れた •お仕事ではAWSとかjenkinsとかcapistranoとか利用 •最近はCTFの大会に参加する頻度増加中 •はてブロやQiitaやってます 2015/7/25とっとるびー19回 2/ 47
  2. 2. 最近思うこと とっとるびー濃ゆい ※悪くないです 2015/7/25とっとるびー19回 3/ 47
  3. 3. 最近思うこと Ruby比率低い(笑) ※嫌いじゃありません 2015/7/25とっとるびー19回 4/ 47
  4. 4. 最近思うこと たまには軽めのRuby ネタもいいじゃないですか ※予防線 2015/7/25とっとるびー19回 5/ 47
  5. 5. 最近思うこと てことで軽めの Rubyネタいっくよー 2015/7/25とっとるびー19回 6/ 47
  6. 6. 本日の発表 •itamae使ってみた •itamaeでDockerを調理してみた 2015/7/25とっとるびー19回 7/ 47
  7. 7. 本日の発表で使った環境 •CentOS 7.1.1503 •Ruby 2.2.1p85 •itamae 1.4.0 •Docker 1.6.2 2015/7/25とっとるびー19回 8/ 47
  8. 8. itamae使ってみた 2015/7/25とっとるびー19回 9/ 47
  9. 9. itamaeとは? •クックパッドの中の人謹製のプロビジョニングツール •RubyDSLで書ける •元はlight-chefとして作られていたが公開に合わせてitamaeに改名? •書き方はchefと同じ 2015/7/25とっとるびー19回 10/ 47
  10. 10. itamaeの特徴 •chefの複雑な機能とかディレクトリ構造を簡略化したものなイメージ •chefを触ったことがある人なら簡単に使える •学習コストが低い •CLI部分はThorで実装、各バックエンドへのコマンド実行はspecinfra •gemの中身が読みやすい 2015/7/25とっとるびー19回 11/ 47
  11. 11. 実際に使ってみる 2015/7/25 $ mkdir itamaesan && cd itamaesan $ echo "source 'https://rubygems.org'" > Gemfile $ echo "gem 'itamae'" >> Gemfile $ echo "package 'httpd'" > sample.rb $ bundle install $ rvmsudo bundle exec itamae local sample.rb とっとるびー19回 12/ 47
  12. 12. 実行コマンド •itamae [バックエンド] [レシピファイル] [オプション] 2015/7/25とっとるびー19回 13/ 47
  13. 13. バックエンド •local ローカルホストで実行 •ssh 指定されたホストにssh接続して実行 •docker ローカルにDockerコンテナを起動して実行 2015/7/25とっとるびー19回 14/ 47
  14. 14. オプション •-j, [ --node-json=NODE_JSON ] •-y, [ --node-yaml=NODE_YAML ] •-n, [ --dry-run ] •-l, [ --log-level ] <= 個人的に -l debug をよく使う •sshの場合はさらにssh系のオプションが増える ※proxy未対応ぽい 2015/7/25とっとるびー19回 15/ 47
  15. 15. レシピ • 基本的な書き方 2015/7/25 リソース “対象パス” do アトリビュート end •リソース •バックエンドで何を操作するのか ファイル操作、コマンド実行 etc •多くのリソースがブロックの省略可 とっとるびー19回 16/ 47
  16. 16. レシピ - リソース(14種類) •directory •ディレクトリの作成削除 •user, group, link •ユーザ、グループ、シンボリックリンク作成 •remote_file, remote_directory •sourceで指定したディレクトリ、ファイルをバックエンドに転送 2015/7/25とっとるびー19回 17/ 47
  17. 17. レシピ - リソース(14種類) •file •ファイルの作成削除、それと編集も可能 2015/7/25 file “/path/to/dest” do action :edit block do |content| content.gsub!(“Hello World”, “Hello itamae”) end end とっとるびー19回 18/ 47
  18. 18. レシピ - リソース(14種類) •service •サービスの起動やデフォルト起動設定を変更 •package •パッケージのインストール •gem_package •gemのインストール、アンインストール 2015/7/25とっとるびー19回 19/ 47
  19. 19. レシピ - リソース(14種類) •git •指定リポジトリをclone, fetch •local_ruby_block •ローカルホスト(≠バックエンド)でrubyを実行 2015/7/25とっとるびー19回 20/ 47
  20. 20. レシピ - リソース(14種類) •template •sourceで指定したerbファイルを実行して配置する •variablesでパラメータをerbに渡せる 2015/7/25 template “/path/to/dest” do action :create source “template.erb” variables(key: value) end とっとるびー19回 21/ 47
  21. 21. レシピ - リソース(14種類) •execute •コマンドを直接実行 •ぶっちゃけこれさえあればry 2015/7/25とっとるびー19回 22/ 47 execute “command description” do action :run command <<-EOC touch /path/to/dest echo “Hello itamae” EOC not_if “test -e /path/to/dest” end
  22. 22. 使ってみた感想 •なんとなく書き始められてとにかく手軽 •ディレクトリ構成に縛られない •knife solo initで用途不明のディレクトリ多数とかにならない •まんまchefなので、chefを触ったことあれば乗り換えは簡単: 2015/7/25とっとるびー19回 23/ 47
  23. 23. つまり •どんなディレクトリ構成にしようと •長大なレシピを作ろうと •環境ごとにレシピを作って全然dryじゃなくなろうと 2015/7/25とっとるびー19回 24/ 47
  24. 24. 2015/7/25とっとるびー19回 25/ 47 自由だ~!!
  25. 25. それはヤバイので •ベストプラクティス見ましょう •https://github.com/itamae-kitchen/itamae/wiki/Best-Practice •ディレクトリ構成のお勧めとか書いてある •remote_file, template リソースはベストプラクティスに沿ってディレクトリを探す • source未指定時のデフォルト動作 2015/7/25とっとるびー19回 26/ 47
  26. 26. それはヤバイので •レシピは適切に分割しましょう •include_recipe “” でレシピのインクルードが可能 •roleディレクトリを作ってロールごとのレシピを書く •ロールごとのレシピでinclude_recipeをして必要なレシピを組み合わせる 2015/7/25とっとるびー19回 27/ 47
  27. 27. それはヤバイので •パラメータはnodeディレクトリ以下に別ファイルで置く •-y でYAMLファイルが読み込める •-j でjsonファイルが読み込める •レシピ中では node[] でアクセス可能 2015/7/25とっとるびー19回 28/ 47
  28. 28. それはヤバイので •公開されてるレシピやリソースのプラグインを取ってきて拡張できる •chefでいうところのberkshelfに相当するのかな •itamae-plugin-(recipe | resource)-name の命名規則でgemとして公開されてる •Gemfileに追記するだけで使えるので管理が楽 2015/7/25とっとるびー19回 29/ 47
  29. 29. 改めて感想 •色々やりだすと結局chefに行きつく感じ •必要に応じて自分で拡張するので、chefよりやりやすいけど •ssh接続は大規模サーバ相手には向かない •やるならレシピだけばらまいて各サーバでlocal実行なのかな •必要なドキュメントはあるし、gemも読みやすいので好き 2015/7/25とっとるびー19回 30/ 47
  30. 30. itamaeで Dockerを調理してみた 2015/7/25とっとるびー19回 31/ 47
  31. 31. ・・・けど あまり面白くなかった 2015/7/25とっとるびー19回 32/ 47
  32. 32. なのでここからは ボリューム少な目 2015/7/25とっとるびー19回 33/ 47
  33. 33. Docker紹介 •割愛 •「Docker とは」 で検索検索 2015/7/25とっとるびー19回 34/ 47
  34. 34. 準備 •dockerインストール •docker起動 •gemインストール 2015/7/25 $ sudo yum install -y docker $ sudo systemctl start docker $ echo “gem ‘docker-api’” >> Gemfile && bundle install とっとるびー19回 35/ 47
  35. 35. 実行 •--image でベースイメージを指定 •ローカルになければdockerhubから探して取ってきてくれる •--container で稼働中のコンテナを指定することも可能 •一部のリソースが使えなかったりする •正常終了したらイメージを保存 2015/7/25 $ rvmsudo bundle exec itamae docker sample.rb --image=centos:centos6 とっとるびー19回 36/ 47
  36. 36. 実行 •イメージを保存・・・ 2015/7/25 $ rvmsudo bundle exec itamae docker sample.rb --image=centos:centos6 INFO : Image created: 505909ab50e007ae6e3acccb3c42615596746c6ee27a92bdd0a85ebb407f3f82 $ rvmsudo bundle exec itamae docker sample.rb --image=centos:centos6 INFO : Image created: 5a7254319e953337a8f761430eab199ab5b3472e8004395592107918a9f5a676 とっとるびー19回 37/ 47
  37. 37. 毎回別イメージ?!
  38. 38. 実行 •稼働中のコンテナを指定して実行した場合も終了時にイメージ作成 •もちろん毎回別イメージ •当然だけどコンテナ自身にも変更は入ってる 2015/7/25とっとるびー19回 39/ 47
  39. 39. リソース制限 •remote_file, templateリソースは稼働中のコンテナに対しては使えない •イメージ指定の場合のみ可能っぽい 2015/7/25 $ rvmsudo bundle exec itamae docker sample2.rb --container=9bb511969645 INFO : Starting Itamae... INFO : Recipe: /home/paty/itamaesan/hoge.rb /home/paty/.rvm/gems/ruby-2.2.1/gems/specinfra- 2.38.1/lib/specinfra/backend/docker.rb:44:in `send_file': Cannot call send_file without docker_image. (RuntimeError) とっとるびー19回 40/ 47
  40. 40. ぷちハマり •package リソースでdocker-apiがタイムアウトする •centのデフォルトイメージだとyumのdb初期化とかが走るせい •一度yumを起動した後のイメージなら問題ない 2015/7/25 $ rvmsudo bundle exec itamae docker sample2.rb --image=centos:centos6 INFO : package[httpd] installed will change from 'false' to 'true' `rescue in request': read timeout reached (Docker::Error::TimeoutError) とっとるびー19回 41/ 47
  41. 41. ぷちハマり •remote_directoryが失敗する •/tmp/itamae_tmp/xxx に一度配置して、その後の移動で失敗 •深く追ってないので原因不明。itamaeのソースとしては変なとこなかった 2015/7/25とっとるびー19回 42/ 47 $ rvmsudo bundle exec itamae docker sample3.rb --image=centos:centos6 ERROR : stderr | mv: cannot stat `/tmp/itamae_tmp/1437701394.3366778': No such file or directory ERROR : Command `mv /tmp/itamae_tmp/1437701394.3366778 /tmp/test` failed. (exit status: 1) ERROR : remote_directory[/tmp/test] Failed.
  42. 42. 感想 •itamae! Docker! の勢いで行ったけどそこまで面白くなかった •Dockerfileと比較して、毎回別イメージだったりキャッシュないのがつらい •ベースになるイメージを予め作っておいて、そこに対して実行するのが正解か •けどcentosはそのままだとタイムアウトするから・・・ •ベースイメージはDockerfileで作って、レシピでdocker buildしちゃうか •ssh開けてイメージ起動、itamae sshすればいいわけですねわかりますん 2015/7/25とっとるびー19回 43/ 47
  43. 43. まとめ •itamae •chefを軽く使えるようにしたもの •構文はchefそのまま、ディレクトリ構造に縛られない、gem読みやすい •バックエンドやリソースの拡張gemが公開されてる •itamaeはとっつきやすい •好きにやれるけど、ベストプラクティスは読んどいた方がいい 2015/7/25とっとるびー19回 44/ 47
  44. 44. まとめ •Dockerを調理するにはいまひとつ •DockerfileのRubyDSL版だ!と思ってると苦労する •コンテナを対象にした場合は一部のリソースが使えない •途中のイメージキャッシュなし。終了時は毎回別イメージ保存 •ベースになるイメージを作っておいて、そこから調理するのがよい 2015/7/25とっとるびー19回 45/ 47
  45. 45. 2015/7/25 enjoy itamae ! ╭( ・ㅂ・)‫و‬ とっとるびー19回 46/ 47

×