クラウド上でのChef活用と ベストプラクティス v0.2.0

4,766 views

Published on

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

No Downloads
Views
Total views
4,766
On SlideShare
0
From Embeds
0
Number of Embeds
914
Actions
Shares
0
Downloads
47
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

クラウド上でのChef活用と ベストプラクティス v0.2.0

  1. 1. クラウド上でのChef活用と ベストプラクティス 2013年7月23日 ニフティクラウド meet-up! #ncmeetup ソリューション事業部 第一開発部 株式会社エスキュービズム 赤間 慧 Satoshi Akama
  2. 2. 自己紹介 タブレットPOS ECサイト構築 たまに iPadアプリ開発 サーバサイド開発 サーバ構築・管理 company me 最近はフルスタックエンジニアに片足突っ込んでいます 基本的にdev側の人間です Chef CMS開発 Cassandraベースの 解析ツール サーバ構築・管理 etc 赤間 慧 Satoshi Akama https://github.com/sakama
  3. 3. Chefの基本 弊社での実際のシステム構築時のChef活用方法 Chefのベストプラクティス service do end action [:enable, :start] service do end action [:enable, :start] 今後Chefサーバ等の運用で実現したいことservice do end action [:enable, :start] service do end action [:enable, :start] 本日のrecipe
  4. 4. Chefの基本
  5. 5. Chefとは Configuration Management Framework サーバセットアップの自動化を実現するためのFramework IaaS OpenStack Puppet Chef Capistrano Fabric クラウド or VM立ち上げ OS インストール System Configuration <OSやミドルウェアの設定・構成管理> 2013.07.14開催July Tech Festa 2013でのGosuke Miyashitaさんの資料で紹介されていた 「Provisioning Tool chain by Lee Thompson at Velocity 2010」による 日本語訳の責は私にあります。直訳だと全て「設定」「管理」のようになるので翻訳が難しい http://www.slideshare.net/mizzy/serverspec-jtf2013 Application Service Orchestration <デプロイ等> Bootstrapping <初期セットアップ> Configuration Orchestration
  6. 6. Chefとは 2 RubyのDSLで記述 package "apache2" do action :install end Infrastructure as Code サーバ構築手順書を元にした手動セットアップ スクリプトやファイルの記述を元にセットアップを行う = プログラマブルなInfrastructure = 特定のタスク向けに設計された言語 DSL(Domain-Specific Language) 汎用プログラミング言語 = C、Java...etc 汎用モデリング言語 = UML...etc
  7. 7. Chefの最大の特徴 冪等性 べき とう せい ある操作を1回行っても複数回行っても結果が同じであることをいう概念 がChefによってある程度担保される (使用するResource、recipeの記述による)
  8. 8. Chefの動作の仕組み cookbooks Apache cookbook Postfix cookbook recipes Ruby cookbook cookbookを元にChefが自動でサーバを設定する サーバ群 recipes recipes
  9. 9. Chef Family 1 Hosted Chef Private Chef Opscodeがホスティングする Firewall内で稼働する http://www.opscode.com/hosted-chef/ この2つは国内で採用した話を聞きませんが... Facebook等で採用事例 私も詳しくは知りませんm(_ _)m
  10. 10. Chef Family 2 Chef Server/Client(管理対象数十台over) Chef Solo(管理対象数台∼頑張れば数十台) Chef ServerとChef ClientからなるClient/Serverモデル Chefを単体で動作させるもの。最初はこちらで十分 Chef Serverを使っているようなケースでもテスト中はこちらを使ったり Chef Server / Chef Server Web UI / Couch DB / Rabbit MQ / Chef Solr 構成要素がかなりFat インストールは最近は楽 ネットで検索するとChef Severのインストール難しいというような ブログが数多く出てきますが、最近はインストーラで一発です ただし、運用はまた別の話 実質この2択になるのでは? + + + 情報がChef Server 10.xのもので古かったです 懇親会でご指摘を頂いたのですが Chef Server 11.xはコアエンジンがRubyからErlangに、 Couch DBからPostgreSQLになっているそうです。 手元で試したらフロントもnginxになっていた...
  11. 11. omnibus インストーラ omnibusインストーラ Opscodeより提供されているインストーラ。 Chef Serverからの実行時等様々な場所で使われています OS/ディストリビューションを判断してChefをインストール。 独自パスでRubyも入るのでこれだけでChefを使う準備が整う curl -k -L https://www.opscode.com/chef/install.sh ¦ bash Rubyの実行パス→/opt/chef/embedded/bin/ruby gemのインストール→/opt/以下になる 逆に言うとアプリでRubyが必要な場合等は別途インストールが必要 システムを汚しにくい ※Chef関連のコマンドが/usr/bin/以下にシンボリックリンクとして貼られる
  12. 12. cookbook Chefでセットアップを行うための設定のまとまり。ミドルウェア単位が多い cookbooks attributes definitions files recipes 属性を管理 例) ApacheのMaxClientsの値 レシピで使う共通関数等 サーバ上に配置したいファイル等 例) git cloneする際のデプロイキー Cookbookの動作を決める一番よく触る部分 Apache cookbook Postfix cookbook recipes Ruby cookbook recipes recipes templates erb形式のテンプレートファイル。 値をassignして使用する 例) httpd.conf.erb
  13. 13. Recipe 様々なResourceが各種処理を担当する template directory service Resource package "apache2" do action :install end package Resourceや記述によっては冪等性が損なわれる パッケージのインストール、アップグレードなど erb形式のテンプレートを元にファイルを設置 ディレクトリを設定 サービスの管理/起動 script、executeリソースはChefのDSLの制約を受けずに何でもかけるが、 冪等性が損なわれる恐れがあるので多用は良くないと言われる
  14. 14. Chefの周辺ツール knife Chef Server/Chef Client使用時 Chef Solo使用時 Chefに付属するコマンドラインツール knife-* knifeのプラグイン。 上のknife-soloの他、knifeコマンドでIaaS制御できるものなどがある knife-soloというものがあります Chef Soloは基本的に対象サーバ上でchef-soloコマンドを実行するが、 リモートサーバのprovisioningが実行できる knife client create Clientの作成 knife cookbook upload Chef Serverへcookbookをアップロード knife ssh 複数のサーバで同時にコマンドを実行 多用すると思います
  15. 15. Chefの周辺ツール Vagrant VirtualBox等のVMをコマンドラインから立ち上げるツール。Chef界隈での利用率高し 基本コンポーネント Box 利用方法 マシン起動やprovisioning実行したりするコマンドツール群 Vagrantfile Vagrantコマンドライン (仮想)マシンを作成する際のテンプレートとなる Boxを元にマシンを立ち上げる際の設定を記述 # Boxを追加 $ vagrant box add base http://files.vagrantup.com/lucid32.box # Vagrantfileの作成 $ vagrant init # マシンの起動 $ vagrant up ここ最近の「IT系難読単語」化してますが、 開発者のMitchel Hashimotoさんが「アイ メイク ヴェイグラント」と仰ってます http://www.youtube.com/watch?v=vk7hHhhIt10
  16. 16. Vagrantのコマンド vagrant up vagrant provision vagrant halt vagrant destroy VM起動、VMのprovisioningを実行 ChefやPuppetによるVMのprovisioningを実行 VMの停止 VMの破棄 vagrant ssh 起動したVMにSSH接続 コマンド一覧 Vagrant.configure("2") do ¦config¦ config.vm.provision :shell, :inline => "echo Hello" config.vm.define :web do ¦web¦ web.vm.box = "apache" end config.vm.define :db do ¦db¦ db.vm.box = "mysql" ... Multi Machine機能 Vagrantfileの記述を変えると1回のvagrant upで複数VM立ち上げ可能
  17. 17. Vagrant Plugin Sahara VMの状態を記録して後でその時点にロールバックできる vagrant plugin installコマンドを使いますが、実体はrubygemsから取得 様々なpluginが公開されています vagrant plugin install <name> プラグインのインストール vagrant plugin list インストールされているプラグインの一覧表示 vagrant sandbox on sandboxモードをonにする vagrant plugin install sahara + コマンド vagrant sandbox rollback 変更を元に戻す vagrant sandbox commit 変更を反映する vagrant sandbox off sandboxモードをoffにする
  18. 18. IaaS等にも対応 Vagrant1.1からはIaaS上のサーバをVagrant経由で起動することも可能 gem経由ではなくパッケージでの提供に変更になっている (dmg、exe、rpm等) ので 旧バージョン使っている方や昔の雑誌・ブログ等を参照する場合要注意 VirtualBox VMWare Fusion AWS Rackspace 対応状況 標準対応 標準対応 vagrant-awsプラグインで対応 vagrant-rackspaceプラグインで対応
  19. 19. Vagrant本あるよ Vagrant: Up and Running 今のところ英語版だけですが、日本語版出すことが 2013/7/12のvagrant meetup後に決まったようです。 英語版でも150ページ弱、7章のプラグイン開発とか読まないなら100ページほどです。 Create and Manage Virtualized Development Environments By Mitchell Hashimoto
  20. 20. Vagrantからのニフティクラウド利用 ...私はあります ところでニフティクラウドユーザなそこのあなた、こう思ったことはありませんか? Vagrantからニフティクラウド上の サーバ立ちあげたい... vagrant-niftycloud ないの?
  21. 21. Vagrantからのニフティクラウド利用 ...私はあります 作ってみた / ところでニフティクラウドユーザなそこのあなた、こう思ったことはありませんか? Vagrantからニフティクラウド上の サーバ立ちあげたい... vagrant-niftycloud ないの?
  22. 22. vagrant-niftycloud(開発版) ニフティクラウド上のサーバ立ち上げ、provisioning実行するためのVagrant plugin ・rsyncを使ったファイル転送 ・VagrantがSSH接続してコマンド実行可能な状態にする Chef以外も動作 Puppet / Ansible(Vagrant1.2.0+) / CFEngine (Vagrant1.2.0+) $ vagrant plugin install vagrant-niftycloud Chef以外はまだテストしていないが、pluginでやっていることは だけなのでVagrantでサポートしているものは動く気がする...
  23. 23. vagrant-niftycloud コマンド vagrant up --provider=niftycloud vagrant provision vagrant halt/suspend vagrant resume サーバ立ち上げ、サーバのprovisioningを実行 Chef等によりサーバのprovisioningを実行 サーバの停止 停止したサーバの起動 vagrant ssh 起動したサーバにSSH接続を実行 vagrant destroy サーバの破棄 用意しているコマンド ※Vagrantのnetwork機能については非対応
  24. 24. ローカルのVirtualBoxやVMWare Fusionではダメ? Develop Locally. Test Remotely. 今までもリモートサーバ上でchef-soloを叩いたり、 ローカルマシン上でknife-soloを使ってリモートサーバのセットアップを行うことはできた 実際に使うRemote環境でテストが簡単に行える http://www.youtube.com/watch?v=vk7hHhhIt10 by Mitchel Hashimoto providerは適材適所で使い分けましょう。VirtualBoxもproviderの一つに過ぎない Vagrantを使うとより簡単にリモートサーバ上でのテストができる
  25. 25. vagrant-niftycloud 利用想定シーン 利用想定シーン サーバが立ち上がるのはローカルマシン上のVirtualBox等より遅いがprovisioningは速い 本番環境にニフティクラウドを使用している場合、本番と同じ環境でテストできる Chef cookbookやPuppetのマニフェストの開発を行いたい場合 オススメしない例 CIを行う際のJenkins等からの利用 Jenkinsサーバ上のVM立ち上げるよりサーバリソースを食わない(弊社事例紹介で後述) 本番環境構築  →vagrantユーザがいたりするのでおすすめしません。あくまでテスト環境構築を想定しています。 サーバのprovisioningを行わない場合(単純にコマンドラインからサーバ立ちあげたい)  →ニフティクラウドのCLIやSDK使うほうがいいと思います   vagrant up --provider=niftycloud --no-provision である程度可能   (rsyncによるローカルファイルの同期までは走る) + + + 手元のVM向けboxと同じ名前でニフティクラウド用のbox追加しておけば、 普段はローカルでvagrant up、ニフティクラウドで動くか試す時はprovider指定してvagrant upとか
  26. 26. vagrant-niftycloud 制約 ・vagrantユーザがパスワード無しでsudoできる必要がある ・sudoがttyなしで実行できる必要がある ・SSH秘密鍵はパスフレーズが空である必要がある ・場合によってはchef-client/chef-soloのインストールが必要 通常のVagrant使用時と同様に 各自プライベートイメージを作成して使用する必要があります m(__)m ニフティクラウド公式のOSイメージそのままは使えません
  27. 27. vagrant-niftycloud 協力依頼 バグ報告、pull requestなどお待ちしています https://github.com/sakama/vagrant-niftycloud トラックナンバーが足りません!
  28. 28. Configuration Management Framework 周辺のテスト事情 Chef以外のもの、Chefと関係なく独立して動作するものも含みます シンタックスチェック ユニットテストと 呼ばれているもの 結合テストと 呼ばれているもの Chef Spec rspec-puppet Minitest Chef Handler Cucumber Chef Test Kitchen rspec-system serverspec Foodcritic knife cookbook test puppet lint 構築済みのサーバに対するテスト
  29. 29. Report Handler / Exception Handler 使い方によってはいろいろできると思います 実はよく目にしているかもしれない handlerを作成するとChefで実行された内容等が取得可能 ・実行完了時にメール通知 ・実行完了時にIRCに通知する ・実行時のログをIaaSのディスクにアップロードする http://docs.opscode.com/essentials_handlers.html [2013-07-18T08:54:47+00:00] INFO: Chef Run complete in 37.044959889 seconds [2013-07-18T08:54:47+00:00] INFO: Running report handlers [2013-07-18T08:54:47+00:00] INFO: Report handlers complete Chef Solo実行完了時に表示されるアレです 様々なhandlerが公開されています Report Handler Exception Handler Chef実行完了時に特定動作を起動する Chef実行失敗時に特定動作を起動する
  30. 30. ドキュメントを読んでいて魔が差した ちょっとしたサーバ仕様書ぐらいだったら 出力できるんじゃない? Report Handler / Exception Handler サーバ仕様書書くの意外と大変ですよね?
  31. 31. ドキュメントを読んでいて魔が差した ちょっとしたサーバ仕様書ぐらいだったら 出力できるんじゃない? 作ってみた / Report Handler / Exception Handler
  32. 32. chef-handler-pdf(3割程度ネタです) サーバ仕様書がPDFで出力できます ・実装方法がいくつかあるようですが、cookbookとして実装 ・Chefの初回実行時しか機能しません... ・全部はpushしてないので、気が向いたらUPします ・サーバの基本情報はOhaiから取得 ・実行されたresourceの内容はReport Handler経由で取得 https://github.com/sakama/chef-handler-pdf
  33. 33. 弊社での実際のシステム構築時の Chef活用方法
  34. 34. 利用範囲 ニフティクラウド 専用サーバ VPS等 全体では数十台程度のサーバをChefを使って構築している { { テスト環境構築 各開発者の開発環境構築 小売店舗向け端末 APIサーバ ECサイト 飲食店向け端末 APIサーバ 本番環境構築
  35. 35. Chef利用について Opscodeコミュニティcookbookをベースにしている 元々が個人的にサーバセットアップを自動化したくて始めたものが公式プロジェクト化 公開されているcookbookを使うだけでも「それなりに」動くので、 エンジニアの皆さんなら「作りました」メソッド使えばいいのでは...(私見) サーバは構成が多岐に渡るのでロールで複数構成対応 基本的には全開発者が利用者 ・Chefに詳しい人間ばかりではない ・Objective-C等の開発のみをやっている開発者が開発環境構築で使うこと  等も考慮する必要がある web、db、app等
  36. 36. 改善できた点 クオリティの統一 基本Appエンジニアしかおらずサーバ構築スキルに差があったがクオリティの統一 サーバ提供の迅速化 開発環境構築の手間が減った ・新しく入社したメンバーやクライアントサイドの開発をしていて、  サーバサイドに詳しくないメンバーでも開発環境構築が楽にできる ・全員が共通の環境構築が可能( ちょっと違う 環境はchefのattributeで対応可能) 以前はVMイメージ配布 →数GB単位のイメージファイルのネットワーク経由での配布は時間が掛かる サーバ構築依頼からセットアップ完了までの迅速化
  37. 37. Chef Server 導入は進めていますが、まだ利用していません 使えるところと使えないところがある 通常の受注案件 ・保守契約の絡み ・他社も作業を行う場合がある 使用不可 SaaS型での提供もやっていまして... 全て自社で管理 使用可 node.jsベースの管理画面までは作ってあるが、マンパワーが...
  38. 38. Chef cookbookの開発 ローカルでVagrant+VirtualBoxで開発 vagrant upでサーバ立ち上げ+provisioning実行 以後vagrant provisionを繰り返す $ vagrant up VM already created. Booting if it's not already running... Clearing any previously set forwarded ports... Forwarding ports... -- 22 => 2222 (adapter 1) Creating shared folders metadata... Clearing any previously set network interfaces... Running any VM customizations... Booting VM... Waiting for VM to boot. This can take a few minutes.
  39. 39. 実際のサーバのセットアップ http://www.engineyard.co.jp/blog/2013/chef-tutorial-updated/ https://speakerdeck.com/naoya/vagrant-plus-chef
  40. 40. 実際のサーバのセットアップ 2 そのやり方でやっています(申し訳ございません) (1) settings.jsonにサーバ設定内容を記述して下さい (2) install.shをキックして下さい 全員にRubyの実行環境構築強制かつknife soloコマンド叩くの強制するのは時期尚早で それよりはChefの効果を実感してもらって広めるのが先と判断 # omnibusインストーラでChefをインストール curl -k -L https://www.opscode.com/chef/install.sh ¦ bash # chef-soloコマンド実行 chef-solo -c ./solo.rb -j ./conf/settings.json install.shの内容 というよりchef-soloコマンドすら叩かせてないです 使いたい人はknife solo使ってという形にしています
  41. 41. Chef cookbookのCI 社内サーバでJenkins+Vagrant+VirtualBox Jenkinsサーバ VirtualBox Vagrant cookbookをホストしている 社内Gitサーバ master develop git pull Cent OS6.x Cent OS 5.x vagrant up
  42. 42. Chef cookbookのCI 2 Gitのmaster、developのcookbookに対して1日各2回 通常のソフトウェアのテストの場合、Jenkinsの「SCMをポーリング」を使用して レポジトリにgit push(svn commit)されたらビルド実行が多いが、 ・同時に同一のVagrantfileを使って複数のVM立ちあげられないので  複数ビルドを並列実行できない(Multi VM機能という意味ではなく) ・複数ビルドが同時に走るとメモリ食う ・1回のテストに1h弱掛かるのでビルドのキュー待ちが凄いことになりそう 以上の理由により 定時実行 構築済みサーバのテストは行えていない serverspec等利用してテストできるところまでできればいいが、 現状recipe適用時にexit 1吐かないかどうかを確認しているレベル
  43. 43. Chef cookbookのCI 3 JenkinsでBuild Pipelineを組んでいる JenkinsのBuild Pipelineプラグインを使用しカスタムビューを作成 web db app webロールのみ dbロールのみ その他のロール
  44. 44. Chef cookbookのCI 4 Build Pipeline 継続インテグレーションのプラクティスの1つで、 テスト等を複数のステップに分割し、順番に流していく 一般的なアプリケーションのBuild Pipeline cookbookのCIのためのBuild Pipeline SCMへの コミットをトリガー 結合テスト サーバへ デプロイ ユニットテストが (成功したら¦失敗しても)実行 (手動¦自動)で実行 ロール1で テスト ロール2で テスト ロール3で テスト 定時実行 ロール1のテストが (成功したら¦失敗しても)実行 ロール2のテストが (成功したら¦失敗しても)実行 + + ユニットテスト
  45. 45. Chef cookbookのCI 5 定期的なテストはやった方がよい ・(rpm¦deb)パッケージのダウンロードURLが変わった ・アプリ側の修正でデプロイの部分が動かなくなった 1回のテストで1時間弱かかるので手動は無理 ・時間掛かるテストは機械に任せましょう
  46. 46. この方法はやめたい テストがコード変更以外の理由で失敗することが多い なぜかApacheの起動に失敗したり →Jenkinsからのアラートメール多発で狼少年状態に メモリ食う 8GBメモリ搭載のサーバ使っても vagrantのMulti Machine機能使用して 同時にVM2つが限界 VirtualBoxがちょっと不安定...? ・i386のboxは追加できてもx86_64のboxが追加できないことがあった ・vagrant destroy -fに失敗することが多発→VMの残骸が残ってDisk Full  CUIのみのホストOSだと設定が面倒なのでGUI使えるホストOSが良い
  47. 47. 今後Chefサーバ等の 運用で実現したいこと
  48. 48. 新CI環境 構想 IaaS上でテストする Jenkinsサーバ Vagrant cookbookをホストしている 社内Gitサーバ master develop git pull Cent OS6.x Cent OS 5.x vagrant up IaaS
  49. 49. テストの並列実行が可能に 今まではJenkinsサーバのスペックの制約で1つずつ実行 ロール1で テスト ロール2で テスト ロール3で テスト 並列実行でテスト実行時間を短縮 ロール4で テスト ロール1で テスト ロール2で テスト ロール3で テスト ロール4で テスト 30分以上短縮 サーバ利用料節約のため、 ここでFailした場合 以降は実行しない
  50. 50. 構築済みサーバのテスト serverspecを入れたい ・記述が容易(RSpecベース) ・Chefを使用せずに構築したサーバのテストも行える ・SSHさえ繋がればテストできる マンパワー不足により手を付けていなかったが もっと早く取り入れていても良かった
  51. 51. IaaSとの連携 AWSでいうOpsworksが広く実装されれば サーバセットアップ〜提供まで楽になる 本番環境一歩手前のテスト環境としての利用 http://www.youtube.com/watch?v=vk7hHhhIt10 VagrantのMulti Provider機能を利用して ・ローカルVM環境 ・リモートテスト環境  を適宜切り替えて利用
  52. 52. ニフティクラウドの場合 Cloud Automation βが6/4に公開された (1) 設定用JSONから漂う芳醇なChefの香り { "run_list": [ "recipe[nc::dependency_resolver]", "recipe[nc::manager_store]", "recipe[nc::manager]" ], "nc": { (2) 中でもChef使ってるみたいです...よ?
  53. 53. Chefのベストプラクティス
  54. 54. アプリのデプロイは別に考える アプリのデプロイはCapistrano等使う方が良いかも Chef使ってアプリのデプロイまで行うと、 アプリ改修の余波を食らってデプロイ失敗するというのを食らったことが IaaSのオートスケーリング使う場合、Chefで都度構築していると間に合わない Dev、Opsが明確に分かれている場合ちょうど線引きできる?(作業的な意味で) サーバセットアップまではやるので、以後デプロイからはよろしく...とか。 subversionリソースはsvnサーバが https&自己署名(オレオレ)証明書だと動作しませんでした ミドルウェア設定まで完了済みのイメージから インスタンス起動&アプリのみデプロイツールでデプロイ + + +
  55. 55. Chef Serverだけがあればいいというわけではない ・cookbookの開発環境 ・運用態勢 ・メンバーのスキル ・CI環境 無理にChef Server使う必要はなさそう 身の丈にあったツールを使えばいいんでは どうせならChef Server入れるぜ!という気持ちは分かりますが 日々改善
  56. 56. END

×