2
0

More than 5 years have passed since last update.

InSpecでchefのattributeを使う

Posted at

目的

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

以上

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0