Chef-Solo "undefined method` [] 'for nil: NilClass"

I just installed the new CentOS 6.3 VM and disabled SELinux. Below is the exact script that I ran to install Ruby, Chef Solo and tried to provide VM:

#!/bin/bash # # Install Chef-Solo if it doesn't exist, then provision the server. # CHEF_FILE="https://dl.dropbox.com/u/4204671/LiquidCompass/lc-chef.tar.gz" if [ "$#" -eq 0 ]; then echo "You must provide the type of server this is. (Eg: production-api, qa-api, development)" exit 1 fi if [ ! -x "/usr/bin/chef-solo" ]; then rpm -Uvh http://rbel.frameos.org/rbel6 yum install -y ruby ruby-devel ruby-ri ruby-rdoc ruby-shadow gcc gcc-c++ automake autoconf make curl dmidecode cd /tmp curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.8.10.tgz tar zxf rubygems-1.8.10.tgz cd rubygems-1.8.10 ruby setup.rb --no-format-executable gem install chef --no-ri --no-rdoc fi if [ -d "/etc/chef" ]; then rm -rf /etc/chef fi if [ -d "/tmp/lc-chef" ]; then rm -rf /tmp/lc-chef* fi mkdir /etc/chef echo "file_cache_path \"/tmp/lc-chef/chef-solo\" cookbook_path \"/tmp/lc-chef/cookbooks\" role_path \"/tmp/lc-chef/roles\" json_attribs \"/etc/chef/node.json\"" > /etc/chef/solo.rb echo "{ \"name\": \"$1\", \"normal\": { \"company\": \"Liquid Compass LLC\", \"tags\": [] }, \"chef_environment\": \"_default\", \"run_list\": [ \"role[$1]\" ] }" > /etc/chef/node.json cd /tmp curl -O $CHEF_FILE tar zxf lc-chef.tar.gz chef-solo -c /etc/chef/solo.rb 

Unfortunately, immediately after running the script, I get:

 [2012-12-05T17:39:27-07:00] INFO: Start handlers complete. ================================================================================ Recipe Compile Error in /tmp/lc-chef/cookbooks/liquidcompass/recipes/php.rb ================================================================================ NoMethodError ------------- undefined method `[]' for nil:NilClass Cookbook Trace: --------------- /tmp/lc-chef/cookbooks/liquidcompass/recipes/php.rb:20:in `from_file' Relevant File Content: ---------------------- /tmp/lc-chef/cookbooks/liquidcompass/recipes/php.rb: 13: # Unless required by applicable law or agreed to in writing, software 14: # distributed under the License is distributed on an "AS IS" BASIS, 15: # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16: # See the License for the specific language governing permissions and 17: # limitations under the License. 18: # 19: 20>> php_url = "http://us.php.net/distributions/php-#{node['php']['version']}.tar.gz" 21: node.set['php']['prefix'] = "/opt/php-#{node['php']['version']}" 22: node.set['php']['conf_path'] = "#{node['php']['dir']}/php.ini" 23: node.set['php']['configure_flags'] = [ 24: "--prefix=#{node['php']['prefix']}", 25: "--with-config-file-path=#{node['php']['dir']}", 26: "--with-config-file-scan-dir=#{node['php']['dir']}/conf.d", 27: "--with-curl", 28: "--with-pear", 29: "--with-gd", 

So it looks like it is choking on trying to load node['php']['version'] . This is defined in my /tmp/lc-chef/cookbooks/liquidcompass/attributes/default.rb with:

 default['php']['version'] = "5.4.9" 

So, it looks like the chef is not loading the attribute file, or something else is wrong. Not quite sure how to find out or not.

Duration:

  • RubyGems 1.8.10
  • Chef 10.16.2

Respectfully,
Andrew

By the way, this is a stack trace:

 Generated at Wed Dec 05 17:39:27 -0700 2012 NoMethodError: undefined method `[]' for nil:NilClass /tmp/lc-chef/cookbooks/liquidcompass/recipes/php.rb:20:in `from_file' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/cookbook_version.rb:558:in `load_recipe' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/mixin/language_include_recipe.rb:46:in `load_recipe' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/mixin/language_include_recipe.rb:33:in `include_recipe' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/mixin/language_include_recipe.rb:27:in `each' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/mixin/language_include_recipe.rb:27:in `include_recipe' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/run_context.rb:79:in `load' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/run_context.rb:75:in `each' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/run_context.rb:75:in `load' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/client.rb:198:in `setup_run_context' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/client.rb:418:in `do_run' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/client.rb:176:in `run' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/application.rb:140:in `run_chef_client' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/application/solo.rb:224:in `run_application' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/application/solo.rb:216:in `loop' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/application/solo.rb:216:in `run_application' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/../lib/chef/application.rb:72:in `run' /usr/lib64/ruby/gems/1.8/gems/chef-10.16.2/bin/chef-solo:25 /usr/bin/chef-solo:19:in `load' /usr/bin/chef-solo:19 
+6
source share
2 answers

Software for the chef does not support attributes by default.

You will need to build node.json under your nodes directory, which lists attributes in the form of .json.

So in your case:

 { "php": { "version": "5.4.9" } } 

If you want to use the default attributes / any attributes in .rb format, you will need to use chef-server / chef-client.

+3
source

Standard attributes work fine in Chef Solo

I'm not sure what is going on inside your cookbook, but this is a problem with your code, not with the chef. As a simple example, check this out:

https://gist.github.com/adamhjk/6141718

+5
source

All Articles