広島Ruby勉強会#35 - Chef入門

2,925 views

Published on

広島Ruby勉強会#35でChefのプレゼンしたときの資料

Published in: Business, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,925
On SlideShare
0
From Embeds
0
Number of Embeds
928
Actions
Shares
0
Downloads
24
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

広島Ruby勉強会#35 - Chef入門

  1. 1. 入門 13年11月2日土曜日
  2. 2. 自己紹介 小川 智和(おがわ ともかず) • • 13年11月2日土曜日 Twitter: @ogatomo 好きなもの:Emacs, Ruby, AWS, Railsなど
  3. 3. Chefについて • Opscode社が開発した Configuration Management Tools • サーバーの設定に必要なスクリプトや設定ファイル を一元管理 • サーバーの初期設定や設定変更の自動化 13年11月2日土曜日
  4. 4. Chefの構成 13年11月2日土曜日
  5. 5. Chefの構成 13年11月2日土曜日
  6. 6. Chefの構成 13年11月2日土曜日
  7. 7. Chefの構成 13年11月2日土曜日
  8. 8. Chefの構成 chef-server 13年11月2日土曜日
  9. 9. Chefの構成 chef-server chef-client 13年11月2日土曜日
  10. 10. Chefの構成 knife chef-server chef-client 13年11月2日土曜日
  11. 11. Chefの役割 Railsアプリのデプロイ apache mysql ruby nginx 等のインストール & 設定 サーバー自体(CPU,HDD,メモリ)や ネットワークの準備 13年11月2日土曜日
  12. 12. Chefの役割 Railsアプリのデプロイ apache mysql ruby nginx 等のインストール & 設定 AWS その他Cloud サーバー自体(CPU,HDD,メモリ)や ネットワークの準備 13年11月2日土曜日
  13. 13. Chefの役割 Railsアプリのデプロイ Chef apache mysql ruby nginx 等のインストール & 設定 AWS その他Cloud サーバー自体(CPU,HDD,メモリ)や ネットワークの準備 13年11月2日土曜日
  14. 14. Chefの役割 Capistrano Railsアプリのデプロイ Chef apache mysql ruby nginx 等のインストール & 設定 AWS その他Cloud サーバー自体(CPU,HDD,メモリ)や ネットワークの準備 13年11月2日土曜日
  15. 15. Chefの役割 Capistrano Railsアプリのデプロイ Chef apache mysql ruby nginx OS等の 違いを吸収 等のインストール & 設定 AWS その他Cloud サーバー自体(CPU,HDD,メモリ)や ネットワークの準備 13年11月2日土曜日
  16. 16. 構築方法 13年11月2日土曜日
  17. 17. 各種サーバー準備 先日の広島OSCで、無料クーポン頂きました! 13年11月2日土曜日
  18. 18. chef-server構築 chef-server 13年11月2日土曜日
  19. 19. chef-server構築 • Ubuntu 12.04 • スワップ有り(AWSのmicroだと厳しい) • さくらクラウド 13年11月2日土曜日
  20. 20. chef-server構築 http://www.opscode.com/chef/install/ URLコピー 13年11月2日土曜日
  21. 21. chef-server構築 • /etc/hostsの127.0.0.1の所に、 自サーバーのホスト名を入れておく。 • DNSにサーバーのIPとドメインも設定しておく $ curl -O コピペしたdebファイルのURL $ dpkg -i chef-server_11.0.8-1.ubuntu. 12.04_amd64.deb 13年11月2日土曜日
  22. 22. chef-server構築 DNSに設定したURLを以下の設定ファイルに入れておく $ vi /etc/chef-server/chef-server.rb nginx['server_name'] = "chef-demo.ogatomo.com" nginx['url'] = "https://chef-demo.ogatomo.com" $ chef-server-ctl reconfigure 13年11月2日土曜日
  23. 23. chef-server構築 /etc/chef-server/chef-validator.pem • 上記ファイルをサーバーからダウンロード (秘密 ファイルなので扱い注意!!) chef-serverにClientを登録する場合などに必要 • 13年11月2日土曜日
  24. 24. knifeの構築 knife 13年11月2日土曜日
  25. 25. knifeの構築 https://chef-serverのURL Adminにチェック クリックして管理Client作成 13年11月2日土曜日
  26. 26. knifeの構築 秘密 の文字列を 全部コピー 13年11月2日土曜日
  27. 27. knifeの構築 以下の階層でディレクトリとファイル作成 (場所はどこでも良い) .chef ├── knife.pem … knifeユーザーの秘密 をコピー ├── knife.rb … 空のファイルで良い └── validation.pem … chef-serverからDLした             chef-validator.pem 13年11月2日土曜日
  28. 28. knifeの構築 $ gem install chef 13年11月2日土曜日
  29. 29. knifeの構築 .chefと同じ階層までcdで移動後、 初期設定用コマンド実行 $ cd /path/to/.chef/../ $ knife configure 設定内容を色々聞かれます。 Overwrite /path/to/.chef/knife.rb? (Y/N) Y Please enter the chef server URL: [http://MacMini.local:4000] https://chef-serverのURL Please enter an existing username or clientname for the API: [togawa] knife Please enter the validation client name: [chef-validator] Please enter the location of the validation key: [/etc/chef/validation.pem] /path/to/.chef/ validation.pem Please enter the path to a chef repository (or leave blank): 13年11月2日土曜日
  30. 30. knifeの構築 動作確認の為、登録済みClient一覧取得 $ knife client list 実行結果: chef-validator chef-webui knife 13年11月2日土曜日
  31. 31. chef-client構築 chef-client 13年11月2日土曜日
  32. 32. chef-client構築 # apt-get install ruby1.9.1 ruby1.9.1-dev build-essential # gem install chef --no-ri ̶no-rdoc # mkdir /etc/chef 13年11月2日土曜日
  33. 33. chef-client構築 以下の階層でディレクトリとファイル作成 /etc/chef ├── client.rb … chef-client用設定ファイル └── validation.pem … chef-serverからDLした             chef-validator.pem 13年11月2日土曜日
  34. 34. chef-client構築 /etc/chef/client.rb の内容 chef_server_url "https://chef-serverのURL" node_name "Clientの名称" 13年11月2日土曜日
  35. 35. chef-clientの構築 $ knife client list 実行結果: chef-validator chef-webui knife Clientの名称 13年11月2日土曜日
  36. 36. chef-clientの構築 $ knife node list 実行結果: Clientの名称 13年11月2日土曜日
  37. 37. chef-clientの構築 $ knife node edit Clientの名称 -e vi 実行結果(JSON): { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ ], "default": { }, "override": { }, ……… …… … 13年11月2日土曜日 chef-clientが収集した 環境の情報 (IPアドレスや、OSの種類など)
  38. 38. chef-client構築 Clientをchef-serverに登録 # chef-client /etc/chef ├── client.rb ├── client.pem … 秘密 └── validation.pem 13年11月2日土曜日 ファイルが生成
  39. 39. Chefの構成完了! knife chef-server chef-client 13年11月2日土曜日
  40. 40. Cookbook 13年11月2日土曜日
  41. 41. Cookbookについて サーバーの設定に必要な スクリプト・ファイルテンプレート類 13年11月2日土曜日
  42. 42. Cookbookについて サーバーの設定に必要な スクリプト・ファイルテンプレート類 Rubyの設定スクリプト 13年11月2日土曜日
  43. 43. Cookbookについて サーバーの設定に必要な スクリプト・ファイルテンプレート類 Rubyの設定スクリプト Recipeに渡すパラメータ 13年11月2日土曜日
  44. 44. Cookbookについて サーバーの設定に必要な スクリプト・ファイルテンプレート類 Rubyの設定スクリプト Recipeに渡すパラメータ Providersに渡す パラメータの定義 13年11月2日土曜日
  45. 45. Cookbookについて サーバーの設定に必要な スクリプト・ファイルテンプレート類 Rubyの設定スクリプト Recipeに渡すパラメータ Providersに渡す パラメータの定義 設定ファイルテンプレート ファイルなど。 13年11月2日土曜日
  46. 46. Cookbookについて ディレクトリ構成 my_cookbook ├── CHANGELOG.md ├── README.md ├── attributes ├── files ├── metadata.rb ├── providers ├── resources ├── recipes └── templates 13年11月2日土曜日 Rubyの設定スクリプト Recipeに渡すパラメータ Providersに渡す パラメータの定義 設定ファイルテンプレート ファイルなど。
  47. 47. Cookbook(apache2) インストール&設定するCookbook 13年11月2日土曜日
  48. 48. Cookbook(mysql) インストール&設定するCookbook 13年11月2日土曜日
  49. 49. Cookbook(htpasswd) Recipeに設定内容を書きやすくする為のCookbook 13年11月2日土曜日
  50. 50. Cookbook(htpasswd) Basic認証用パスワードファイルを簡単に定義できる htpasswd "/etc/nginx/htpassword" do user "foo" password "bar" end 13年11月2日土曜日
  51. 51. Cookbook(htpasswd) Basic認証用パスワードファイルを簡単に定義できる htpasswd "/etc/nginx/htpassword" do user "foo" password "bar" end ⇡はProvidersに定義されてます 13年11月2日土曜日
  52. 52. Cookbook(sudo) Recipeに設定内容を書きやすくする為のCookbook 13年11月2日土曜日
  53. 53. Cookbook(sudo) sudoの設定が簡単に! sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart'] end 13年11月2日土曜日
  54. 54. Cookbook(sudo) sudoの設定が簡単に! sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart'] end ※設定ミスると/etc/sudoersから大事な設定が消えて、 永遠にrootになれなくなるので気をつけましょう。 13年11月2日土曜日
  55. 55. Cookbook(sudo) sudoの設定が簡単に! sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart'] end ※設定ミスると/etc/sudoersから大事な設定が消えて、 永遠にrootになれなくなるので気をつけましょう。 13年11月2日土曜日
  56. 56. その他の標準Provider ディレクトリを作ります directory "/tmp/folder" do owner "root" group "root" mode 0755 action :create end 13年11月2日土曜日
  57. 57. その他の標準Provider ユーザーを作ります user "admin" do supports :manage_home => true comment "Admin User" uid 1234 gid "users" home "/home/admin" shell "/bin/bash" password "$1$JJsvHslV$szsCjVEroftprNn4JHtDi." end 13年11月2日土曜日
  58. 58. chef-client 13年11月2日土曜日
  59. 59. chef-clientについて chef-server 必要なCookbookを 取得して実行 chef-client 13年11月2日土曜日
  60. 60. chef-clientについて $ knife node edit Clientの名称 -e vi 実行結果(JSON): { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ ], "default": { }, "override": { }, ……… …… … Clientは自分のnodeのrun_listを もとにcookbookを実行 13年11月2日土曜日
  61. 61. cookbookの準備 .chefがある場所に、 cookbook置き場を作り、cookbookをアップロード $ mkdir cookbooks $ cd cookbooks $ git clone https://github.com/opscodecookbooks/apache2.git $ knife cookbook upload apache2 -o ./ 13年11月2日土曜日
  62. 62. run-listの編集 $ knife node edit Clientの名称 -e vi 実行結果(JSON): { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ recipe[apache2] , recipe[apache2::mod_rewrite] ], "default": { }, "override": { }, ……… …… 13年11月2日土曜日 run_listを編集し、 apache2をインストールして mod_rewriteを有効にする
  63. 63. run-listの編集 $ knife node edit Clientの名称 -e vi 実行結果(JSON): { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ recipe[apache2] , recipe[apache2::mod_rewrite] ], "default": { }, "override": { }, ……… …… 13年11月2日土曜日 recipe[cookbook名] or recipe[cookbook名::recipe名]
  64. 64. run-listの編集 $ knife node edit Clientの名称 -e vi 実行結果(JSON): { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ recipe[apache2] , recipe[apache2::mod_rewrite] ], "default": { }, "override": { }, ……… …… 13年11月2日土曜日 recipe[cookbook名] … recipes/default.rbを実行 recipe[cookbook名::recipe名] … recipes/mod_rewrite.rb を実行
  65. 65. chef-client実行 Clientにsshログインし、 # chef-client もしくはPCからknife sshコマンド実行 # knife ssh name:nodeの名称" -x Linuxユ ーザ名 "sudo chef-client" -i SSH ファイル -a ipaddress 13年11月2日土曜日
  66. 66. chef-client実行 Clientにsshログインし、 # chef-client もしくはPCからknife sshコマンド実行 # knife ssh name:nodeの名称" -x Linuxユ ーザ名 "sudo chef-client" -i SSH ファイル -a ipaddress node内のipaddressという値を使って接続 13年11月2日土曜日
  67. 67. DEMO 13年11月2日土曜日
  68. 68. nodeの用途 13年11月2日土曜日
  69. 69. nodeの用途 • run_listに実行するcookbookとレシピを定義 • cookbookに渡すパラメータを変更 • cookbookの処理結果を保存 13年11月2日土曜日
  70. 70. パラメータを変更 ↓こんな場合に行います • attributes/default.rbの設定値じゃ満足できない • そもそもデフォルト値だと動かない 13年11月2日土曜日
  71. 71. apache2の例 { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ], "apache": { "prefork": { "startservers" : "10", "minspareservers":"10", "maxspareservers":"10", "serverlimit":"512", "maxclients":"512" } } }, "run_list": [ recipe[apache2] , recipe[apache2::mod_rewrite] ], …… …… 13年11月2日土曜日 confに設定したい値を入れる cookbook内では node[:apache][:prefork][:startservers] 等の変数が使われてるので その値をnodeで上書きする
  72. 72. 処理結果の保存 • cookbookの実行が途中で失敗しても、再実行が行 えるようにする。(冪等性ていうらしい) • 自動作成したユーザーのパスワードなどを保存す る。 13年11月2日土曜日
  73. 73. mysqlの例 { "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ], "mysql": { "server_debian_password": ********************* , "server_root_password": "*********************", "server_repl_password": "*********************" } }, "run_list": [ recipe[apache2] , recipe[apache2::mod_rewrite] ], …… …… 13年11月2日土曜日 結構な機密情報が nodeには保存されます。。
  74. 74. nodeのバックアップ方法 knifeを使ってnodeをバックアップ # knife node show node名称 ̶format json > backup.json nodeのリストア # knife node from file backup.json 13年11月2日土曜日
  75. 75. Tips 13年11月2日土曜日
  76. 76. run_listが肥大化した "run_list": [ "recipe[php]", "recipe[apache2]", "recipe[apache2::mod_php5]", "recipe[apache2::mod_ssl]", "recipe[apache2::mod_rewrite]", "recipe[php::module_gd]", "recipe[php::module_mysql]", "recipe[php::module_pgsql]", "recipe[php::module_mbstring]", "recipe[php::module_xml]", "recipe[php::module_mcrypt]" ] 13年11月2日土曜日
  77. 77. run_listが肥大化した "run_list": [ "recipe[php]", "recipe[apache2]", "recipe[apache2::mod_php5]", "recipe[apache2::mod_ssl]", "recipe[apache2::mod_rewrite]", "recipe[php::module_gd]", "recipe[php::module_mysql]", "recipe[php::module_pgsql]", "recipe[php::module_mbstring]", "recipe[php::module_xml]", "recipe[php::module_mcrypt]" ] 13年11月2日土曜日 同じrun_listは roleを定義しよう
  78. 78. roleを定義 # knife role create wordpress -e vim { "name": "wordpress", "description": "", "json_class": "Chef::Role", roleのrun_listに設定 "recipe[php]", "default_attributes": { "recipe[apache2]", }, "recipe[apache2::mod_php5]", "override_attributes": { "recipe[apache2::mod_ssl]", }, "recipe[apache2::mod_rewrite]", "chef_type": "role", "recipe[php::module_gd]", "run_list": [ "recipe[php::module_mysql]", ], "recipe[php::module_pgsql]", "env_run_lists": { } } 13年11月2日土曜日 "recipe[php::module_mbstring]", "recipe[php::module_xml]", "recipe[php::module_mcrypt]"
  79. 79. role設定後 nodeのrun_listがスッキリします "run_list": [ "role[wordpress]" ] 13年11月2日土曜日
  80. 80. 御清聴 ありがとうございました 13年11月2日土曜日

×