--- layout: default title: Using With Chef toc: false --- [FactsOpsCodeOhai]: http://projects.puppetlabs.com/projects/mcollective-plugins/wiki/FactsOhai If you're a Chef user you are supported in both facts and classes filters. ## Facts There is a [community plugin to enable Ohai][FactsOpsCodeOhai] as a fact source. Using this plugin Ohai facts will be converted from: {% highlight javascript %} "languages": { "java": { "runtime": { "name": "OpenJDK Runtime Environment", "build": "1.6.0-b09" }, "version": "1.6.0" }, {% endhighlight %} to: {% highlight ruby %} "languages.java.version"=>"1.6.0", "languages.java.runtime.name"=>"OpenJDK Runtime Environment", "languages.java.runtime.build"=>"1.6.0-b09", {% endhighlight %} So you can use the flattened versions of the information provided by Ohai in filters, reports etc. {% highlight console %} % mco find --with-fact languages.java.version=1.6.0 {% endhighlight %} ## Class Filters Chef does not provide a list of roles and recipes that has been applied to a node, to use with MCollective you need to create such a list. It's very easy with Chef to do this in a simple cookbook. Put the following code in a cookbook and arrange for it to run *last* on your node. This will create a list of all roles and recipes in _/var/tmp/chefnode.txt_ on each node for us to use: {% highlight ruby %} ruby_block "store node data locally" do block do state = File.open("/var/tmp/chefnode.txt", "w") node.run_state[:seen_recipes].keys.each do |recipe| state.puts("recipe.#{recipe}") end node.run_list.roles.each do |role| state.puts("role.#{role}") end state.close end end {% endhighlight %} You should configure MCollective to use this file by putting the following in your _server.cfg_ {% highlight ini %} classesfile = /var/tmp/chefnode.txt {% endhighlight %} You can now use your roles and recipe lists in filters: {% highlight console %} % mco find --with-class role.webserver --with-class /apache/ {% endhighlight %}