80
入門 13112日土曜日

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

入門13年11月2日土曜日

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

自己紹介

• Twitter: @ogatomo• 好きなもの:Emacs, Ruby, AWS, Railsなど

小川 智和(おがわ ともかず)

13年11月2日土曜日

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

Chefについて

• Opscode社が開発したConfiguration Management Tools

• サーバーの設定に必要なスクリプトや設定ファイルを一元管理

• サーバーの初期設定や設定変更の自動化

13年11月2日土曜日

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

Chefの構成

13年11月2日土曜日

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

Chefの構成

13年11月2日土曜日

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

Chefの構成

13年11月2日土曜日

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

Chefの構成

13年11月2日土曜日

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

Chefの構成chef-server

13年11月2日土曜日

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

Chefの構成chef-server

chef-client13年11月2日土曜日

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

Chefの構成chef-server

chef-client

knife

13年11月2日土曜日

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

Chefの役割

apachemysqlrubynginx

等のインストール& 設定

Railsアプリのデプロイ

サーバー自体(CPU,HDD,メモリ)やネットワークの準備

13年11月2日土曜日

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

Chefの役割

AWSその他Cloud

apachemysqlrubynginx

等のインストール& 設定

Railsアプリのデプロイ

サーバー自体(CPU,HDD,メモリ)やネットワークの準備

13年11月2日土曜日

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

Chefの役割

AWSその他Cloud

Chefapachemysqlrubynginx

等のインストール& 設定

Railsアプリのデプロイ

サーバー自体(CPU,HDD,メモリ)やネットワークの準備

13年11月2日土曜日

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

Chefの役割

AWSその他Cloud

Chefapachemysqlrubynginx

等のインストール& 設定

CapistranoRailsアプリのデプロイ

サーバー自体(CPU,HDD,メモリ)やネットワークの準備

13年11月2日土曜日

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

Chefの役割

AWSその他Cloud

Chefapachemysqlrubynginx

等のインストール& 設定

CapistranoRailsアプリのデプロイ

サーバー自体(CPU,HDD,メモリ)やネットワークの準備

OS等の違いを吸収

13年11月2日土曜日

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

構築方法

13年11月2日土曜日

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

各種サーバー準備

先日の広島OSCで、無料クーポン頂きました!

13年11月2日土曜日

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

chef-server構築chef-server

13年11月2日土曜日

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

chef-server構築

• Ubuntu 12.04

• スワップ有り(AWSのmicroだと厳しい)

• さくらクラウド

13年11月2日土曜日

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

chef-server構築http://www.opscode.com/chef/install/

URLコピー

13年11月2日土曜日

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

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日土曜日

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

chef-server構築

$ 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 ⏎

DNSに設定したURLを以下の設定ファイルに入れておく

13年11月2日土曜日

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

chef-server構築

• /etc/chef-server/chef-validator.pem

上記ファイルをサーバーからダウンロード(秘密鍵ファイルなので扱い注意!!)

• chef-serverにClientを登録する場合などに必要

13年11月2日土曜日

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

knifeの構築knife

13年11月2日土曜日

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

knifeの構築https://chef-serverのURL

Adminにチェック

クリックして管理Client作成

13年11月2日土曜日

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

knifeの構築秘密鍵の文字列を

全部コピー

13年11月2日土曜日

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

knifeの構築

.chef├── knife.pem … knifeユーザーの秘密鍵をコピー├── knife.rb … 空のファイルで良い└── validation.pem … chef-serverからDLした            chef-validator.pem

以下の階層でディレクトリとファイル作成(場所はどこでも良い)

13年11月2日土曜日

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

knifeの構築

$ gem install chef ⏎

13年11月2日土曜日

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

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日土曜日

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

knifeの構築

$ knife client list ⏎

chef-validator chef-webui knife

動作確認の為、登録済みClient一覧取得

実行結果:

13年11月2日土曜日

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

chef-client構築

