18

Usage case: The DevOps team launched a node sometime ago, and my team would like to know what's the version(s) of one/several cookbook(s) being used in the run_list. Our DevOps team is firefighting so we'd like to find a way to be self-sufficient.

Commands Tried: knife cookbook show COOKBOOK give all possible versions, but does not specify which one being used.

knife node show NODE shows all cookbooks, but there's no version info attached.

Question: Is there a command (something similar to knife search, ohai) to query the chef-server for the versions deployed on the node?

digit plumber
  • 1,140
  • 2
  • 14
  • 27
  • Common problem that has caused me no end of pain. See also http://stackoverflow.com/questions/31012767/is-there-a-way-to-use-knife-search-node-or-knife-show-node-that-will-tell-yo/31016001#31016001 – Mark O'Connor Jun 24 '15 at 01:21

9 Answers9

13

If you can ssh into the box you can look under /var/chef/cache/cookbooks/<cookbook name>/metadata.json to find the version.

Also, you can access it during a chef run by looking at @run_context.cookbook_collection, but that probably doesn't help.

Generally the cookbook version is defined by the environment, but since environments change over time, you can't really trust that to be the same set that was used when this node last converged (especially if it's been a while).

By far your safest option will be to look at the chef cache.

mkobit
  • 43,979
  • 12
  • 156
  • 150
Tejay Cardon
  • 4,193
  • 2
  • 16
  • 31
6

If you're using ohai (you probably are), you can do something like this:

knife search -i 'cookbooks:your-cookbook' -a cookbooks.your-cookbook.version

This will give you output that shows the hostname and the cookbook version:

1 items found

server.name.example:
  cookbooks.cs-redis.version: 0.3.2
oskarpearson
  • 284
  • 2
  • 8
  • 1
    Or you could simply query the node you're interested in like so: `knife node show -a cookbooks` – hmacias Mar 21 '19 at 12:47
5

In our organisation we use a base cookbook to set an attribute on the node with the cookbook versions.

run_context.cookbook_collection.each do |key, cookbook|
  node.set['base_cookbook']['cookbook_versions'][cookbook.name] = cookbook.version
end

Then we can query the versions used by a node with

knife node show <node-name> -a base_cookbook.cookbook_versions
Matt Cole
  • 2,491
  • 17
  • 21
  • Just for completeness I'm wondering: Would the current version of this answer would retain cookbooks that no longer are in the run-list? – Adam Franco May 05 '16 at 17:42
  • It turns out that there is a cookbook in the Supermarket that implements this same technique: https://supermarket.chef.io/cookbooks/cookbook_versions – Adam Franco May 05 '16 at 18:08
  • 5
    I believe you can now do this directly without the `run_context` base cookbook. Perhaps built in to chef 12. `knife node show -a cookbooks` works for me. – Beel Mar 28 '17 at 20:02
  • Thanks Beel, How to get multiple attributes when I use knife node show nodename -a attr1, attrib2, etc – Daniel Jun 04 '20 at 17:15
1

Came across this post and ended up working out a grep command to do this.

sudo grep -o -e '\"version\"\:\"[a-zA-Z0-9.]*\"' -e '\"version\"\: \"[a-zA-Z0-9.]*\"' /var/chef/cache/cookbooks/*/metadata.json
Saedar
  • 61
  • 6
1

I had a similar requirement where I published a new version of cookbook and wanted to find which nodes were using the latest version of my cookbook. The below knife commands worked for me.

knife search -i node "cookbooks:<cookbook-name> AND cookbooks_<cookbook-name>_version:100.1.0"
  • Thank you for this! We had an issue where we need to backport an attribute override to older versions of an internal cookbook, this helped immensely when hunting down nodes that were pinned to an older version of the cookbook in scope. – scrthq Apr 21 '21 at 23:31
0

I can think of a two steps solution.

Step 1: knife node show <%node-name%>. The output should include the Environment being used on the node.

Step 2: knife environment show <%environment-name%>. This output should detail all the cookbooks being deployed on the node with their versions

Arif Akram Khan
  • 119
  • 1
  • 7
0

I'm unsure of a way via knife, but you can log into your Managed Chef at https://manage.chef.io and navigate to the nodes section for your organization. Click on the node name in question, and at the bottom right, under Run List, click the Expand All link. That will show you the versions of the cookbook each recipe is run as.

Derek
  • 4,575
  • 3
  • 22
  • 36
0

I am using this (and versions of) for Windows clients

Invoke-Command -ComputerName $nodename -ScriptBlock { gci "c:\chef\cache\cookbooks\*\metadata.rb"  | % { select-string $_ -pattern '^version.*$' } | % { $_.Path.replace('\metadata.rb','') } } -Credential $creds
Craig Roberts
  • 171
  • 1
  • 4
  • 18
0

This worked for me:

knife search node '*:*' -a 'cookbook_versions.<cookbook_name>'