Chef社内向け解説とその課題について

7,715 views
7,485 views

Published on

社内向けに説明した資料です
会社の技術ブログにChefの記事投下しました。http://devlab.isao.co.jp/chef-solo_vagrant_install/

4 Comments
42 Likes
Statistics
Notes
  • そうですね。確かに。日々に追われて時間がとれないのが大きくてイメージ撮れる環境でコピーできるとか別の手段のほうが楽とかあるんだとは思います。トップダウンでやるぞってなるとか顧客がchefありきになるとかお尻に火がついてくれば状況かわる気はするので、とりあえず権力者にchef使えないとヤバいって言い続ける感じでしょうか。私も最初は上から言われたのですなおに調べはじめた感じではあります。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • @YuKomiya 回答ありがとうございます。「孤独な板前状況」、これに尽きます。僕も、Vagrantfileも併せて一式提供したら使ってはくれるんですが… うちでもそうですが、インフラ寄りの人の方が否定的なのは致命的ですよね。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • お久しぶりです。コメントどうもです。
    大分前なのでアレですが、実際に構築運用まわす立場の人は導入コストの面で渋ってましたね。開発よりなマインドの方と周りが見えてる方からはこれは必要なものだ!みたいな反応でした。レシピ適用時の動画を挟むように工夫して分かりやすくしても意見が分かれるのは変わらずでしたね。ただうちではもう既にchef前提で話がすすむのが出てきてる感じでChefでもPuppetでもAnsibleでも何かしら習得はしないといけないさしせまった状況ではあります。こういったconfigurationツール使うにはgitも覚えるの必須になってくるとかまあインフラよりだと周辺ツールも敷居はたかいかもしれません。みんなで急な依頼でも案外早く帰れて便利っていうようなとこまでたどりつけるといいと思います。(ウチでも孤独な板前状況で広めかたについて困り中です)継続的にハンズオンとかしないと厳しいかもしれないですかね。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ご無沙汰してます。。。
    この資料、実際に社内勉強会で使われたものですか?
    僕の会社でもChefの勉強会やりたいと思ってるんですが、Chefって「ちょっと入門」するには学習コストがもの凄く高いので二の足を踏んでます。
    この資料まとまっているとは思いますが、それでもかなりヘビーですので、もし良かったらこれで勉強会やった時の社内の人の反応など、教えていただけるとありがたいですm(_ _)m
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
7,715
On SlideShare
0
From Embeds
0
Number of Embeds
114
Actions
Shares
0
Downloads
0
Comments
4
Likes
42
Embeds 0
No embeds

No notes for slide

