Недопустимый аргумент для ресурса каталога Chef? Есть идеи, почему

#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'