Can an if statement apply to an organization?


#1

I have a recipe that is applied to servers in two different Chef organizations. In the recipe there is a cookbook_file command that I would like to apply a different file depending on which organization the server is a member of. I naively tried “if node.chef_organization”, but that returns “Undefined method or attribute chef_organization' onnode’”. Is there a way to do this?

Dave


#2

Chef Client is pretty ignorant about the existence of organizations in general. This is a historical artifact of organizations having been a paid feature in the past. Probably the easiest way to get the info is to parse the Chef::Config.chef_server_url with the ruby URI library, then get the path and split it with the Pathname library. For example:

require 'uri'; require 'pathname'
Pathname(URI("https://chef.example/organizations/testorg").path).split.last.to_s
# => "testorg"

That code probably has a lot of edge cases that would not work, but should be fine for simple ones.


#3

Thanks! I never would have thought of that. This works perfectly. For the record, here’s the code that works (chef_server_url is set in knife.rb):

require 'uri'; require 'pathname'
org = Pathname(URI("#{Config.chef_server_url}").path).split.last.to_s
if org == "foo"
  (do stuff)
else
  (do other stuff)
end