inspec
,chef,attribute

InSpecでchefのattributeを使う

More than 1 year has passed since last update.


目的

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

以上