InSpecでchefのattributeを使う


目的

Chefの実行時に利用したattributeを、InSpecでも同様に利用する方法を紹介します。
recipeでは、node objectのattributeを"node['apache']['dir']"といった表記で呼び出すことができます。
同様に、InSpecでも"node['apache']['dir']"といった表記でnode objectのattributeを呼び出せるようにします。

構成

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

手順

  1. 事前準備
  2. ChefのRecipeでnode objectをJSONファイルに出力
  3. InSpecでJSONファイルの読み込み、attributeを呼び出す

1.事前準備

以下のコマンドで、Clientにgem 'deep_merge'をインストールします。

/opt/chef/embedded/bin/gem install deep_merge

2.ChefのRecipeでnode objectをJSONファイルに出力

cookbookを作成し、以下のrecipeを追加します。

ruby_block 'Save node attributes' do
  block do
    require 'json'
    require 'deep_merge'

    new_node = JSON.parse(node.to_json)
    new_node = new_node.deep_merge!(new_node["default"])
    new_node = new_node.deep_merge!(new_node["force_default"])
    new_node = new_node.deep_merge!(new_node["normal"])
    new_node = new_node.deep_merge!(new_node["override"])
    new_node = new_node.deep_merge!(new_node["force_override"])
    new_node = new_node.deep_merge!(new_node["automatic"])
    new_node["default"] = nil
    new_node["force_default"] = nil
    new_node["normal"] = nil
    new_node["override"] = nil
    new_node["force_override"] = nil
    new_node["automatic"] = nil

    IO.write('/tmp/attributes.json', new_node.to_json)
  end
end

3.InSpecでJSONファイルの読み込み、attributeを呼び出す

InSpecの最初に以下の2行を追加し、JSONファイルを読み込むようにします。

require 'json'
node = json('/tmp/attributes.json').params

これで、recipeと同様に"node['apache']['dir']"といった形式でattibuteを利用することができます。

以下、InSpecのテストファイルのサンプルです。

require 'json'
node = json('/tmp/attributes.json').params

apache_dir = node['apache']['dir']

control 'apache directory' do
  desc 'directory should exist'
  describe directory apache_dir.to_s do
    it { should be_directory }
  end
end

以上