sdot257
sdot257

Reputation: 10376

Possible to use Chef variables within Inspec?

I'm learning to write integration tests for my Chef cookbooks. Is it possible to reference variables from the attributes folder within my test?

Here's my test to make sure httpd and php are installed properly. However, I have additional packages I want to check for.

test/smoke/default/install.rb

%w(httpd php).each do |rpm_package|
  describe package(rpm_package) do
    it { should be_installed }
  end
end

attributes/default.rb

default['ic_apachephp']['php_packages'] = [
                              'php-mysqlnd',
                              'php-mbstring',
                              'php-gd',
                              'php-xml',
                              'php'
                            ]

Upvotes: 4

Views: 3644

Answers (1)

StephenKing
StephenKing

Reputation: 37630

Yes, this is possible, however not "directly". Matt Wrock described it in this blog entry.

Necessary steps are:

  • add a cookbook (e.g. called export-node, below test/fixtures/cookbooks/) that includes a recipe with the following content (dumping node attributes into the specified JSON file):

    ruby_block "Save node attributes" do
      block do
        IO.write("/tmp/kitchen_chef_node.json", node.to_json)
      end
    end
    
  • add this recipe to the the run list in .kitchen.yml

  • load the node object in your inspec test using

    node = json('/tmp/kitchen_chef_node.json').params
    

Beware that you manually have to pick from the right attribute precedence level (automatic/default/normal/override), as those are not merged.

You can find an example of mine also in this cookbook: TYPO3-cookbooks/t3-pdns.

EDIT: I forgot the step to tell Berkshelf about that cookbook. Add to your Berksfile:

group :integration do
  cookbook 'export-node', path: 'test/fixtures/cookbooks/export-node'
end

Upvotes: 4

Related Questions