[chef] Re: Re: detecting a node's role, acting on it, throws exception


Chronological Thread 
  • From:
  • To:
  • Subject: [chef] Re: Re: detecting a node's role, acting on it, throws exception
  • Date: Tue, 7 Feb 2012 00:32:05 -0800

On Mon, 06 Feb 2012, Edward Sargisson wrote:

> I'm catching up on email and seeing that nobody has replied.
> 
> "i want to take certain actions on a host within a recipe depending on
> what kind of role is defined for it. and by "role" i don't mean a chef
> role .. necessarily. it's what role a node plays in the environment.
> let's say i have hosts serving in various roles like: admin, app, proxy,
> etc."
> Er...<cough>... why not?
> This would be exactly what a chef role is for - and by far the easiest way
> to do it.

yeah, you're probably right. i'm still getting a feel for how i want to
describe my infrastructure in code using chef's tools. i'll try to
revisit this. in the meantime, i chose to solve it like so:

  x_privs = data_bag_item("hush", "x-perm-matrix")
  if node[:wewt] && node[:wewt][:role]
    if node[:wewt][:role].match /#{x_privs['roles_that_get_this']}/
      grab_this = "X_SERVERCERT"
      grab_that  = "X_PRIVATEKEY"
    end
  else
    if node[:ec2][:userdata].match /#{x_privs['roles_that_get_this_legacy']}/
      grab_this = "X_SERVERCERT"
      grab_that  = "X_PRIVATEKEY"
    end
  end



