SlideShare a Scribd company logo
今日から使い始めるChef

       2013-03-29
    Xtone Ltd. ピザ会
   (without pizza><)
     Aki / @nekoruri
いくつかの案件がChef管理に移行しました

必ず覚えて欲しいこと
Chef
• サーバの構成管理ツール
 – サーバの「完成状態」を書く      ここ全部
 – 「現状」との違いを判断する      Chefが
 – その差分を埋める          やってくれる
  •   パッケージのインストール
  •   設定ファイルの設置
  •   サービスの起動
  •   DBのユーザ作成
  •   ファイアウォール設定
  •   etc.
禁止事項
• サーバ上でrootで設定ファイル変更
禁止事項
• サーバ上でrootで設定ファイル変更




    Chefで設定戻されて突然の障害
使ってみる
1. Chefのレポジトリを取ってくる
2. rootで入れるサーバを一台作る
3. 対象サーバにchef-soloを入れる
  – knife solo prepare root@192.0.2.100
4. ノード設定を適当に書く
  – vim nodes/192.0.2.100.json
    {"run_list": ["role[base]"]}

5. chef起動
  – knife solo cook root@192.0.2.100
使ってみる
1. Chefのレポジトリを取ってくる
2. rootで入れるサーバを一台作る
3. 対象サーバにchef-soloを入れる
  – knife solo prepare root@192.0.2.100
4. ノード設定を適当に書く
  – vim nodes/192.0.2.100.json
    {"run_list": ["role[base]"]}
                                       以降はここだけ
5. chef起動
  – knife solo cook root@192.0.2.100
ざっくりChefのしくみのおさらい

ざっくりCHEFの紹介
Chef用語
• Resource
   – 設定の最小単位
   – ファイルやパッケージ単位の設定
• Recipe
   – 複数のResourceで構成されるひとまとまり
• Cookbook
   – Recipeをグループにまとめたもの
   – 一つのRecipeしか含まない場合もある

• レポジトリ(キッチン)
   – Chefの動作に必要なファイル群
   – 複数のCookbookや、ロール・ノードの設定を含む
Chef用語
• ノード
  – Chefで管理されるサーバ
• Role
  – ノードの役割を定義
  – 使うRecipeとか変数とかをここで設定する(抽象化)
• chef-solo
  – サーバ無しでChefを利用するコマンド
  – chef-soloを動かしたノード自身が操作対象となる
• knife-solo
  – 対象ノードにレポジトリを転送してchef-soloを動かす
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
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
Template
log_level 4
log_file /var/log/munin/munin-node.log
port 4949
pid_file /var/run/munin/munin-node.pid
background 1
setseid 1


# Which port to bind to;
host *                                               サーバ毎の設定を利用
user root
group <%= 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
# doesn't understand CIDR-style network notation. You may repeat
# the allow line as many times as you'd like
                                                       引き渡された変数を利用
allow ^127¥.0¥.0¥.1$
<% @munin_servers.sort.each do |server| -%>
cidr_allow <%= server %>
<% end -%>
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利用可能
新しいChefレポジトリを作って、
既存のCookbookを組み合わせて
自分用のRecipeを書いて
実際のノードに適用するまで

一からやってみる
レポジトリを作る
• 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'
opscode-cookbooks
• Chef開発元が公開しているCookbook集
 – オープンソースとして開発
 – Github上で公開
   https://github.com/opscode-cookbooks/
 – Ubuntuなら組み合わせるだけでそのまま使える
   ※ CentOSだとイマイチという意見多し(未確認)
 – knifeコマンドで取ってこれる
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をインポートできる
新しく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'
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'
             }
           }
         })
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"
               }
             }
         }
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"
          }
chef-solo実行
1. 対象サーバにchef-soloを入れる
  – knife solo prepare root@192.0.2.100
2. chef起動
  – knife solo cook root@192.0.2.100
ありがとうopscode-cookbooksありがとう

おすすめCOOKBOOK
apt
• aptレポジトリの更新
 – https://github.com/opscode-cookbooks/apt
 – 「include_recipe 'apt'」でapt-getしてくれる
 – 使わないと古いパッケージを取りに行き失敗
users::sysadminsとsudo
• ユーザ管理(users::sysadmins)
  – https://github.com/opscode-cookbooks/users
  – data_bagsにsysadminグループのユーザ設定を入
    れておくと勝手に作ってくれる
  – ユーザ追加の度にRecipeを変更しなくてよい
• sudoers管理(sudo)
  – 上記sysadminグループはデフォルトで入ってる
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も配る
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' }
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
関連情報
• 伊藤直也さんの電子書籍がベスト
  – 入門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
ぐぬぬ

