#目的
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
#手順
- 事前準備
- ChefのRecipeでnode objectをJSONファイルに出力
- 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
以上