Chef Provisioningのすすめ


2013年、伊藤直也さんが書かれた「入門Chef Solo」から、Chefを使ったサーバープロビジョニングのコード化が注目されましたが、その当時日本ではスタンダードだったChef Solo(+ Knife Solo)が引退していくことになってしまいました。
その難民がKnife Zeroに移行したり、Chef特有の仕様に挫折してAnsibleへと移行していった人も多いかと思いますが、それ以外の選択肢として、Chef社がコミットしている「Chef Provisioning」(旧名:Chef Metal)もなかなか使い勝手のよいツールに仕上がってきているので、紹介してみたいと思います!

(記事後半で実際にプロビジョニングをする例を挙げていますが、シンプルにCookbookを適用するだけなら本当に簡単です!)

Chef Provisioningとは

  • 従来のChef Solo + Knife Soloの代わりとなりえる、公式のプロビジョニングツール
    • ssh経由でプロビジョニング(Cookbookを適用)できる
    • AWSのEC2やDokcerイメージを作ってCookbookを適用することも可能
  • 複数サーバーの構成をテキストファイルで管理できる
    • Master-Slave構成やクラスタを組むようなアプリケーション設定も
  • 作業マシン上にChef Zero(簡易Chef Server)を動的に立ち上げ、プロビジョニング対象マシンがそこに接続する

Chef Solo(Knife Solo)と比べて

  • Chef Soloは引退…
    • Chef SoloとChef Serverは機能が異なっていたが、Chef ProvisioningはChef Zeroを利用してるため、Chef Serverと同等の機能が利用可能
  • スタンドアローンなChef Soloを、Knife Soloを利用することで複数サーバーへの適用ができたが、あくまで1サーバーへのプロビジョニングが基本

Chef Serverと比べて

  • 導入が容易
  • 構成をブラウザで管理しないのであれば

Knife Zeroと比べて

  • 同じくChef Zeroを利用しているが、何をするでも(gitのように)knifeコマンドを多用するため、覚えることが多い
  • Chef ProvisioningはChef社公式ツールなので、今後もメンテナンスされていきそう

Ansibleと比べて

  • DSLがRubyそのものなので、Rubyになれてればyamlで記述するより利便性が高いコードが書ける
    • ifやループはもちろん、rubyでできることならなんでも
  • Chef Supermarketで様々なコミュニティCookbookが公開されている
  • Chefと違って対象サーバーに特定のソフトウェアをインストールする必要はない
    • Chefのインストール作業はコマンド一発でできる

Chef Provisioning実行環境のセットアップ

※なるべく手数が少なくわかりやすい方法で案内します

Chef Provisioningのインストール

Chef社提供のパッケージ Chef Development Kit (ChefDK) からインストールすれば、Chef実行に必要なツールがruby含めて一式そろうので、お勧めです。

※ /opt/chefdk/ 以下にrubyやchefコマンドが配置されるので、すでにrubyがインストール済みでも影響しません

  1. ChefDKのダウンロード&インストール
    https://downloads.chef.io/chef-dk/
    からLinuxやWindows,Mac用パッケージを落としてきて、作業マシンにインストールします

  2. chef-provisioning-sshのインストール
    ChefDKにはchef-provisioningも同梱されてますが、ssh経由でセットアップするドライバは無いので、別途インストールします

    $ chef gem install chef-provisioning-ssh --no-ri --no-rdoc
    

    chef gem とすると、ChefDKでインストールしたruby gemでinstallされます
    ※現状、chef-provisioning-aws, vagrantは同梱されてますが、chef-provisioning-dockerも未同梱でした

Chef Provisioning実行のための構成

Cookbookの取得

※ここでは例としてjavaのインストールをします
※Cookbookの取得には、依存するものも含め取得するBerkshelfを利用します

  1. ディレクトリ作成 & その中に入る

  2. "Berksfile"という名前のファイルに次の内容で保存

    Berksfile
    source "https://supermarket.getchef.com"
    cookbook 'java'
    
  3. Berkshelfの記載内容を読み取って、"cookbooks"ディレクトリにjavaのcookbookをダウンロード

    $ berks vendor cookbooks
    

chef-provisioning-sshの実行ファイル作成

  1. 適当なファイル名の(例えばサーバー名の)rubyファイルを作成
    ※各自の環境にあわせて、sshのホスト・ユーザー名・鍵ファイル置き場など変更してください

    server1.rb
    require 'chef/provisioning'
    require 'chef/provisioning/ssh_driver'
    with_driver 'ssh'
    machine "server1" do
      machine_options :transport_options => {
        'ip_address' => '111.111.111.111',
        'username' => 'ec2-user',
        'ssh_options' => {
          'port' => 22,
          'keys' => ['~/.ssh/id_rsa']
        }
      }
      add_machine_options :convergence_options => {:chef_version => 'true'}
      run_list ['java']
      action [:converge]
    end
    

chef-provision-sshの実行

  1. chef zeroを起動(-zオプション)して、chef-clientコマンドで先ほどのrubyファイルを指定して実行

    $ chef-client -z server1.rb
    

これにて完了です。
Chef実行に必要なものがChefDKのインストール一発でだいたい入ってしまうことも関係しますが、従来よりだいぶ簡単に実行できるようになってますね!

Chef Provisioning をさらに使いやすくする独自拡張

これだけでも十分簡単にできますが、実際のサーバーに対して使うにあたって、より利便性を高くする改良をしてみました
※Chef Provisioningのソースコードには手は加えていません

  • 複数環境(開発・本番等)、複数roleの混在する設定、を1つのテキストファイルで管理
  • site-cookbooksのサポート
  • ssh接続のアカウント(初回はrootユーザーでセットアップ、次回以降はadminユーザーで)

と・・、このことをきちんと書くとさらに文量が多くなってしまうので、中途半端ですが一旦ここで終わりにします。もしまだまだChefで戦ってくぞ!という方が多ければ、続きを別の記事で書いてみようと思います。