2014-11-20 3 views
1

Я следующий ruby_block в шеф поваренной книгишеф-повар ошибки :: Util :: FileEdit

ruby_block "hosts" do 
    block do 
    rc = Chef::Util::FileEdit.new("/etc/login.defs") 
    rc.search_file_replace_line(
     /^PASS_MAX_DAYS 99999$/, 
     "PASS_MAX_DAYS 150" 
    ) 
    rc.write_file 
    end 
end 

, когда я бегу шеф-клиента, я получаю следующее сообщение об ошибке

* ruby_block[hosts] action run[2014-11-20T18:35:17+00:00] INFO: Processing ruby_block[hosts] action run (my_cookbook::default line 31) 


    ================================================================================ 
    Error executing action `run` on resource 'ruby_block[hosts]' 
    ================================================================================ 

    ArgumentError 
    ------------- 
    invalid byte sequence in US-ASCII 

    Cookbook Trace: 
    --------------- 
    /var/chef/cache/cookbooks/my_cookbook/recipes/default.rb:34:in `block (2 levels) in from_file' 

    Resource Declaration: 
    --------------------- 
    # In /var/chef/cache/cookbooks/my_cookbook/recipes/default.rb 

    31: ruby_block "hosts" do 
    32: block do 
    33:  rc = Chef::Util::FileEdit.new("/etc/login.defs") 
    34:  rc.search_file_replace_line(
    35:  /^PASS_MAX_DAYS 99999$/, 
    36:  "PASS_MAX_DAYS 150" 
    37: ) 
    38:  rc.write_file 
    39: end 
    40: end 
    41: 

    Compiled Resource: 
    ------------------ 
    # Declared in /var/chef/cache/cookbooks/my_cookbook/recipes/default.rb:31:in `from_file' 

    ruby_block("hosts") do 
     action "run" 
     retries 0 
     retry_delay 2 
     guard_interpreter :default 
     block_name "hosts" 
     cookbook_name "my_cookbook" 
     recipe_name "default" 
     block #<Proc:[email protected]/var/chef/cache/cookbooks/my_cookbook/recipes/default.rb:32> 
    end 

[2014-11-20T18:35:17+00:00] INFO: Running queued delayed notifications before re-raising exception 

Running handlers: 
[2014-11-20T18:35:17+00:00] ERROR: Running exception handlers 
Running handlers complete 
[2014-11-20T18:35:17+00:00] ERROR: Exception handlers complete 
[2014-11-20T18:35:17+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out 
Chef Client failed. 0 resources updated in 1.322765293 seconds 
[2014-11-20T18:35:17+00:00] ERROR: ruby_block[hosts] (my_cookbook::default line 31) had an error: ArgumentError: invalid byte sequence in US-ASCII 
[2014-11-20T18:35:17+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) 

Только для тестирования у меня есть редактировать /etc/hosts запись файла с использованием вышеуказанного кода, и он работает! выглядеть /etc/login.defs есть что-то проводной

шеф-stacktrace.out

[email protected]:/etc# cat /var/chef/cache/chef-stacktrace.out 
Generated at 2014-11-20 18:51:45 +0000 
ArgumentError: ruby_block[hosts] (my_cookbook::default line 31) had an error: ArgumentError: invalid byte sequence in US-ASCII 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/editor.rb:79:in `match' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/editor.rb:79:in `match' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/editor.rb:79:in `block in replace_lines' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/editor.rb:78:in `map!' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/editor.rb:78:in `replace_lines' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/util/file_edit.rb:46:in `search_file_replace_line' 
/var/chef/cache/cookbooks/my_cookbook/recipes/default.rb:34:in `block (2 levels) in from_file' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/provider/ruby_block.rb:33:in `call' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/provider/ruby_block.rb:33:in `block in action_run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/mixin/why_run.rb:52:in `call' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/mixin/why_run.rb:52:in `add_action' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/provider.rb:156:in `converge_by' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/provider/ruby_block.rb:32:in `action_run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/provider.rb:121:in `run_action' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource.rb:648:in `run_action' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/runner.rb:49:in `run_action' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/runner.rb:81:in `block (2 levels) in converge' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/runner.rb:81:in `each' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/runner.rb:81:in `block in converge' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection.rb:98:in `block in execute_each_resource' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection/stepable_iterator.rb:116:in `call' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection/stepable_iterator.rb:116:in `call_iterator_block' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection/stepable_iterator.rb:85:in `step' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/resource_collection.rb:96:in `execute_each_resource' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/runner.rb:80:in `converge' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:345:in `converge' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:431:in `do_run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:213:in `block in run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `fork' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:236:in `run_chef_client' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/client.rb:338:in `block in run_application' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/client.rb:327:in `loop' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/client.rb:327:in `run_application' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:55:in `run' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/bin/chef-client:26:in `<top (required)>' 
/usr/bin/chef-client:23:in `load' 
+0

Пожалуйста, включите полный отслеживающий из '/ вар/повар/кэш/шеф-stacktrace.out'. – coderanger

+0

Обновите мой вопрос с помощью 'chef-stacktrace.out', если я удалю все из этого' login.defs' и просто держу 'PASS_MAX_DAYS' линию, тогда он работает! вы думаете, из-за того, что файлы не работают – Satish

+0

Нет, у вас просто есть не-ASCII-контент в файле, а FileEdit не может справиться с этим, как написано. Вы могли бы либо улучшить FileEdit, чтобы правильно обрабатывать многобайтовые кодировки, либо не использовать его. – coderanger

ответ

4

FileEdit написаны не может обрабатывать многобайтовые кодировки. Вы можете либо исправить FileEdit, либо отправить патч шеф-повару, либо просто не использовать его. Самое простое решение - конвертировать все login.defs в ресурс cookbook_file или template, тем самым устраняя необходимость в FileEdit.

+0

Я не знаю, как исправить 'multibyte encodings', я не рубиновый эксперт. Можете ли вы мне помочь? – Satish

+0

Я не думаю, что ТАК любит рекламировать коммерческие сервисы, так что если это в контексте бесплатной помощи, то я не могу, так как это не простое исправление. – coderanger

+0

Хорошо, босс !!!!! no problem – Satish

2

Хотя его слишком поздно. Но просто, если кто-то пришел сюда искать решение для такого рода проблем.

file '/etc/login.defs' do 
    action :create 
    owner 'root' 
    group 'root' 
    mode '0644' 
    content File.read("/etc/login.defs").gsub(/^PASS_MAX_DAYS\t99999$/, "PASS_MAX_DAYS\t150") 
end 

Кухня Пробный прогон: -

 * file[/etc/login.defs] action create 
     - update content in file /etc/login.defs from 11fa3a to 3d7172 
     --- /etc/login.defs 2014-02-12 14:03:08.000000000 +0000 
     +++ /etc/.chef-login.defs20160805-12038-orbb2x 2016-08-05 11:09:40.007822562 +0000 
     @@ -22,7 +22,7 @@ 
     # PASS_MIN_LEN Minimum acceptable password length. 
     # PASS_WARN_AGE Number of days warning given before a password expires. 
     # 
     -PASS_MAX_DAYS 99999 
     +PASS_MAX_DAYS 150 
     PASS_MIN_DAYS 0 
     PASS_MIN_LEN 5 
     PASS_WARN_AGE 7 
     - restore selinux security context