Require
Chef,
ruby_block,

Chefのrecipe内でgemを追加してロードする

目的

Chefのrecipe内でgemを追加してロードする方法を紹介します。
ここでは、recipeのリソース"ruby_block"で'deep_merge'をロードする例を紹介します。
一応、インターネット接続がないChef clientでも動くように考慮します。

構成

OSはRHEL7.3,ChefはServer Client方式。
利用したChef Clientは13.4.24-1.el7, Chef Serverは12.16.14-1.el7

手順

deep_merge-1.2.1.gemをダウンロードして、cookbookのfiles/default以下に配置しておきます。

以下recipeのサンプルです。

cookbook_file "/tmp/deep_merge-1.2.1.gem" do
  source "deep_merge-1.2.1.gem"
end

execute "deep_merge install" do
  command "/opt/chef/embedded/bin/gem install --local /tmp/deep_merge-1.2.1.gem"
  notifies :run, "ruby_block[sample ruby block]"
end

ruby_block 'sample ruby block' do
  block do
    require 'json'
    $LOAD_PATH << '/opt/chef/embedded/lib/ruby/gems/2.4.0/gems/deep_merge-1.2.1/lib'
    require 'deep_merge'

    ~~deep_mergeを利用した処理~~

  end
  action :nothing
end

以上