悩んでいること
Unicorn環境
• unicorn::default
  – Unicorn gemいれる→普通Bundlerだし
  – 設定ファイル→アプリと一緒にデプロイするし
• application_ruby::unicorn
  – 似てるようで似てるだけのCapistranoデプロイと
    いまいち相性が悪い!
  – runitでUnicornのプロセス自動再起動!すごい!

  – graceful restartさせると死ぬ!すごい!!1
OpsWorks
• AWS + Chef
  – http://aws.amazon.com/jp/opsworks/
  – AWS提供のChef Cookbookを組み合わせる
  – まだ遊んでない
その他のアプローチ
• RightScale / Scalr
  – もう一つ上のレイヤーでの構成管理したい派
  – Xtoneでも某ゲーム案件で利用


• PaaS
  – そもそもミドルウェアなんて面倒みたくない派
  – Heroku、EngineYard、 AWS Elastic Beanstalk
    ニフクラC4SA、IIJ Mogok

More Related Content

PDF
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
PPTX
Puppetのススメ
PDF
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
PDF
ChefとPuppetの比較
PPTX
ネットワークエンジニアのための Puppet / Chef
PDF
Webサーバ勉強会03
PDF
第1回 一撃サーバー構築シェルスクリプト勉強会
PPTX
Cloudstack user group meeting in osaka
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
Puppetのススメ
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
ChefとPuppetの比較
ネットワークエンジニアのための Puppet / Chef
Webサーバ勉強会03
第1回 一撃サーバー構築シェルスクリプト勉強会
Cloudstack user group meeting in osaka

What's hot (20)

PDF
Webサーバのチューニング
PDF
Hadoop on LXC
PDF
Ansible handson
PDF
Ansible入門
PDF
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
PDF
Puppet on AWS
PPTX
中小規模サービスのApacheチューニング
KEY
Fabricでサーバー管理をDRYにしよう
PDF
Hive undocumented feature
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
PDF
Ansible quickstart
PDF
Ansible handson ood2016
PDF
Ansible 入門 #01 (初心者向け)
PDF
2日間Fabricを触った俺が
 色々解説してみる
PDF
動画共有ツール
PDF
ノンプログラマのためのウェブサーバ入門
PPTX
Itamae-Serverspec入門
PDF
Okinawa Open Days 2015 Handson - Ansible
PDF
Sqale の Puppet と Chef (と テスト)
PPTX
OSC Tokyo fall LT~Dockerで分散処理をやってみた
Webサーバのチューニング
Hadoop on LXC
Ansible handson
Ansible入門
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
Puppet on AWS
中小規模サービスのApacheチューニング
Fabricでサーバー管理をDRYにしよう
Hive undocumented feature
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansible quickstart
Ansible handson ood2016
Ansible 入門 #01 (初心者向け)
2日間Fabricを触った俺が
 色々解説してみる
動画共有ツール
ノンプログラマのためのウェブサーバ入門
Itamae-Serverspec入門
Okinawa Open Days 2015 Handson - Ansible
Sqale の Puppet と Chef (と テスト)
OSC Tokyo fall LT~Dockerで分散処理をやってみた
Ad

Viewers also liked (18)

PPTX
qpstudy 2014.04 ミドルウェア設計の勘所
PPT
5分で分かるcron
PDF
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
PDF
20140704 cassandra introduction
PDF
ChefとCapistranoの境界線 (Chef Casual Talks Vol.1) #eytokyo #opschef_ja
PDF
Chef Howto with Vagrant + Berkshelf
PDF
セキュリティ・キャンプ参加してみた #ssmjp #seccamp
PDF
今期の好きなアニメ「アイドルマスターシンデレラガールズ」 #infrapre
PDF
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発
PDF
クラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccamp
PDF
OAuth 2.0の概要とセキュリティ
PPTX
エンジニアが知っておくべきSSL/TLSの知識(仮)
ODP
qpstudy 〜初心者にやさしいインフラ勉強会〜 の紹介
PDF
TwitterのOAuth脆弱性
PDF
クラウドセキュリティ基礎 #seccamp
PPTX
15分で分か(った気になれ)るDocker
PPTX
Api gatewayの話
qpstudy 2014.04 ミドルウェア設計の勘所
5分で分かるcron
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
20140704 cassandra introduction
ChefとCapistranoの境界線 (Chef Casual Talks Vol.1) #eytokyo #opschef_ja
Chef Howto with Vagrant + Berkshelf
セキュリティ・キャンプ参加してみた #ssmjp #seccamp
今期の好きなアニメ「アイドルマスターシンデレラガールズ」 #infrapre
クリスマス直前! HTML5 で作る♥ はじめての iOS & Android アプリ開発
クラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccamp
OAuth 2.0の概要とセキュリティ
エンジニアが知っておくべきSSL/TLSの知識(仮)
qpstudy 〜初心者にやさしいインフラ勉強会〜 の紹介
TwitterのOAuth脆弱性
クラウドセキュリティ基礎 #seccamp
15分で分か(った気になれ)るDocker
Api gatewayの話
Ad

