なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

Chef + Vagrant + Berkshelf の連携

前回の続き、nantonaku-shiawase.hatenablog.com

ツールについての概要

・chefはcookbookというスクリプトの集合を使って、そのスクリプトの通りにソフトウェアをインストールする
・cookbookはいろいろな人が公開している

しかし、他人の使ったcookbookを自ら改造したりするのは車輪の再発明だし、ごちゃごちゃになってしまう。
そこで登場するのがBerkshelfだ。

Berkshelfはこれまたrubyで出来たソフトウェア。Berksfileに必要なパッケージを書くことで、常に最新のchefのcookbookをインストールしてくれる。さらには依存関係についても設定できるらしい。つってもこの辺のソフトウェアは日進月歩で何をやろうにもごちゃごちゃしている、はよ淘汰されて枯れなさい!

Berkshelfを使った場合のVagrantfileの構成

Berkshelfを使用するとVagrantfileに書いてやる。そうするとvagrant upしたときにBerkshelfがまずアップデートされる。
下の方に解説をば…

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

   # Every Vagrant virtual environment requires a box to build off of.
   config.vm.box     = "fedora-20"
   config.vm.box_url = "https://dl.dropboxusercontent.com/u/15733306/vagrant/fedora-20-netinst-2014_01_05-minimal-puppet-guestadditions.box"
   config.omnibus.chef_version = :latest
   config.berkshelf.enabled = true

   # use chef_solo
   config.vm.provision "chef_solo" do |chef|
      chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
      chef.run_list = [
                       "recipe[yum]",
                       "recipe[apache2]",
                       "recipe[apache2::mod_php5]",
                       "recipe[apache2::mod_rewrite]",
                       "recipe[php]",
                       "recipe[cpan]",
                       "recipe[git]"
                      ]
      # original cookbook
      chef.add_recipe 'foltia::default'
   end
end
config.omnibus.chef_version = :latest

前回の記事ではomnibus installerを生のシェルスクリプトで実行していたが、Vagrantプラグインを使用すると、この1行でゲスト環境へのchefのインストールが完了する。

config.berkshelf.enabled = true

いるのかわからん。

chef.run_list

後述のBerksfileで指定したcookbookを実行する

Berkshelfの構成

Berksfile

・1行目は「source 'https://api.berkshelf.com'」と書くのが最新の文法らしい
・最後の行にローカルのcookbookを指定している。これをしないとchefが実行されない!

source 'https://api.berkshelf.com'

cookbook "php"
cookbook "apache2"
cookbook "git"
cookbook "cpan"

cookbook "foltia",  path: "./site-cookbooks/foltia"

参考にしました
captnswing: How I use Vagrant with chef-solo

依存関係ライブラリの使用法

foltiaはいくつかcpanのライブラリを使用する。この時はsite-cookbooks//metadata.rbにdependsを書いてやる。cookbooks内に直接処理を書いたりするのはお行儀が悪い。

$ cat ./site-cookbooks/foltia/metadata.rb
name             'foltia'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures foltia'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends          'cpan'

dependsに依存関係を書いてやれば、include_recipeすれば、そのレシピで定義された機能が使えるはず。(使えるけどエラーが出る場合もある)

$ cat ./site-cookbooks/foltia/recipes/default.rb
#
# Cookbook Name:: foltia
# Recipe:: default
#
# Copyright 2015, Hiroyuki Nagata
#
# All rights reserved - Do Not Redistribute
#

include_recipe 'cpan::bootstrap'

cpan_client 'Time::HiRes' do
    action 'install'
    install_type 'cpan_module'
    user 'root'
    group 'root'
end