[chef] NoMethodError for LWRP within a ruby_block?


Chronological Thread 
  • From:
  • To: chef < >
  • Subject: [chef] NoMethodError for LWRP within a ruby_block?
  • Date: Wed, 4 Dec 2013 19:06:58 +0000


Hiya,

How do I make an LWRP that I created available in a recipe within a 
ruby_block?
It's not working for me.

[2013-12-04T00:13:14+00:00] DEBUG: Re-raising exception: NoMethodError - 
ruby_block[do stuff] (cloner::grants line 30) had an error: NoMethodError: 
undefined method `cloner_db_svc_mysqlacl' for Chef::Resource::RubyBlock
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/resource.rb:294:in
 `method_missing'
  /var/cache/chef/cookbooks/cloner/recipes/grants.rb:67:in `block (2 levels) 
in from_file'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/provider/ruby_block.rb:33:in
 `call'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/provider/ruby_block.rb:33:in
 `block in action_run'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/mixin/why_run.rb:52:in
 `call'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/mixin/why_run.rb:52:in
 `add_action'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/provider.rb:149:in
 `converge_by'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/provider/ruby_block.rb:32:in
 `action_run'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/provider.rb:114:in
 `run_action'
  
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.2/lib/chef/resource.rb:625:in
 `run_action'
  ...


Afaict, the recipe code needs to execute during the convergence phase of the
chef-client run. In my case, the code needs to (1) first start mysql, (2) wait
for mysql to complete its startup (wait for innodb recovery to complete) and 
(3)
then query a value from a table. (4) And then do another action depending on 
the
value returned.

I tried doing the above outside a ruby_block my first time through, then
realized #3 was executing before #2 had completed. IOW #3 was executing at the
compile phase. So now I'm trying to put all of this into a ruby_block, but the
call to my LWRP is failing. (Is using a ruby_block for this the right answer?)

The LWRP lives in 'cloner-db-svc' cookbook. The cookbook::recipe that calls it
is 'cloner::grants'. The cloner cookbook depends on cloner-db-svc. When the 
code
runs outside of a ruby_block, the recipe finds the LWRP method just fine, but
the behavior I need doesn't occur.


::Chef::Recipe.send(:include, ::Cloner::Chef::DbSvc::Helper)

ruby_block "do stuff" do
  block do
    quux_ip = search(:node, 'roles:quux').map {|server| server['ipaddress'] 
}.join(",")
    cli_password = ::Cloner::Chef::DbSvc::Helper.fetchsecret( "secrets", 
"#{node['cloner']['environment']}", "rootpass" )
    current_ip = %x( mysql --skip-column-names -hlocalhost -uroot 
-p#{cli_password} -e \"SELECT Host FROM mysql.user WHERE 
User='cloner_admin'\" )

    if current_ip.empty?
      Chef::Log.debug("HIGGS-BOSON: current_ip is empty, applying grants.")
      cloner_admin_pass = ::Cloner::Chef::DbSvc::Helper.fetchsecret( 
"secrets", "#{node['cloner']['environment']}", "cloner_admin_pass" )
      cloner_proc_pass = ::Cloner::Chef::DbSvc::Helper.fetchsecret( 
"secrets", "#{node['cloner']['environment']}", "cloner_proc_pass" )

      cloner_db_svc_mysqlacl "mysqlgrants" do
        action :create_acl
        ipv4_address quux_ip
        cli_password cli_password
        cloner_admin_pass cloner_admin_pass
        cloner_proc_pass cloner_proc_pass
      end
      current_ip = %x( mysql --skip-column-names -hlocalhost -uroot 
-p#{cli_password} -e \"SELECT Host FROM mysql.user WHERE 
User='cloner_admin'\" )
      Chef::Log.debug("HIGGS-BOSON: After applying mysqlgrants, quux_ip 
#{quux_ip}; current_ip #{current_ip}")

    else # snipped for brevity
    end
  end
  action :create
end



Thanks!
kallen





Archive powered by MHonArc 2.6.16.

§