chef-client13年11月2日土曜日

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

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日土曜日

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

chef-client構築

/etc/chef├── client.rb … chef-client用設定ファイル└── validation.pem … chef-serverからDLした            chef-validator.pem

以下の階層でディレクトリとファイル作成

13年11月2日土曜日

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

chef-client構築

chef_server_url "https://chef-serverのURL"node_name "Clientの名称"

/etc/chef/client.rb の内容

13年11月2日土曜日

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

chef-clientの構築

$ knife client list ⏎

chef-validator chef-webui knife Clientの名称

実行結果:

13年11月2日土曜日

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

chef-clientの構築

$ knife node list ⏎

Clientの名称実行結果:

13年11月2日土曜日

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

chef-clientの構築$ knife node edit Clientの名称 -e vi ⏎実行結果(JSON):{ "name": "chef-client01", "chef_environment": "_default", "normal": { "tags": [ ] }, "run_list": [ ], "default": { }, "override": { },………………

chef-clientが収集した環境の情報

(IPアドレスや、OSの種類など)

13年11月2日土曜日

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

chef-client構築# chef-client ⏎Clientをchef-serverに登録

/etc/chef├── client.rb├── client.pem … 秘密鍵ファイルが生成└── validation.pem

13年11月2日土曜日

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

Chefの構成完了!chef-server

chef-client

knife

13年11月2日土曜日

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

Cookbook

13年11月2日土曜日

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

Cookbookについてサーバーの設定に必要な

スクリプト・ファイルテンプレート類

13年11月2日土曜日

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

Cookbookについてサーバーの設定に必要な

スクリプト・ファイルテンプレート類

Rubyの設定スクリプト

13年11月2日土曜日

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

Cookbookについてサーバーの設定に必要な

スクリプト・ファイルテンプレート類

Rubyの設定スクリプトRecipeに渡すパラメータ

13年11月2日土曜日

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

Cookbookについてサーバーの設定に必要な

スクリプト・ファイルテンプレート類

Rubyの設定スクリプトRecipeに渡すパラメータProvidersに渡すパラメータの定義

13年11月2日土曜日

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

Cookbookについてサーバーの設定に必要な

スクリプト・ファイルテンプレート類

Rubyの設定スクリプトRecipeに渡すパラメータProvidersに渡すパラメータの定義設定ファイルテンプレートファイルなど。

13年11月2日土曜日

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

Cookbookについてmy_cookbook├── CHANGELOG.md├── README.md├── attributes├── files├── metadata.rb├── providers├── resources├── recipes└── templates

Rubyの設定スクリプトRecipeに渡すパラメータProvidersに渡すパラメータの定義設定ファイルテンプレートファイルなど。

ディレクトリ構成

13年11月2日土曜日

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

Cookbook(apache2)インストール&設定するCookbook

13年11月2日土曜日

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

Cookbook(mysql)インストール&設定するCookbook

13年11月2日土曜日

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

Cookbook(htpasswd)Recipeに設定内容を書きやすくする為のCookbook

13年11月2日土曜日

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

Cookbook(htpasswd)Basic認証用パスワードファイルを簡単に定義できる

htpasswd "/etc/nginx/htpassword" do user "foo" password "bar"end

13年11月2日土曜日

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

Cookbook(htpasswd)Basic認証用パスワードファイルを簡単に定義できる

htpasswd "/etc/nginx/htpassword" do user "foo" password "bar"end

⇡はProvidersに定義されてます

13年11月2日土曜日

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

Cookbook(sudo)Recipeに設定内容を書きやすくする為のCookbook

13年11月2日土曜日

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

Cookbook(sudo)sudoの設定が簡単に!

sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart']end

13年11月2日土曜日

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

Cookbook(sudo)sudoの設定が簡単に!

sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart']end

※設定ミスると/etc/sudoersから大事な設定が消えて、永遠にrootになれなくなるので気をつけましょう。

13年11月2日土曜日

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

Cookbook(sudo)sudoの設定が簡単に!

sudo 'tomcat' do user "%tomcat" runas 'app_user' commands ['/etc/init.d/tomcat restart']end

※設定ミスると/etc/sudoersから大事な設定が消えて、永遠にrootになれなくなるので気をつけましょう。

13年11月2日土曜日

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

その他の標準Provider

directory "/tmp/folder" do owner "root" group "root" mode 0755 action :createend

ディレクトリを作ります

13年11月2日土曜日

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

その他の標準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日土曜日

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

chef-client

13年11月2日土曜日

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

chef-clientについてchef-server

chef-client

必要なCookbookを取得して実行

13年11月2日土曜日

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

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日土曜日

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

cookbookの準備

$ mkdir cookbooks ⏎$ cd cookbooks ⏎$ git clone https://github.com/opscode-cookbooks/apache2.git ⏎

$ knife cookbook upload apache2 -o ./ ⏎

.chefがある場所に、cookbook置き場を作り、cookbookをアップロード

13年11月2日土曜日

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

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": { },……………

run_listを編集し、apache2をインストールしてmod_rewriteを有効にする

13年11月2日土曜日

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

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": { },……………

recipe[cookbook名]orrecipe[cookbook名::recipe名]

13年11月2日土曜日

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

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": { },……………

recipe[cookbook名] … recipes/default.rbを実行

recipe[cookbook名::recipe名] … recipes/mod_rewrite.rb を実行

13年11月2日土曜日

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

chef-client実行# chef-client ⏎ Clientにsshログインし、

もしくはPCからknife sshコマンド実行

# knife ssh “name:nodeの名称" -x Linuxユーザ名 "sudo chef-client" -i SSH鍵ファイル -a ipaddress

13年11月2日土曜日

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

chef-client実行# chef-client ⏎ Clientにsshログインし、

もしくはPCからknife sshコマンド実行

# knife ssh “name:nodeの名称" -x Linuxユーザ名 "sudo chef-client" -i SSH鍵ファイル -a ipaddress

node内のipaddressという値を使って接続

13年11月2日土曜日

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

DEMO

13年11月2日土曜日

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

nodeの用途

13年11月2日土曜日

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

nodeの用途

• run_listに実行するcookbookとレシピを定義

• cookbookに渡すパラメータを変更

• cookbookの処理結果を保存

13年11月2日土曜日

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

パラメータを変更

• attributes/default.rbの設定値じゃ満足できない

• そもそもデフォルト値だと動かない

↓こんな場合に行います

13年11月2日土曜日

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

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]” ], …………

