6

我刚刚安装了一个新的 CentOS 6.3 虚拟机并禁用了 SELinux。下面是我运行安装 Ruby、Chef Solo 并尝试配置 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

不幸的是,就在脚本运行时,我收到:

[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的 with 中定义的:

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

因此,似乎 Chef没有加载属性文件,或者其他错误。不完全确定如何找出这一点。

跑步:

  • 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
4

2 回答 2

5

默认属性在 Chef Solo 中运行良好

我不确定你的食谱里面发生了什么——但这是你的代码的问题,而不是厨师的问题。举个简单的例子,看看这个:

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

于 2013-08-02T17:33:32.670 回答
3

chef solo 不支持默认属性。

您将需要在您的节点目录下放置一个 node.json,该目录以 .json 形式列出属性。

所以在你的情况下:

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

如果您想使用 .rb 格式的默认属性/任何属性,您将需要使用 chef-server/chef-client。

于 2012-12-06T00:59:59.020 回答