Similar to 今日から使い始めるChef (20)

PDF
シンプルなシステム構成フレームワークalnair
PDF
12 cyberagent
KEY
Itcamp長崎2012 capistrano
PDF
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
PDF
入門 Chef Server #biglobetechtalk
PDF
Mina 20130417
PDF
Capistrano
PDF
恋に落ちるデプロイツール
PPTX
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
KEY
Mysql casial01
PDF
成長を加速する minne の技術基盤戦略
ODP
Rubyで楽々サーバー管理 - 岡山Ruby会議01 -
PDF
20140612_Docker上でCloudStackを動かしてみる!!
PDF
Chef社内勉強会(第1回)
PDF
環境構築自動化ツールのご紹介
PDF
130412 kayac-cinnamon
PDF
Cinnamon - simple deploy tool
PDF
ChefユーザのためのAnsible入門
PDF
Yohes kitchen
PDF
シンプルなシステム構成フレームワークalnair
12 cyberagent
Itcamp長崎2012 capistrano
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
入門 Chef Server #biglobetechtalk
Mina 20130417
Capistrano
恋に落ちるデプロイツール
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
Mysql casial01
成長を加速する minne の技術基盤戦略
Rubyで楽々サーバー管理 - 岡山Ruby会議01 -
20140612_Docker上でCloudStackを動かしてみる!!
Chef社内勉強会(第1回)
環境構築自動化ツールのご紹介
130412 kayac-cinnamon
Cinnamon - simple deploy tool
ChefユーザのためのAnsible入門
Yohes kitchen

More from Masahiro NAKAYAMA (20)