confに設定したい値を入れるcookbook内ではnode[:apache][:prefork][:startservers]等の変数が使われてるのでその値をnodeで上書きする

13年11月2日土曜日

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

処理結果の保存

• cookbookの実行が途中で失敗しても、再実行が行えるようにする。(冪等性ていうらしい)

• 自動作成したユーザーのパスワードなどを保存する。

13年11月2日土曜日

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

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]” ], …………

結構な機密情報がnodeには保存されます。。

13年11月2日土曜日

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

nodeのバックアップ方法

# knife node show node名称 ̶format json > backup.json

# knife node from file backup.json

knifeを使ってnodeをバックアップ

nodeのリストア

13年11月2日土曜日

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

Tips

13年11月2日土曜日

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

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日土曜日

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

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]" ]

同じrun_listはroleを定義しよう

13年11月2日土曜日

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

roleを定義# knife role create wordpress -e vim ⏎

{ "name": "wordpress", "description": "", "json_class": "Chef::Role", "default_attributes": { }, "override_attributes": { }, "chef_type": "role", "run_list": [], "env_run_lists": { }}

"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]"

roleのrun_listに設定

13年11月2日土曜日

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

role設定後

"run_list": [ "role[wordpress]" ]

nodeのrun_listがスッキリします

13年11月2日土曜日

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

御清聴ありがとうございました

13年11月2日土曜日