and i think i might get what's up with the error 

    NoMethodError - undefined method `[]' for nil:NilClass

because i happened to read #chef log a few nites ago. if i may paraphrase
erikh:

when i try to reference node[:wewt][:role] on a node that doesn't have
those attrs, it tries to apply the method #[] to nil, which isn't defined
for NilClass (the class representation of the nil object).

is that it?

::handwave:: i'm not a ruby coder .. yet


kallen


> On Wed, Feb 1, 2012 at 7:10 PM, 
> < >
>  wrote:
> 
> >
> > hello,
> >
> > hopefully not tl;dr :>  .. i'm approaching a task and i wonder if the
> > style is appropriate. and if the style is appropriate, why is it
> > throwing this exception?
> >
> > i want to take certain actions on a host within a recipe depending on
> > what kind of role is defined for it. and by "role" i don't mean a chef
> > role .. necessarily. it's what role a node plays in the environment.
> > let's say i have hosts serving in various roles like: admin, app, proxy,
> > etc.
> >
> > in particular, if a node is of role "admin", then i want to place on
> > that node AWS credentials of a high privilege level. a node that is of
> > role "app" i want to place low privileged AWS creds.
> >
> > in the recipe, i'm trying to create logic that detects the role from
> > node attr data. maybe this is the wrong approach and i'd like feedback on
> > that. but i also want to flesh out this approach to ask this question,
> > which i guess comes down to a question on ruby syntax and the non-presence
> > of certain node attr data.
> >
> > (i will note that i just tried this by creating chef roles aws-role-admin
> > and aws-role-generic, therein setting override attrs, and assigning
> > those roles to my nodes. if the recipe calls upon attrs set by this
> > chef role, it works. but is that the right way to solve this?)
> >
> > an additional data point is we have nodes that were launched with a
> > legacy form of ec2 userdata, and i want to change the userdata to JSON
> > going forward.
> >
> > legacy: "-r rolename -h hostname -e environment -v vol-xxxxxx"
> >
> > snippet from new JSON style:
> >
> >    "node_name": "test-kallen.dev.wewt.com",
> >    "wewt": {
> >      "role": "admin",
> >      "environment": "dev",
> >      "elip": "xx.xx.xx.xx",
> >      "vol_list": [
> >        "vol-xxxxx"
> >      ]
> >    },
> >    "chef_server": "https://10.xx.xx.xx";,
> >    "validation_client_name": "chef-validator",
> >    "run_list": [
> >      "role[base]",
> >      "role[postfix-client]",
> >      "recipe[and_so_on]"
> >    ]
> >
> > my node launch process will take that userdata and populate it
> > as chef node (normal) attributes.
> >
> > regardless of the style of userdata we pass in at launch time, that
> > userdata is in the node attribute data in chef, be it at the top level
> > under normal attr data or under [:ec2][:userdata]. so i figured i could
> > test for the values in node attr data in my recipe. but the way i'm
> > trying it is throwing an exception on legacy hosts for this line in
> > the recipe:
> >
> >    if node[:ec2][:userdata] =~ /-r admin/ || node[:wewt][:role] == "admin"
> >
> > here's a small test recipe that tries to detect the role as is present
> > in node attr data. it tries to be backward compatible for the legacy
> > userdata style.
> >
> > if node[:ec2]
> >  if node[:ec2][:userdata] =~ /-r admin/ || node[:wewt][:role] == "admin"
> >    Chef::Log.debug("HIGGS-BOSON: detected role admin")
> >  elsif node[:ec2][:userdata] =~ /-r app/ || node[:wewt][:role] == "app"
> >    Chef::Log.debug("HIGGS-BOSON: detected role app")
> >  else
> >    Chef::Log.debug("HIGGS-BOSON: no role detected!")
> >  end
> > end
> >
> >
> > successful run on test-kallen.dev.wewt.com which contains the new node
> > attributes via the new JSON userdata:
> >
> > [Thu, 02 Feb 2012 02:16:26 +0000] DEBUG: Loading Recipe test_recipe via
> > include_recipe
> > [Thu, 02 Feb 2012 02:16:26 +0000] DEBUG: Found recipe default in cookbook
> > test_recipe
> > [Thu, 02 Feb 2012 02:16:26 +0000] DEBUG: HIGGS-BOSON: detected role dev
> > [Thu, 02 Feb 2012 02:16:26 +0000] DEBUG: Converging node
> > test-kallen.dev.wewt.com
> > [Thu, 02 Feb 2012 02:16:26 +0000] DEBUG: Saving the current state of node
> > test-kallen.dev.wewt.com
> >
> >
> >
> >
> > failed run on webapp01b.dev.wewt.com which does not contain the new
> > node attributes:
> >
> > [Thu, 02 Feb 2012 02:16:28 +0000] DEBUG: Loading Recipe test_recipe via
> > include_recipe
> > [Thu, 02 Feb 2012 02:16:28 +0000] DEBUG: Found recipe default in cookbook
> > test_recipe
> > [Thu, 02 Feb 2012 02:16:28 +0000] ERROR: Running exception handlers
> > [Thu, 02 Feb 2012 02:16:28 +0000] FATAL: Saving node information to
> > /var/cache/chef/failed-run-data.json
> > [Thu, 02 Feb 2012 02:16:28 +0000] ERROR: Exception handlers complete
> > [Thu, 02 Feb 2012 02:16:28 +0000] DEBUG: Re-raising exception:
> > NoMethodError - undefined method `[]' for nil:NilClass
> > /var/cache/chef/cookbooks/test_recipe/recipes/default.rb:34:in `from_file'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/cookbook_version.rb:578:in
> > `load_recipe'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:40:in
> > `include_recipe'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:27:in
> > `each'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:27:in
> > `include_recipe'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:72:in
> > `load'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:69:in
> > `each'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:69:in
> > `load'
> >  /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/client.rb:195:in
> > `setup_run_context'
> >  /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/client.rb:159:in
> > `run'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:239:in
> > `run_application'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:229:in
> > `loop'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:229:in
> > `run_application'
> >  
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application.rb:67:in
> > `run'
> >  /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/chef-client:26
> >  /usr/bin/chef-client:19:in `load'
> >  /usr/bin/chef-client:19
> > [Thu, 02 Feb 2012 02:16:28 +0000] FATAL: Stacktrace dumped to
> > /var/cache/chef/chef-stacktrace.out
> > [Thu, 02 Feb 2012 02:16:28 +0000] DEBUG: NoMethodError: undefined method
> > `[]' for nil:NilClass
> > /var/cache/chef/cookbooks/test_recipe/recipes/default.rb:34:in `from_file'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/cookbook_version.rb:578:in
> > `load_recipe'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:40:in
> > `include_recipe'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:27:in
> > `each'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/mixin/language_include_recipe.rb:27:in
> > `include_recipe'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:72:in
> > `load'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:69:in
> > `each'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/run_context.rb:69:in
> > `load'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/client.rb:195:in
> > `setup_run_context'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/client.rb:159:in
> > `run'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:239:in
> > `run_application'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:229:in
> > `loop'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application/client.rb:229:in
> > `run_application'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/../lib/chef/application.rb:67:in
> > `run'
> > /usr/lib/ruby/gems/1.8/gems/chef-0.10.4/bin/chef-client:26
> > /usr/bin/chef-client:19:in `load'
> > /usr/bin/chef-client:19
> > [Thu, 02 Feb 2012 02:16:28 +0000] FATAL: NoMethodError: undefined method
> > `[]' for nil:NilClass
> >
> >
> > so.. why does this throw the exception? i'm not a savvy ruby coder,
> > but shouldn't the "or" in that line address the fact that
> > node[:wewt][:role]
> > doesn't exist for this node?
> >
> > if i edit this node's attr data and add in the new-style attributes, the
> > run will succeed.
> >
> > i could go back and populate this node attr data for all legacy hosts,
> > but i don't want to if i don't have to, if there's a better answer.
> >
> > thanks y'all,
> > kallen
> >
> >



Archive powered by MHonArc 2.6.16.

§