Chef社内向け解説とその課題について

  1. 1. CHEF入門と課題について ~社内向け簡単解説~
  2. 2. はじめに • 資料作った本人はサーバ構築運用を8年くらいしてる主 婦です。 • MySQLとシェルスクリプトがちょっと好きです。 • 本資料は概要の解説だけで実際の手順などはリンク先に 充実していると思います。 • お勧め書籍:「入門Chef-Solo」
  3. 3. 解説ターゲットと目的 • 社内向けに技術解説および検証結果の報告と共有をわか りやすく行う。(まずはグループ内、技術関係者向け) • 自由度の高い部分についての方向性を相談する。 • この先どうしたいのか(具体的にどの案件で構築時に Chefを積極的に用いていくかなど)を相談する。 ※手順のブラックボックス化を防ぎ、 冪等性(何度実行しても同じ環境が出来上がること)を担保する。 ※学習コストは高めですがそれに見合う以上のメリットがあるという 記事も見かけました。コスト削減とオペミス防止等々。 ※Chefで柔軟に使える試験環境をつくりたい、 何回も同じインストール作業したくないという要望にこたえられる。 Chefを用いる目的など:
  4. 4. CHEFとは • サーバの状態をあるべき姿に自動的に収束 (convergence)するツール。≠単なる自動化ツール。 • OSインストール後の状態からの初期設定やミドルウェア等 の環境セットアップに利用するものです。 • アプリケーションのデプロイツールとは性質が異なります (ロールバックとかテストとかは標準サポートされていな い)ので他のツールと組み合わせる必要があるようです (capistrano、serverspec等) • レシピに書いたとおりに動作します • Puppetと機能は一緒。ただChefのほうが表記方法にruby のクラスとメソッドが使えるので自由度が高く(配列等が使 える)、Puppetのほうがディレクトリ構成の自由度が高いそ うです。
  5. 5. カッコイイ言い方の見本 • 図によるとChefはSystemConfigurationツールで、 VagrantはBootStrappingツールのようです。 http://www.slideshare.net/mizzy/serverspec-hbstudy45
  6. 6. 冪等性とその恩恵とは • Chefでは、同じレシピで何度繰り返しサーバ構築 してもまったく同じ状態になること。 • つまりレシピ=手順=実環境の状況であり、それ を読めばそのサーバがどんな状態なのかわかる。 • 冪等性を保つためには手動での追加変更オペレー ションは一切してはならない。 • 冪等性の恩恵としては、効率化による工数削減だ けでなく、古いシステムのリプレイスへの抵抗が 軽減、手順記載忘れがない、口伝のオペレーショ ンが減る、等があると思います。
  7. 7. 禁止事項 • Chefで管理しているサーバにrootログインして直 接設定変更。 なぜなら、冪等性がくずれる、手順のブラック ボックス化、設定が戻されて障害が起きる、とい うことになるため。 http://www.creationline.com/lab/3080 • 初心者Chefアンチパターン(以下URL)は必読。
  8. 8. CHEFの種類 • Chef-Server レシピのバージョン管理や並列処理等が可能なldapに似た仕組 みのもの。Environmentを利用すると試験環境と本番環境を分 けて処理を行えるようです。セットアップに手間かかるそうで す。必要に応じ追ってためしてみます。 • Chef-Solo 今回使うもので、並列処理はできないが20台くらいまでの構成 に適している、サーバ構成管理ツール。主に使うのはknife- solo。chef-soloでローカル適用し、knife-soloでローカルのレ シピをリモートに転送して適用します。手軽に利用できます。 • Hosted-Chef Opscodeが環境提供してるホスティング版。FBも使ってるら しく1万台等の規模にも対応できスケーラブルだそうです。 Hostedなのでお金がかかります。
  9. 9. 用語解説 Cookbook:一つ以上のレシピに必要なデータやファイルをまとめるもの レポジトリ(キッチン):Chefの動作に必要なファイル群。複数のクックブック やRole,Nodeの設定を含むもの。 1つのシステムにつき1つが望ましい。 Recipe:複数のResouceを記述したファイル。使いまわしたい単位で分けて書 くとよい。 Resouce:設定の最小単位。ファイルやパッケージ単位の設定 • レポジトリ>クックブック>レシピ という階層でレシピ群が管理されます。 Node:Chefで管理される各サーバのこと。 Role: webやdb等のノードの役割を定義。使うRecipeや変数を設定する。 プロバイダ:ChefではOSの種類をさす。Ohaiというコマンドの集合でその違 いを吸収しNodeのパラメータを取得している模様。 Data_bags:クックブックに含ませたくないユーザやホスト他のデータを管理 する仕組み。 Emvironment:環境を分けるしくみ。たとえば本番環境と試験環境等。
  10. 10. キッチン(レポジトリ) Cookbook(httpd) recipe recipe recipe recipe recipe Cookbook(base) Cookbook(mysql) recipe recipe recipe Roles webserver dbserverstgserver Environment nodes web01web01db01 db01db01db01db01db01web01 test01 dev01 Data_bags Login users mysql users hosts イメージ図 debelopment testproduction
  11. 11. クイック環境構築概要(KNIFE-SOLO) 1.Chefとvagrant(1.1以降)とVirtualBoxをいれる 2.Vagrantで仮想環境(Node)を立てる 3.Chefのリポジトリとcookbookを作成する 4.NodeやRoleやdata_bagsなどを定義しておく 5.recipeを書く、必要なファイルを用意する 6.Knife-soloでcookbookを各Nodeに反映する 7.シェルコマンドまたはserverspecで確認する
  12. 12. CHEF-SOLOインストール • Opscodeから入れられます chefのインストール方法は以下URLに載っています。 http://www.opscode.com/chef/install/ 某環境へのインストール手順(knife-solo)は以下にまとめ ましたので必要に応じ参照ください。 http://devlab.isao.co.jp/chef-solo_vagrant_install/
  13. 13. 現時点の注意点など • Rubyのバージョンに注意(1.8.7以上) • Rubyをサービスで使う場合にオムニバスインストーラ に削除と上書きされるので注意。 http://tk0miya.hatenablog.com/entry/2013/04/16/1 15713 • Vagrant(ベイグラント)はどんどん開発されており 1.1以降や最新版を利用推奨。 • Knife-soloは0.3.0以降がよいと思われます。 • Chefの11.6以降からクライアント(solo)でも Emvironmentが利用できるようになったようです。 • not_ifの定義忘れ(再実行されると困る場合)
  14. 14. VAGRANTFILEについて • Vagrant(ベイグラント)とは、VirtualBoxのラッパーツールで、コマンド ラインから仮想OSを起動するのに用います。(Bootstrappingツールです) • AWS上でインスタンス起動する場合について。 # vagrant up --provider=aws # vagrant ssh # vagrant destroy 編集したVagrantFileの中身は以下のような感じです Vagrant.configure("2") do |config| config.vm.box = "dummy" config.vm.provider :aws do |aws| aws.access_key_id = ENV['AWS_ACCESS_KEY_ID'] aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY'] aws.keypair_name = "komi-test" aws.ssh_username = "root" aws.ssh_private_key_path = "~/.ssh/id_rsa aws.instance_type = "t1.micro" aws.region = "ap-northeast-1" aws.ami = "ami-ca0784cb" aws.security_groups = [ 'default' ] end end ←インスタンスタイプ指定 ←東京リージョンを指定 ←AMI(OSイメージ)を指定 ←セキュリティグループを指定 ←管理ノードへsshログインするための秘密鍵を指定 ←管理ノードへsshログインするためのユーザを指定 ←外部からsshログインするためAWSの秘密鍵を指定 ←AWSのアクセスキーIDを指定 ←AWSのシークレットアクセスキーを指定 ←ダミーのBOXを指定 http://www.ryuzee.com/contents/blog/6538
  15. 15. レポジトリの構成 • 新規Chefレポジトリ(キッチン)を作るとできるディレクトリについて # knife solo init chef-repo # tree -L 1 chef-repo chef-repo |-- cookbooks |-- data_bags |-- nodes |-- roles |-- site-cookbooks `-- solo.rb cookbooksとsite-cookbooksはクックブックを格納するディレクトリで、 cookbooksにはダウンロードしてきたもの、site-cookbooksには自分で 作ったものを入れるのが推奨されているようです。 そのほか、knife-soloを入れると/root/.chef/knife.rbが作成され、必要な ディレクトリパスなどを指定します。 ←サードパーティレシピ置き場 ←ユーザ等データ管理機能使用時に使う ←各サーバ(node)用のJSONファイル置き場 ← Roleを使うとき用ディレクトリ ←自作レシピ置き場 ← cookbookのパスなどを設定
  16. 16. COOKBOOKの構成 knife cookbook create <cookbook-name>で作るディレクトリの中身 tree nginx -F nginx |-- CHANGELOG.md |-- README.md |-- attributes/ | `-- default.rb |-- definitions/ |-- files/ | `-- default/ |-- libraries/ |-- metadata.rb |-- providers/ |-- recipes/ | `-- default.rb | `-- server.rb |-- resources/ `-- templates/ `-- default/ `-- nginx.conf.erb ←filesの下に定数のみの設定ファイルを置く ←recipesの下でレシピを書いておく ←templatesの下に変数が必要な設定ファイルを置く ←templateリソースを使う場合、 attributesの下にデフォルト値を定義する ←default以外のレシピはnginx::server等で利用可能
  17. 17. レシピについて • Nginxのインストールと起動、設定ファイル設置とリロードするレシピ # vi site-cookbooks/nginx/recipes/default.rb package "nginx" do action :install end service "nginx" do supports :status => true, :restart => true, :reload => :true action [ :enable, :start ] end template "nginx.conf" do path "/etc/nginx/nginx.conf" source "nginx.conf.erb" owner "root" group "root" mode 0644 notifies :reload, 'service[nginx]' end レシピはやりたいことに応じた リソースを使って書いていきます。 パッケージをインストールするの はpackageリソース。 サービスを起動したり有効にする のはserviceリソース。 設定ファイル(変数有)を配置す るのはtemplateリソース。
  18. 18. よくつかうRESOURCE users:ユーザ追加 group:サブグループ追加 cookbook_file:ファイル設置 directory:ディレクトリ作成 template:変数有のファイル設置 package:パッケージインストール service:サービス有効・無効化と起動・停止 script:bashでできること全部(ソースインストール他) cron:cron追加 http://docs.opscode.com/resource.htmlリソースのマニュアル(熟読推奨)→
  19. 19. TEMPLATEについて1 templateリソースでレシピを記述、 変数を埋め込んだファイルを設置、 Attributes/default.rbにデフォルト値を定義、 RoleまたはNodeファイルにデフォルト値または上書き値を定義します。 変数がOhaiでノードから取得できる場合(hostname等)はAttributeや roleやnodeでの定義は必要ありません。 templateリソース内でvariablesで変数の値を代入する場合、設定ファ イル内で呼び出す際に@を付ける必要があります。 某システムのchef化でtemplate使ってるところは、/etc/hostsと sysctl.confとmy.cnfのserver_idなどです。 http://docs.opscode.com/chef/resources.html#template http://qiita.com/kenjiskywalker/items/c16afc2f8ac28765da91 http://tech.blog.piyo.org/2012/05/23/chef- attribute%E3%81%AE%E7%90%86%E8%A7%A3/
  20. 20. TEMPLATEについて2 • Templateリソースでレシピを書く template "nginx.conf" do path "/etc/nginx/nginx.conf" source "nginx.conf.erb" owner "root" group "root" mode 0644 notifies :reload, 'service[nginx]' end • attribute/default.rbにデフォルト値を定義する default['nginx']['port'] = "80” • nodeまたはroleのattributeを定義する { "name":"webserver", "chef_type": "role", "json_class":"Chef::Role", "default_attributes":{ "nginx": { "port": "80", } }, # vi cookbooks/nginx/templates/default/nginx.conf.erb ~略~ server { listen <%= node['nginx']['port'] %>; server_name localhost; ~略~ ポート番号を変数に指定。 • Port番号を変数展開するようにした設定ファイル
  21. 21. NODE用ファイルの解説 • Chefでは管理対象サーバのことをノード(node)という • JSONファイルにかかれているのはある特定のノードの状態。 • JSONファイルに書いているデータ構造はNodeObjectと呼ぶ。 • NodeObjectのプロパティとしてそのノードに適用するべきレシピを列挙 し、そのノードが持っている変数(Attribute)の値も列挙する、これがJSON ファイルの役割。 vi 172.20.28.241.json { "mysqld" : { "server_id" : 103 }, "run_list":[ "role[dbserver]“ ] } ←変数(Attribute)の値 ←適用するべきレシピを含むrole(※※) ※リポジトリ直下のnodesディレクトリの下にjsonファイルを置きます
  22. 22. ROLEについて • 某システムでは、 webserver、 dbserver、 admserverでroleを 分けています。 cd chef-repo/roles vi webserver.json { "name":"webserver", webserverのロール "chef_type": "role", "json_class":"Chef::Role", "default_attributes":{ "base_setting": { "swappiness": "30", "tcp_tw_reuse": "0", "tcp_tw_recycle": "0", "tcp_fin_timeout": "60", "tcp_max_syn_backlog": "4096", "somaxconn": "4096" } }, "override_attributes":{}, "description":"webserver's role", "run_list": [ "recipe[base_setting::bkup_dir]", 基本設定、バックアップディレクトリ作成 "recipe[login_users]", ログインユーザを作る "recipe[base_setting::hosts]", 基本設定、hosts "recipe[base_setting::sysctl]", 基本設定、sysctl "recipe[base_setting::disable]", 基本設定、disable "recipe[base_setting::ntpdate]", 基本設定、ntp "recipe[base_setting::mail-client]", 基本設定、mail "recipe[base_setting::logrotate]", 基本設定、ログローテート "recipe[httpd::httpd-server]", httpdサーバ "recipe[httpd::basic_auth]", httpdのベーシック認証 "recipe[httpd::wordpress]", httpdのwordpress "recipe[httpd::s3mount]", httpdのs3mount "recipe[munin::munin-node]", munin-node "recipe[munin::munin-node-web]", munin-nodeのweb用プラグイン配置 "recipe[zabbix::zabbix-agent]" zabbix-agent ] } ※※Role内で run_listを管理する のは初心者Chefア ンチパターンによ ると、バージョン 管理できないため 非推奨の模様。リ ファクタリング対 象です。
  23. 23. DATA_BAGSついて ・通常はChef-Serverで利用可能ですが、soloでも、 gem install knife-solo_data_bag とするとdata_bagsが使えるようになります。データはレポジトリ直下の data_bagsに保存されます。 ・data_bagsを利用することによりクックブックに固有のデータが含まれない ように使いまわしやすくリファクタリングが可能に。 ・暗号鍵を指定することで暗号化してパスワード等のデータを保存できるため セキュアです。Node等のアトリビュートで値を直接平文で渡すことをせず にレシピから暗号化されたデータを呼び出すことができます。 ・某システムのChef化においては、OSユーザとmysqlユーザをdata_bagsで 管理するようにしています。 ・頻繁に変更されるようなデータもdata_bagsに向いています。たとえばイベ ント時に追加され終了後削減されるwebserverのIPアドレスとホスト名など。 http://tech.blog.piyo.org/2012/06/19/chef-data-bag%E6%B4%BB%E7%94%A8%E6%B3%95/ http://blog.kenjiskywalker.org/blog/2013/05/20/chef-databag/ http://matetsu.hatenablog.com/entry/2012/02/12/020118
  24. 24. NOT_IF, NOTIFIESについて • not_if:実行結果が0でない場合にそのリソースを 実行する。たとえばrpm –qaでパッケージが入っ てなかったらpackageリソースでインストール する等。 • only_if:実行結果が0だった場合にそのリソース を実行する。特定のディレクトリが存在した場合 にファイルを置く等、事前の確認を行いたい場合 に利用するものの模様。 • notifies:設定ファイルが更新されたらサービスを リロードしたい、といった用途に用いるもので複 数のリソース内に定義することが可能。 Scriptリソースや2度実行されたくないリソース内には 必ずnot_ifを定義する必要があります。
  25. 25. 仮想環境にレシピを反映する • Knife-Solo使う場合 • Vagrant使う場合 # knife solo cook <host> レシピ転送&リモート実行 # vagrant provision ※一度レシピを書いたら次回から上記のようなコマンド実行するだけです。 これはとても重要なことです。
  26. 26. 確認について • Serverspecを用いるのが主流で推奨されています。 • とはいえ最初はコマンドで都度確認しながらになるか と思います。 • ScriptやExecuteというリソースはエラーだけどエ ラーが帰ってこずすんなり終わったりしますので要注 意。直接コマンドで確認しないと原因が特定できない 場合もあります。 • Cookbook毎のテストコマンドは、以下のとおりです。 シンタックスチェックができます。 knife cookbook test <cookbook-name> http://www.slideshare.net/mizzy/serverspec-hbstudy45 サーバ構築を自動化して確認は手動って面倒すぎるというお話。
  27. 27. 参考:某システムのレシピの構成概要 ディレクトリパス chefのレポジトリ /root/chef-repo VagrantFileの場所 /root/chef-repo/VagrantFile 要件 対応リソース cookbook レシピ名 コメント Node(Role) ホスト名の変更 VagrantFile - IF設定 VagrantFile - hosts設定 template,Attribute,Role base_setting hosts.rb Ohaiのhostnameを使う all bkupディレクトリ作成 Directory base_setting bkup_dir.rb all カーネルパラメータ設定template,Attribute,Role base_setting sysctl.rb all アカウント作成 Group,User,data_bags login_users default.rb all Selinux無効化 file base_setting disable.rb all yum設定修正 file base_setting disable.rb all IPv6無効化 file base_setting disable.rb all 不要cron停止 file base_setting disable.rb all yumリポジトリ設定 - base_setting opscode要らず元のAMIに あった all ntpデーモン設定 package,service,file base_setting ntpd.rb localhost cron設定(ntpdate) cron base_setting ntpdate.rb クライアント設定 allクライアント MTA設定 package,service,file,script base_setting mail-postfix.rb mail-dovecot.rb localhost メールクライアント設定file base_setting mail-client.rb クライアント設定 allクライアント logrotate.d設定 file base_setting logrotate.rb all apache導入基本設定 script,service,file httpd httpd-server.rb web,localhost mod_ssl導入設定 - httpd mod_ssl.rb ELB使うので要らなかった web ベーシック認証設定 file httpd basic_auth.rb web s3mount設定 file httpd s3mount.rb web wordpress導入設定 file,script httpd wordpress.rb web,localhost mysql導入基本設定 script,service,file mysqld mysqld-server.rb database mysqlアカウント作成 databags,script mysqld mysql-users.rb databaseクックブック依 存 database munin-node設定 script,service,file munin munin-node.rb munin-node-web.rb munin-node-db.rb web,db用のレシピをわけ た allクライアント munin-server設定 package,service,file munin munin-server.rb localhost 監視設定zabbix-agent package,service,file zabbix zabbix-agent.rb all 監視設定zabbix-proxy package,service,file zabbix zabbix-proxy.rb localhost phpmyadmin導入設定 - httpd phpmyadmin.rb 実は要らなかった模様 localhost Rubyわからない全くの初心者がレシピを書きあげるのに2カ月程度。 WEB1+DB1+STG1な環境。
  28. 28. レシピのバージョン管理 • レシピのバージョン管理はServerはできるがSolo ではできないのでgitを使います サードパーティのレシピを使うときにコミット済みである必要があります。 # cd /root/chef-repo # git init # git add . # git commit -m 'fist commit' http://www.slideshare.net/yalab/git-9518230
  29. 29. 課題とこれからのとりくみ • レシピの書き方ほか自由度が高すぎて何がただしいのかよくわかっていないのが 課題の一つ。If文をもっと使いこなせたらよさそう。 • Host名の管理にdata_bagsをつかいたいけどどうなのでしょう。 • Scriptリソースを極力つかわないのが無用な問題を避けるまたは環境の違いを吸 収するために理想なようですが、使わないとどうにもならないところも多数あり ました。 • Chef-ServerでないとEnvironmentが使えずに試験環境と本番環境など環境分け のほうほうがRoleつかうくらいしか思いつかないです。 • サードパーティのレシピを使ってみたいがruby力等がたりずレシピを読み切れ ない。書いたとおりに動くものは書いてある内容が理解できないなら使用するべ きではないように思います。 • 自分でレシピを書いて育てていく。(ruby力の強化およびこれまで使ってきた 手順を整理する必要が生じます。 ) • Serverspecでテストを書いてテストする。(一応できたところです) • 実環境での適用を検討する。(某システムは適用する前に切り替わってしまった ためリリース済みの環境に試験ができない)これをすすめていかないと取り組ん でる意味がないというか自動化や冪等性の恩恵を受けられないです。 • サーバリソースに応じたパラメータ自動調整などに取り組みたい。 • 試験環境とかハンズオン用のサーバを一気に立てて使い終わったら落とす等、夢 は広がってるようです。
  30. 30. 参考URL • 本資料より参考になります! http://docs.opscode.com/resource.html http://www.opscode.com/chef/install/ http://www.slideshare.net/nekoruri/chef-17848863 http://www.slideshare.net/naka24nori/chef1-15707316 http://www.slideshare.net/YukihikoSawanobori/what-is-chef201303 http://inokara.hateblo.jp/entry/2013/03/20/130552 http://d.hatena.ne.jp/naoya/20130205/1360062070 https://github.com/RiotGames/berkshelf-vagrant https://www.virtualbox.org/ http://vboxmania.net/ http://d.hatena.ne.jp/naoya/20130315/1363340698 http://www.ryuzee.com/contents/blog/6530 http://www.ryuzee.com/contents/blog/6538 ネットで情報検索するときはChefだけだと料理のサイトが出てきてしま うので尐しマニアックな用語を組み合わせると良いかと思います。
  31. 31. おわりに • なんでもそうですが説明きいただけじゃなく実際つ かってみないと把握しきれないことがあると思いま す。 概要がなんとなくつかめたら使ってください。 • ありがとうございました!

×