#ruby #chef-infra
#ruby #шеф-повар-инфра
Вопрос:
Итак, у меня есть следующий код, который представляет собой блок ruby, который открывает файл на диске и считывает каждую строку. Каждая строка представляет собой строку, которая представляет собой dataversion (пример: «2020_Q1_NA»)
Я читаю файл с кодировкой спецификации UTF16, поэтому я открываю файл с учетом этого и конвертирую каждую строку в UTF-8. Затем на следующем шаге я создаю каталог на общем диске для каждой из версий данных. Я использую здесь динамически созданный ресурс, потому что файл, который я открываю, фактически модифицируется ресурсом powersell_script прямо перед ресурсом ruby_block.
Я также попробовал нединамически созданный ресурс каталога, и у него также была та же ошибка, так что это не проблема
В любом случае, я получаю следующую ошибку
Errno::EINVAL: directory[d:/Program Files/ALK/data/PCM/2020_Q1_NA
] (dynamically defined) had an error: Errno::EINVAL: Invalid argument - d:/Program Files/ALK/data/PCM/2020_Q1_NA
ruby_block 'get the dataversions and the paths' do
block do
File.open('C:\deploy\chefpackages\alk_pcmworker\cookbooks\alk_pcmworker\dataversions.json', 'rb:BOM|UTF-16LE') do |f|
f.each_line do |line|
dataversion = line.encode("UTF-8", "UTF-16LE")
puts dataversion.encoding # UTF-8
dataversionPath = File.join(node['alk']['dataversions']['datafilesroot'], dataversion)
resource = Chef::Resource::Directory.new(dataversionPath, run_context)
resource.rights(:full_control, 'Administrators', applies_to_children: true)
resource.rights(:read_execute, 'IIS_IUSRS', applies_to_children: true)
resource.recursive(true)
resource.run_action(:create)
end
end
end
action :run
end
Я полагаю, что проблема возникает из-за переменной dataversion, которую я закодировал в UTF-8, поскольку, если я статически установлю для переменной значение «2020_Q1_NA», ресурс каталога будет создан, но, по моим выводам, кодировка вызывает некоторые проблемы.
Есть ли что-то, чего мне не хватает, и как мне решить эту проблему. Я также добавил трассировку стека для рецепта шеф-повара?
ТРАССИРОВКА СТЕКА
Generated at 2021-01-13 09:12:37 -0500
Errno::EINVAL: ruby_block[get the dataversions and the paths] (alk_pcmworker::data_instancestore line 32) had an error: Errno::EINVAL: directory[d:/Program Files/ALK/data/PCM/2020_Q1_NA
] (dynamically defined) had an error: Errno::EINVAL: Invalid argument - d:/Program Files/ALK/data/PCM/2020_Q1_NA
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:219:in `block (2 levels) in mkdir_p'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:217:in `reverse_each'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:217:in `block in mkdir_p'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:203:in `each'
C:/opscode/chef/embedded/lib/ruby/2.0.0/fileutils.rb:203:in `mkdir_p'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider/directory.rb:118:in `block in action_create'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/mixin/why_run.rb:52:in `call'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/mixin/why_run.rb:52:in `add_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider.rb:175:in `converge_by'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider/directory.rb:116:in `action_create'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider.rb:144:in `run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource.rb:596:in `run_action'
C:/Users/Administrator/.chef/local-mode-cache/cache/cookbooks/alk_pcmworker/recipes/data_instancestore.rb:49:in `block (4 levels) in from_file'
C:/Users/Administrator/.chef/local-mode-cache/cache/cookbooks/alk_pcmworker/recipes/data_instancestore.rb:37:in `each_line'
C:/Users/Administrator/.chef/local-mode-cache/cache/cookbooks/alk_pcmworker/recipes/data_instancestore.rb:37:in `block (3 levels) in from_file'
C:/Users/Administrator/.chef/local-mode-cache/cache/cookbooks/alk_pcmworker/recipes/data_instancestore.rb:36:in `open'
C:/Users/Administrator/.chef/local-mode-cache/cache/cookbooks/alk_pcmworker/recipes/data_instancestore.rb:36:in `block (2 levels) in from_file'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider/ruby_block.rb:35:in `call'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider/ruby_block.rb:35:in `block in action_run'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/mixin/why_run.rb:52:in `call'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/mixin/why_run.rb:52:in `add_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider.rb:175:in `converge_by'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider/ruby_block.rb:34:in `action_run'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/provider.rb:144:in `run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource.rb:596:in `run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/runner.rb:74:in `run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/runner.rb:106:in `block (2 levels) in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/runner.rb:106:in `each'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/runner.rb:106:in `block in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/resource_list.rb:83:in `block in execute_each_resource'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:116:in `call'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:116:in `call_iterator_block'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:85:in `step'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/resource_collection/resource_list.rb:81:in `execute_each_resource'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/runner.rb:105:in `converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/client.rb:658:in `block in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/client.rb:653:in `catch'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/client.rb:653:in `converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/client.rb:692:in `converge_and_save'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/client.rb:271:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application.rb:243:in `run_with_graceful_exit_option'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application.rb:220:in `block in run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/local_mode.rb:44:in `with_server_connectivity'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application.rb:203:in `run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application/client.rb:413:in `block in interval_run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application/client.rb:403:in `loop'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application/client.rb:403:in `interval_run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application/client.rb:393:in `run_application'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/lib/chef/application.rb:58:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/2.0.0/gems/chef-12.6.0-universal-mingw32/bin/chef-client:26:in `<top (required)>'
C:/opscode/chef/bin/chef-client:64:in `load'
C:/opscode/chef/bin/chef-client:64:in `<main>'
Ответ №1:
Прямо сейчас я только что решил эту проблему, просто выполнив следующее. После преобразования я проверил строку, и в ней были специальные символы, поэтому я просто удалил их. Вероятно, это не лучший способ, но он решил проблему. Проблема заключалась в специальных символах, которые все еще были там, хотя в строке указано, что это UTF-8. Ресурс каталога создал пользовательские папки сейчас!!
dataversion = line.encode("UTF-8", "UTF-16LE")
dataversion = dataversion.inspect
# deleting leftover special characters
dataversion.delete! '"\r\n'