PDF
ハッカソンについて(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
PDF
イントロダクション(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
PDF
クラウド時代のものづくり(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
PDF
めもおきば新刊のお知らせ サーバーレスでHelloWorldする25の方法 #ssmjp
PDF
クラウド時代における分散Webシステムの構成とスケーリング #seccamp
PDF
#ServerlessDays Tokyo 2019 「サーバーレス」な同人誌の紹介
PDF
サーバーレス時代の システム設計ワークショップ
PDF
#ssmjp 2018/12 技術系同人誌を手に入れよう
PDF
FaaSのインターフェースに見るサーバーレス #serverlessconf #serverlesstokyo
PDF
クラウドでハンズオンする話 #ssmjp
PPTX
SORACOMでデータ上げてクラウドで分析・可視化するハンズオン #SecHack365
PDF
IoT時代のセキュアなクラウドインフラ構築術 #seccamp
PDF
Serverless book
PDF
クラウドではじめるリアルタイムデータ分析 #seccamp
PPTX
技術系同人誌を書こう #ssmjp
PDF
「サーバレスの薄い本」からの1年 #serverlesstokyo
PDF
BluetoothメッシュによるIoTシステムを支えるサーバーレス技術 #serverlesstokyo
PDF
IoT(Bluetooth mesh) × サーバーレス
PDF
Serverless Architecture Overview #cdevc
PDF
細かすぎて伝わらないSORACOM Funnelのオプション紹介 #soracomug
ハッカソンについて(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
イントロダクション(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
クラウド時代のものづくり(分散アーキテクチャ時代におけるWebシステムの開発と運用) #seccamp
めもおきば新刊のお知らせ サーバーレスでHelloWorldする25の方法 #ssmjp
クラウド時代における分散Webシステムの構成とスケーリング #seccamp
#ServerlessDays Tokyo 2019 「サーバーレス」な同人誌の紹介
サーバーレス時代の システム設計ワークショップ
#ssmjp 2018/12 技術系同人誌を手に入れよう
FaaSのインターフェースに見るサーバーレス #serverlessconf #serverlesstokyo
クラウドでハンズオンする話 #ssmjp
SORACOMでデータ上げてクラウドで分析・可視化するハンズオン #SecHack365
IoT時代のセキュアなクラウドインフラ構築術 #seccamp
Serverless book
クラウドではじめるリアルタイムデータ分析 #seccamp
技術系同人誌を書こう #ssmjp
「サーバレスの薄い本」からの1年 #serverlesstokyo
BluetoothメッシュによるIoTシステムを支えるサーバーレス技術 #serverlesstokyo
IoT(Bluetooth mesh) × サーバーレス
Serverless Architecture Overview #cdevc
細かすぎて伝わらないSORACOM Funnelのオプション紹介 #soracomug

今日から使い始めるChef

  • 1. 今日から使い始めるChef 2013-03-29 Xtone Ltd. ピザ会 (without pizza><) Aki / @nekoruri
  • 3. Chef • サーバの構成管理ツール – サーバの「完成状態」を書く ここ全部 – 「現状」との違いを判断する Chefが – その差分を埋める やってくれる • パッケージのインストール • 設定ファイルの設置 • サービスの起動 • DBのユーザ作成 • ファイアウォール設定 • etc.
  • 5. 禁止事項 • サーバ上でrootで設定ファイル変更 Chefで設定戻されて突然の障害
  • 6. 使ってみる 1. Chefのレポジトリを取ってくる 2. rootで入れるサーバを一台作る 3. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.100 4. ノード設定を適当に書く – vim nodes/192.0.2.100.json {"run_list": ["role[base]"]} 5. chef起動 – knife solo cook root@192.0.2.100
  • 7. 使ってみる 1. Chefのレポジトリを取ってくる 2. rootで入れるサーバを一台作る 3. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.100 4. ノード設定を適当に書く – vim nodes/192.0.2.100.json {"run_list": ["role[base]"]} 以降はここだけ 5. chef起動 – knife solo cook root@192.0.2.100
  • 9. Chef用語 • Resource – 設定の最小単位 – ファイルやパッケージ単位の設定 • Recipe – 複数のResourceで構成されるひとまとまり • Cookbook – Recipeをグループにまとめたもの – 一つのRecipeしか含まない場合もある • レポジトリ(キッチン) – Chefの動作に必要なファイル群 – 複数のCookbookや、ロール・ノードの設定を含む
  • 10. Chef用語 • ノード – Chefで管理されるサーバ • Role – ノードの役割を定義 – 使うRecipeとか変数とかをここで設定する(抽象化) • chef-solo – サーバ無しでChefを利用するコマンド – chef-soloを動かしたノード自身が操作対象となる • knife-solo – 対象ノードにレポジトリを転送してchef-soloを動かす
  • 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. 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. Template log_level 4 log_file /var/log/munin/munin-node.log port 4949 pid_file /var/run/munin/munin-node.pid background 1 setseid 1 # Which port to bind to; host * サーバ毎の設定を利用 user root group <%= 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 # doesn't understand CIDR-style network notation. You may repeat # the allow line as many times as you'd like 引き渡された変数を利用 allow ^127¥.0¥.0¥.1$ <% @munin_servers.sort.each do |server| -%> cidr_allow <%= server %> <% end -%>
  • 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利用可能
  • 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. opscode-cookbooks • Chef開発元が公開しているCookbook集 – オープンソースとして開発 – Github上で公開 https://github.com/opscode-cookbooks/ – Ubuntuなら組み合わせるだけでそのまま使える ※ CentOSだとイマイチという意見多し(未確認) – knifeコマンドで取ってこれる
  • 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. 新しく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. 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. 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. 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. chef-solo実行 1. 対象サーバにchef-soloを入れる – knife solo prepare root@192.0.2.100 2. chef起動 – knife solo cook root@192.0.2.100
  • 25. apt • aptレポジトリの更新 – https://github.com/opscode-cookbooks/apt – 「include_recipe 'apt'」でapt-getしてくれる – 使わないと古いパッケージを取りに行き失敗
  • 26. users::sysadminsとsudo • ユーザ管理(users::sysadmins) – https://github.com/opscode-cookbooks/users – data_bagsにsysadminグループのユーザ設定を入 れておくと勝手に作ってくれる – ユーザ追加の度にRecipeを変更しなくてよい • sudoers管理(sudo) – 上記sysadminグループはデフォルトで入ってる
  • 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. 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. 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. 関連情報 • 伊藤直也さんの電子書籍がベスト – 入門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
  • 32. Unicorn環境 • unicorn::default – Unicorn gemいれる→普通Bundlerだし – 設定ファイル→アプリと一緒にデプロイするし • application_ruby::unicorn – 似てるようで似てるだけのCapistranoデプロイと いまいち相性が悪い! – runitでUnicornのプロセス自動再起動!すごい! – graceful restartさせると死ぬ!すごい!!1
  • 33. OpsWorks • AWS + Chef – http://aws.amazon.com/jp/opsworks/ – AWS提供のChef Cookbookを組み合わせる – まだ遊んでない
  • 34. その他のアプローチ • RightScale / Scalr – もう一つ上のレイヤーでの構成管理したい派 – Xtoneでも某ゲーム案件で利用 • PaaS – そもそもミドルウェアなんて面倒みたくない派 – Heroku、EngineYard、 AWS Elastic Beanstalk ニフクラC4SA、IIJ Mogok