2014-10-28 3 views
1

Я использую Chef 11.10.4, работающий в AWS Opsworks.Устранение неполадок в блоке «каждый» делать с атрибутом узла

Не могу понять, как объединить элемент lyr с атрибутом узла node['aws-tag'][#{lyr}] в строках 07-14 ниже.

Я использую замену строки как псевдокод, чтобы показать, что я пытаюсь сделать, но он явно не работает в этой ситуации. Строки 02-06 работают отлично, я просто пытаюсь заставить линии 07-14 работать, и я не знаю, как это сделать.

include_recipe "aws" 
unless node['aws-tag']['tags'].empty? || node['aws-tag']['tags'].nil? 
    aws_resource_tag node['ec2']['instance_id'] do 
     tags(node['aws-tag']['tags']) 
     action :update 
    end 
    node['opsworks']['instance']['layers'].each do |lyr| 
     unless node['aws-tag'][#{lyr}].empty? || node['aws-tag'][#{lyr}].nil? 
      aws_resource_tag node['ec2']['instance_id'] do 
       tags(node['aws-tag'][#{lyr}]) 
       action :update 
      end 
     end 
    end 
end 

Вот результаты от шеф-оболочки, показывающие значения атрибутов, упомянутых в приведенном выше коде:

chef > node['opsworks']['instance']['layers'] 
=> ["mongodb"] 

chef > node['aws-tag'] 
=> {"tags"=>{"application"=>"app1", "environment"=>"dev"}, "mongodb"=>{"service"=>"mongodb"}} 

Я модифицирования chef-aws-tag кулинарной помечать все экземпляры EC2 с тегами в node['aws-tag']['tags'] и в дополнение к тому, чтобы отмечать каждый отдельный экземпляр экземпляра экземпляра ec2, который включен в пользовательский 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) 
+0

Где это ломается? Например, вы даже достигаете строки 09 или строка 08 оценивает значение false и завершает выполнение? –

+0

Вместо псевдокода нам нужен минимальный пример реального кода, который отображает проблему. В противном случае мы не работаем над проблемой, мы работаем над псевдопроблемой. –

+1

Мои извинения @TejayCardon - ошибка в строке 9: неожиданное ключевое слово_до_блока, ожидающее ']'. Я добавил подробный вывод в сообщение. –

ответ

1

Лир уже строка поэтому следующие работы:

node['opsworks']['instance']['layers'].each do |lyr| 
    unless node['aws-tag'][lyr].empty? || node['aws-tag'][lyr].nil? 
     aws_resource_tag node['ec2']['instance_id'] do 
      tags(node['aws-tag'][lyr]) 
      action :update 
     end 
    end 
end 

Я испытал это в шеф-оболочке в интерактивном режиме, и он не работает, но я предполагаю, что есть какая-то разница при выполнении его во время выполнения, так как он работает там. Вот результат моего теста, который не прошел в шеф-поваре, который, как я думал, был одним и тем же:

[email protected]:/opt/aws/opsworks/current/bin# ./chef-shell -j /var/lib/aws/opsworks/chef/2014-10-28-17-15-30-01.json 
loading configuration: none (standalone session) 
Session type: standalone 
Loading.......done. 

This is the chef-shell. 
Chef Version: 11.10.4 
http://www.opscode.com/chef 
http://docs.opscode.com/ 

run `help' for help, `exit' or ^D to quit. 

Ohai2u [email protected]! 
chef > lyr=node['opsworks']['instance']['layers'] 
=> ["mongodb"] 
chef > lyr 
=> ["mongodb"] 
chef > node['aws-tag'][lyr] 
=> nil 
chef > 
+0

'lyr = node ['opsworks'] ['instance'] ['layers']' - это не то же самое, что 'node ['opsworks'] ['instance'] ['layers']. Each do | lyr | ' –

+1

@TejayCardon Я понимаю, что мой тест был недостаточным. В тесте оболочки есть только один элемент в узле массива ['opsworks'] ['instance'] ['layers'], поэтому я думал, что это то же самое. Однако в моем примере шеф-оболочки не lyr строка, и если да, то почему не работает узел ['aws-tag'] [lyr], если узел ['aws-tag'] ['mongodb'] работать в одной оболочке? –

+0

Вот что я говорю. В тесте оболочки 'lyr' не является строкой, это Array.' ['Mongodb'] 'Просто потому, что массив имеет только один элемент, не означает, что он еще не массив Вы можете использовать 'lyr [0]' в своем тесте, если вы хотите избежать цикла. –

Смежные вопросы