Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

今日から使い始めるChef

7,865 views

Published on

今日から使い始めるChef

2013-03-29
Xtone Ltd. ピザ会 (without pizza><)
Aki / @nekoruri

Published in: Technology
  • Be the first to comment

今日から使い始めるChef

  1. 1. 今日から使い始めるChef 2013-03-29 Xtone Ltd. ピザ会 (without pizza><) Aki / @nekoruri
  2. 2. いくつかの案件がChef管理に移行しました必ず覚えて欲しいこと
  3. 3. Chef• サーバの構成管理ツール – サーバの「完成状態」を書く ここ全部 – 「現状」との違いを判断する Chefが – その差分を埋める やってくれる • パッケージのインストール • 設定ファイルの設置 • サービスの起動 • DBのユーザ作成 • ファイアウォール設定 • etc.
  4. 4. 禁止事項• サーバ上でrootで設定ファイル変更
  5. 5. 禁止事項• サーバ上でrootで設定ファイル変更 Chefで設定戻されて突然の障害
  6. 6. 使ってみる1. Chefのレポジトリを取ってくる2. rootで入れるサーバを一台作る3. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.1004. ノード設定を適当に書く – vim nodes/192.0.2.100.json {"run_list": ["role[base]"]}5. chef起動 – knife solo cook root@192.0.2.100
  7. 7. 使ってみる1. Chefのレポジトリを取ってくる2. rootで入れるサーバを一台作る3. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.1004. ノード設定を適当に書く – vim nodes/192.0.2.100.json {"run_list": ["role[base]"]} 以降はここだけ5. chef起動 – knife solo cook root@192.0.2.100
  8. 8. ざっくりChefのしくみのおさらいざっくりCHEFの紹介
  9. 9. Chef用語• Resource – 設定の最小単位 – ファイルやパッケージ単位の設定• Recipe – 複数のResourceで構成されるひとまとまり• Cookbook – Recipeをグループにまとめたもの – 一つのRecipeしか含まない場合もある• レポジトリ(キッチン) – Chefの動作に必要なファイル群 – 複数のCookbookや、ロール・ノードの設定を含む
  10. 10. Chef用語• ノード – Chefで管理されるサーバ• Role – ノードの役割を定義 – 使うRecipeとか変数とかをここで設定する(抽象化)• chef-solo – サーバ無しでChefを利用するコマンド – chef-soloを動かしたノード自身が操作対象となる• knife-solo – 対象ノードにレポジトリを転送してchef-soloを動かす
  11. 11. Resource• 設定の最小単位 template /etc/apache2/sites-available/www.example.jp do – ファイル source www.example.jp.erb mode 0644 ファイルを更新したら action :create apache2サービスを notifies :restart, "service[apache2]" 再起動 end – パッケージ %w{zsh zip sysstat libcache-cache-perl}.each do |pkg| package pkg do action :install 完全にRuby end end firewall_rule "zabbix" do – ファイアウォール port 10050 source "192.0.2.5" action :allow notifies :enable, "firewall[ufw]" end
  12. 12. Recipe• 複数のResourceで構成されるひとまとまり munin_servers = [ 192.0.2.6/32, 192.0.2.140 /32] package "munin-node" service_name = node[munin][service_name] Rubyの内部DSLなので 変数とかも利用し放題 service service_name do supports :restart => true action :enable end サーバ毎の設定を利用 template "#{node[munin][basedir]}/munin-node.conf" do source "munin-node.conf.erb" mode 0644 variables :munin_servers => munin_servers 変数をerbに渡す notifies :restart, "service[#{service_name}]" end サーバの情報を利用して分岐 case node[platform] when "arch", "smartos" execute "munin-node-configure --shell | sh" do not_if { Dir.entries(node[munin][plugins]).length > 2 } notifies :restart, "service[#{service_name}]" end end
  13. 13. Templatelog_level 4log_file /var/log/munin/munin-node.logport 4949pid_file /var/run/munin/munin-node.pidbackground 1setseid 1# Which port to bind to;host * サーバ毎の設定を利用user rootgroup <%= node[munin][root][group] %>setsid yes<% end %># A list of addresses that are allowed to connect. This must be a# regular expression, due to brain damage in Net::Server, which# doesnt understand CIDR-style network notation. You may repeat# the allow line as many times as youd like 引き渡された変数を利用allow ^127¥.0¥.0¥.1$<% @munin_servers.sort.each do |server| -%>cidr_allow <%= server %><% end -%>
  14. 14. Cookbookの構成cookbooks/munin├── README.md├── attributes 変数のデフォルト値├── definitions├── files erbしない配布ファイル│ └── default├── libraries├── metadata.rb├── providers デフォルトのRecipe├── recipes 「munin」で利用可能│ └── default.rb│ └── server.rb デフォルト以外のRecipe├── resources 「munin::server」で利用可能└── templates └── default 配布ファイルの置き場 erb利用可能
  15. 15. 新しいChefレポジトリを作って、既存のCookbookを組み合わせて自分用のRecipeを書いて実際のノードに適用するまで一からやってみる
  16. 16. レポジトリを作る• knife-solo gemを入れる % gem install knife-solo• knife soloでレポジトリ作成 % knife solo init demo % cd demo % git init % git add . % git commit -m new chef repo
  17. 17. opscode-cookbooks• Chef開発元が公開しているCookbook集 – オープンソースとして開発 – Github上で公開 https://github.com/opscode-cookbooks/ – Ubuntuなら組み合わせるだけでそのまま使える ※ CentOSだとイマイチという意見多し(未確認) – knifeコマンドで取ってこれる
  18. 18. opscode-cookbooksのインポート• knife cookbookでCookbookを取ってくる % knife cookbook site install apt -o cookbooks % knife cookbook site install users -o cookbooks % knife cookbook site install sudo -o cookbooks 依存関係を見て引っ張って % knife cookbook site install mysql -o cookbooks くるツールがあるが、 今回は未使用• knife-github-cookbooksというgemもある – github上の任意のCookbookをインポートできる
  19. 19. 新しくCookbook/Recipeを作る• knife cookbook createでCookbookを作成 – site-cookbooks以下に置くのが慣習 % knife cookbook create base -o site-cookbooks• Recipeを書いていく % vim site-cookbooks/base/recipes/default.rb include_recipe apt # ユーザ設定 include_recipe users::sysadmins node.override[authorization][sudo][passwordless] = true include_recipe sudo
  20. 20. Roleに経由してRecipeを利用する• ロールに対して利用するレシピを設定 % vim roles/base.rb name "base" description "base packages" run_list( recipe[base], recipe[mysql::server] ) default_attributes({ mysql => { server_root_password => rootpw, server_repl_password => replpw, server_debian_password => maintpw, tunable => { log_bin => mysqld } } })
  21. 21. Roleに経由してRecipeを利用する• ノードに対してロールを紐付ける % nodes/192.0.2.100.json { "run_list": ["role[base]"], "mysql": { ノード別で異なる設定は "tunable": { ここで定義できる "server_id": "1", "innodb_buffer_pool_size": "2048M", "innodb_log_file_size": "128M" } } }
  22. 22. data_bags• ユーザ情報などを置いておけるデータ置き場 – chef-solo環境だと、data_bagsディレクトリ内 % data_bags/users/hoge.json { "id": "hoge", "uid": "10001", "comment": "FOO Bar", "ssh_keys": [ "ssh-rsa AAAAなんちゃら= hoge@example.jp" ], "groups": [ "sysadmin" ], "shell": "/usr/bin/zsh" }
  23. 23. chef-solo実行1. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.1002. chef起動 – knife solo cook root@192.0.2.100
  24. 24. ありがとうopscode-cookbooksありがとうおすすめCOOKBOOK
  25. 25. apt• aptレポジトリの更新 – https://github.com/opscode-cookbooks/apt – 「include_recipe apt」でapt-getしてくれる – 使わないと古いパッケージを取りに行き失敗
  26. 26. users::sysadminsとsudo• ユーザ管理(users::sysadmins) – https://github.com/opscode-cookbooks/users – data_bagsにsysadminグループのユーザ設定を入 れておくと勝手に作ってくれる – ユーザ追加の度にRecipeを変更しなくてよい• sudoers管理(sudo) – 上記sysadminグループはデフォルトで入ってる
  27. 27. firewall• ファイアウォールのルール設定 – https://github.com/opscode-cookbooks/firewall firewall "ufw" do firewall Cookbookで定義された action :enable 独自リソース end firewall_rule "ssh" do port 22 action :allow notifies :enable, "firewall[ufw]" end – Ubuntu標準ではpingが拒否されているので、 変更したbefore.ruleも配る
  28. 28. apache2 / php• 各ミドルウェアを入れてくれる – https://github.com/opscode-cookbooks/apache2 node.default[apache][listen_ports] = [80, 443] node.default[apache][serversignature] = Off node.default[apache][traceenable] = Off include_recipe apache2::mod_proxy_http include_recipe apache2::mod_php5 include_recipe apache2::mod_rewrite include_recipe apache2::mod_ssl include_recipe apache2 include_recipe php::package include_recipe php::module_apc include_recipe php::module_mysql include_recipe php::module_gd node.default[php][directives] = { date.timezone => Asia/Tokyo }
  29. 29. mysql / database• データベースのユーザを作成する – https://github.com/opscode-cookbooks/database include_recipe database::mysql mysql_connection_info = { :host => "localhost", :username => root, :password => node[mysql][server_root_password] } mysql_database myapp_production do connection mysql_connection_info action :create end mysql_database_user myapp_production do connection mysql_connection_info password passwordpassword database_name myapp_production host localhost action :create end
  30. 30. 関連情報• 伊藤直也さんの電子書籍がベスト – 入門Chef Solo - Infrastructure as Code http://www.amazon.co.jp/dp/B00BSPH158/ http://tatsu-zine.com/books/chef-solo• opscode-cookbooksを読む – 宝の山 – https://github.com/opscode-cookbooks
  31. 31. ぐぬぬ悩んでいること
  32. 32. Unicorn環境• unicorn::default – Unicorn gemいれる→普通Bundlerだし – 設定ファイル→アプリと一緒にデプロイするし• application_ruby::unicorn – 似てるようで似てるだけのCapistranoデプロイと いまいち相性が悪い! – runitでUnicornのプロセス自動再起動!すごい! – graceful restartさせると死ぬ!すごい!!1
  33. 33. OpsWorks• AWS + Chef – http://aws.amazon.com/jp/opsworks/ – AWS提供のChef Cookbookを組み合わせる – まだ遊んでない
  34. 34. その他のアプローチ• RightScale / Scalr – もう一つ上のレイヤーでの構成管理したい派 – Xtoneでも某ゲーム案件で利用• PaaS – そもそもミドルウェアなんて面倒みたくない派 – Heroku、EngineYard、 AWS Elastic Beanstalk ニフクラC4SA、IIJ Mogok

×