厨师11.10.4环境在AWS Opsworks中运行。
我不知道如何通过节点属性node['aws-tag'][#{lyr}]传递下面的“each do”块variables的值“lyr”?
下面的代码块在02-06行而不是在07-14行。
[01] include_recipe "aws" [02] unless node['aws-tag']['tags'].empty? || node['aws-tag']['tags'].nil? [03] aws_resource_tag node['ec2']['instance_id'] do [04] tags(node['aws-tag']['tags']) [05] action :update [06] end [07] node['opsworks']['instance']['layers'].each do |lyr| [08] unless node['aws-tag'][#{lyr}].empty? || node['aws-tag'][#{lyr}].nil? [09] aws_resource_tag node['ec2']['instance_id'] do [10] tags(node['aws-tag'][#{lyr}]) [11] action :update [12] end [13] end [14] end [15] end
下面是chef-shell的结果,显示了上面代码中引用的属性的值:
chef> node ['opsworks'] ['instance'] ['layers'] => [“mongodb”]
chef> node ['aws-tag'] => {“tags”=> {“application”=>“app1”,“environment”=>“dev”},“mongodb”=> {“service”=> MongoDB的“}}
注意:我正在修改chef-aws-tag cookbook来标记所有的ec2实例,使用node['aws-tag']['tags']中的标签,除了标记每个ec2实例的opsworks图层特定标签在自定义json中传递给opsworks的层,在这种情况下,通常是node['aws-tag']['mongodb']或node['aws-tag']['LAYER'] 。
如果我运行上面的代码,我得到一个配方编译错误:“意外keyword_do_block,期待']'” – 请参阅下面的详细错误信息从opsworks:
================================================================================ Recipe Compile Error in /var/lib/aws/opsworks/cache.stage2/cookbooks/chef-aws-tag/recipes/ec2.rb ================================================================================ SyntaxError ----------- /var/lib/aws/opsworks/cache.stage2/cookbooks/chef-aws-tag/recipes/ec2.rb:9: syntax error, unexpected keyword_do_block, expecting ']' /var/lib/aws/opsworks/cache.stage2/cookbooks/chef-aws-tag/recipes/ec2.rb:12: syntax error, unexpected keyword_end, expecting ']' Cookbook Trace: --------------- /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/mixin/from_file.rb:30:in `instance_eval' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/mixin/from_file.rb:30:in `from_file' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/cookbook_version.rb:237:in `load_recipe' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context.rb:151:in `load_recipe' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context/cookbook_compiler.rb:139:in `block in compile_recipes' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context/cookbook_compiler.rb:137:in `each' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context/cookbook_compiler.rb:137:in `compile_recipes' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context/cookbook_compiler.rb:74:in `compile' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/run_context.rb:86:in `load' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/policy_builder/expand_node_object.rb:75:in `setup_run_context' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/client.rb:252:in `setup_run_context' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/client.rb:413:in `do_run' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/client.rb:200:in `block in run' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/client.rb:194:in `fork' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/client.rb:194:in `run' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/application.rb:215:in `run_chef_client' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/application/client.rb:314:in `block in run_application' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/application/client.rb:306:in `loop' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/application/client.rb:306:in `run_application' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/application.rb:66:in `run' /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/bin/chef-client:26:in `<top (required)>' /opt/aws/opsworks/current/bin/chef-client:16:in `load' /opt/aws/opsworks/current/bin/chef-client:16:in `<main>' Relevant File Content: ---------------------- /opt/aws/opsworks/releases/20141010064749_328/vendor/bundle/ruby/2.0.0/gems/chef-11.10.4/lib/chef/mixin/from_file.rb: 23: 24: # Loads a given ruby file, and runs instance_eval against it in the context of the current 25: # object. 26: # 27: # Raises an IOError if the file cannot be found, or is not readable. 28: def from_file(filename) 29: if File.exists?(filename) && File.readable?(filename) 30>> self.instance_eval(IO.read(filename), filename, 1) 31: else 32: raise IOError, "Cannot open or read #{filename}!" 33: end 34: end 35: 36: # Loads a given ruby file, and runs class_eval against it in the context of the current 37: # object. 38: # 39: # Raises an IOError if the file cannot be found, or is not readable. [2014-10-28T17:43:22+00:00] ERROR: Running exception handlers [2014-10-28T17:43:22+00:00] ERROR: Exception handlers complete [2014-10-28T17:43:22+00:00] FATAL: Stacktrace dumped to /var/lib/aws/opsworks/cache.stage2/chef-stacktrace.out [2014-10-28T17:43:22+00:00] ERROR: /var/lib/aws/opsworks/cache.stage2/cookbooks/chef-aws-tag/recipes/ec2.rb:9: syntax error, unexpected keyword_do_block, expecting ']' /var/lib/aws/opsworks/cache.stage2/cookbooks/chef-aws-tag/recipes/ec2.rb:12: syntax error, unexpected keyword_end, expecting ']' [2014-10-28T17:43:22+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
第8行看起来对我来说,应该提出错误,如所示…
unless node['aws-tag'][#{lyr}].empty? || node['aws-tag'][#{lyr}].nil?
应该是string插值,但不是。
试试这一行:
unless node['aws-tag']["#{lyr}"].empty? || node['aws-tag']["#{lyr}"].nil?
如果lyr已经是一个string,那么简单地使用lyr就像这样:
unless node['aws-tag'][lyr].empty? || node['aws-tag'][lyr].nil?