今日から使い始めるChef

7,546 views

Published on

今日から使い始めるChef

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

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

No Downloads
Views
Total views
7,546
On SlideShare
0
From Embeds
0
Number of Embeds
48
Actions
Shares
0
Downloads
86
Comments
0
Likes
30
Embeds 0
No embeds

No notes for slide

今日から使い始める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

×