2012-12-06 37 views
6

我刚刚安装了一个全新的CentOS 6.3虚拟机并禁用了SELinux。下面是我跑安装Ruby,厨师独奏,并试图提供虚拟机的确切脚本:厨师独奏“未定义的方法`[]'为零:NilClass”

#!/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 

不幸的是,右为脚本的运行我得到:

[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", 

所以它看起来像试图加载node['php']['version']时会感到窒息。这是我/tmp/lc-chef/cookbooks/liquidcompass/attributes/default.rb与定义:

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

这样看来,厨师或者是加载的属性文件,或别的东西是错误的。不完全确定如何找到或不。

运行:

  • 的RubyGems 1.8.10
  • 厨师10.16.2

最好的问候,
安德鲁

顺便说一句,这是堆栈跟踪:

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 

回答

3

厨师独奏不支持默认属性。

您将需要在node目录下放置一个node.json,该目录列出.json窗体中的属性。

所以你的情况:

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

如果您想使用默认属性/在.RB格式的任何属性,你将需要使用厨师服务器/厨师客户端。

+0

这真是奇怪......但我只是吹散了VM和重建它。然后运行我在OP中提供的脚本,它工作得很好。我不知道第一台虚拟机发生了什么事。 –

+0

这确实很奇怪: http://wiki.opscode.com/display/chef/Chef+Solo#ChefSolo-JSON%2CAttributesandRepsipes –

5

默认属性的厨师独奏

我不知道什么是你的食谱中发生了正常工作 - 但它是一个问题,你的代码,不是厨师。作为一个简单的例子,看看这个:

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

+0

你的厨师独奏版本是什么? –

+0

我可以证实这对我有用'厨师独奏 - 版本 厨师:11.10.4' – devalias

相关问题