使用 "httpd" Chef 食谱的 "httpd_config" 资源导致 "undefined local variable or method" 错误

Using the "httpd" Chef cookbook's "httpd_config" resource results in "undefined local variable or method" error

使用 httpd 食谱,我尝试通过 httpd_config 属性的 variables 参数将变量传递给基础 template 资源。这会导致致命错误。我在这里想念什么?

我正在使用:

文档:

https://supermarket.chef.io/cookbooks/httpd#httpd_config

食谱:

node['solid_projects']['projects'].each do |project|

  httpd_service project.name do
      mpm 'prefork'
      action [:create]
  end

  httpd_config project.name do
    instance project.name
    source 'site.conf.erb'
    notifies :restart, "httpd_service[#{project.name}]"
    variables :project => project
  end

end

site.conf.erb:

<VirtualHost *:80>
  ServerName <%= project.fqdn %>
  DocumentRoot "/var/www/<%= project.name %>/public_html"
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory "/var/www/<%= project.name %>/public_html" >
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
</VirtualHost>

错误信息:

  * httpd_config_debian[everest] action create
    * directory[/etc/apache2-everest/conf-available] action create (up to date)
    * template[/etc/apache2-everest/conf-available/everest.conf] action create

      ================================================================================
      Error executing action `create` on resource 'template[/etc/apache2-everest/conf-available/everest.conf]'
      ================================================================================

      Chef::Mixin::Template::TemplateError
      ------------------------------------
      undefined local variable or method `project' for #<Chef::Mixin::Template::TemplateContext:0x000000037d1e48>

      Cookbook Trace:
      ---------------
      /var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:119:in `compile_and_converge_action'

      Resource Declaration:
      ---------------------
      # In /var/chef/cache/cookbooks/httpd/libraries/httpd_config_debian.rb

       34:         template "/etc/#{apache_name}/conf-available/#{config_name}.conf" do
       35:           owner 'root'
       36:           group 'root'
       37:           mode '0644'
       38:           variables(new_resource.variables)
       39:           source new_resource.source
       40:           cookbook new_resource.cookbook
       41:           action :create
       42:         end
       43: 

      Compiled Resource:
      ------------------
      # Declared in /var/chef/cache/cookbooks/httpd/libraries/httpd_config_debian.rb:34:in `block in <class:HttpdConfigDebian>'

      template("/etc/apache2-everest/conf-available/everest.conf") do
        action [:create]
        retries 0
        retry_delay 2
        default_guard_interpreter :default
        path "/etc/apache2-everest/conf-available/everest.conf"
        backup 5
        atomic_update true
        source "site.conf.erb"
        variables {"project"=>{"name"=>"everest", "use_stages"=>true}}
        declared_type :template
        cookbook_name "solid_webserver"
        owner "root"
        group "root"
        mode "0644"
      end

      Template Context:
      -----------------
      on line #2
        1: <VirtualHost *:80>
        2:   ServerName <%= project.fqdn %>
        3:   DocumentRoot "/var/www/<%= project.name %>/public_html"
        4:   <Directory />
        5:     Options FollowSymLinks


    ================================================================================
    Error executing action `create` on resource 'httpd_config_debian[everest]'
    ================================================================================

    Chef::Mixin::Template::TemplateError
    ------------------------------------
    undefined local variable or method `project' for #<Chef::Mixin::Template::TemplateContext:0x000000037d1e48>

    Cookbook Trace:
    ---------------
    /var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:119:in `compile_and_converge_action'

    Resource Declaration:
    ---------------------
    # In /var/chef/cache/cookbooks/solid_webserver/recipes/httpd.rb

     10:   httpd_config project.name do
     11:     instance project.name
     12:     source 'site.conf.erb'
     13:     notifies :restart, "httpd_service[#{project.name}]"
     14:     variables 'project' => project
     15:   end
     16: 

    Compiled Resource:
    ------------------
    # Declared in /var/chef/cache/cookbooks/solid_webserver/recipes/httpd.rb:10:in `block in from_file'

    httpd_config_debian("everest") do
      action [:create]
      retries 0
      retry_delay 2
      default_guard_interpreter :default
      declared_type :httpd_config
      cookbook_name "solid_webserver"
      recipe_name "httpd"
      instance "everest"
      source "site.conf.erb"
      variables {"project"=>{"name"=>"everest", "use_stages"=>true}}
      httpd_version "2.4"
      config_name "everest"
    end

    Template Context:
    -----------------
    on line #2
      1: <VirtualHost *:80>
      2:   ServerName <%= project.fqdn %>
      3:   DocumentRoot "/var/www/<%= project.name %>/public_html"
      4:   <Directory />
      5:     Options FollowSymLinks

Recipe: firewall::default
  * firewall[default] action restart
    * file[/etc/default/ufw-chef.rules] action create (up to date)
     (up to date)

Running handlers:
[2015-12-30T18:41:13+01:00] ERROR: Running exception handlers
Running handlers complete
[2015-12-30T18:41:13+01:00] ERROR: Exception handlers complete
Chef Client failed. 3 resources updated in 16 seconds
[2015-12-30T18:41:15+01:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2015-12-30T18:41:15+01:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
[2015-12-30T18:41:15+01:00] ERROR: 

Chef::Mixin::Template::TemplateError (undefined local variable or method `project' for #<Chef::Mixin::Template::TemplateContext:0x000000037d1e48>) on line #2:

  1: <VirtualHost *:80>
  2:   ServerName <%= project.fqdn %>
  3:   DocumentRoot "/var/www/<%= project.name %>/public_html"
  4:   <Directory />
  5:     Options FollowSymLinks

  (erubis):2:in `block in evaluate'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `instance_eval'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `evaluate'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/mixin/template.rb:162:in `_render_template'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/mixin/template.rb:148:in `render_template'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider/template/content.rb:53:in `file_for_provider'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/file_content_management/content_base.rb:40:in `tempfile'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider/file.rb:462:in `tempfile'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider/file.rb:339:in `do_generate_content'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider/file.rb:150:in `action_create'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider.rb:144:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource.rb:596:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:74:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `block (2 levels) in converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `each'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `block in converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/resource_list.rb:83:in `block in execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:116:in `call'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:116:in `call_iterator_block'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:85:in `step'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/resource_list.rb:81:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:105:in `converge'
  /var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:119:in `compile_and_converge_action'
  (eval):2:in `action_create'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/provider.rb:144:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource.rb:596:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:74:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `block (2 levels) in converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `each'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:106:in `block in converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/resource_list.rb:83:in `block in execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:116:in `call'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:116:in `call_iterator_block'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:85:in `step'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/resource_collection/resource_list.rb:81:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/runner.rb:105:in `converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/client.rb:658:in `block in converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/client.rb:653:in `catch'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/client.rb:653:in `converge'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/client.rb:692:in `converge_and_save'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/client.rb:271:in `run'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:261:in `block in fork_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:249:in `fork'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:249:in `fork_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:215:in `block in run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/local_mode.rb:44:in `with_server_connectivity'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:203:in `run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application/client.rb:413:in `block in interval_run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application/client.rb:403:in `loop'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application/client.rb:403:in `interval_run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application/client.rb:393:in `run_application'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/lib/chef/application.rb:58:in `run'
  /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-client:26:in `<top (required)>'
  /usr/bin/chef-client:54:in `load'
  /usr/bin/chef-client:54:in `<main>'


[2015-12-30T18:41:15+01:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

需要 <%= @project['name'] %>(对于 FQDN 也是如此)。