Шеф-повар устанавливает серию предварительно упакованных драгоценных камней

Я пытаюсь установить ряд драгоценных камней, необходимых для моих рецептов, но я бы предпочел не устанавливать инструменты разработки (например, gcc, gcc-c++, ruby-devel. см. this для большего контекста) на моих рабочих машинах, поэтому вместо этого я включил соответствующие файлы gem в качестве ресурсов в мою кулинарную книгу.

я использую этот код

node["chef_gems"].each do |pkg, attrs|
  gem_file = "#{pkg}-#{attrs["version"]}.gem"
  dest_gem_file = "#{Chef::Config['file_cache_path']}/#{gem_file}"
  cookbook_file "#{dest_gem_file}" do
      source "gems/#{gem_file}"
  end
  if File.exist?("#{dest_gem_file}")
    chef_gem pkg do
      source "#{dest_gem_file}"
      action :install
    end
  end
end

Проблемы, с которыми я сталкиваюсь

  1. В настоящее время для этого требуется два запуска шеф-повара из-за файла File.exist? check, но без него он не скомпилируется, потому что файл не существует на этапе компиляции. Есть ли более простой способ сделать это?
  2. Некоторые из этих драгоценных камней имеют зависимости, поэтому порядок имеет значение, который по умолчанию кажется алфавитным. Я собираюсь пойти по пути обеспечения порядка с помощью ключа порядка сортировки (уродливого), мне было интересно, есть ли лучший способ.
  3. Отступая назад, это кажется слишком сложным. Существует ли более простая стратегия для достижения цели установки драгоценных камней и их зависимостей без установки инструментов разработки на рабочие серверы.

Вот исходная ошибка без File.exist? чек об оплате

Starting Chef Client, version 11.4.0
resolving cookbooks for run list: ["cis-rhel", "ec2-hostname-rhel", "chef-client", "cassandra"]
Synchronizing Cookbooks:
<REDACTED>
Compiling Cookbooks...
[2013-10-16T18:45:01-04:00] WARN: Cloning resource attributes for user[<REDACTED>] from prior resource (CHEF-3694)
<REDACTED>
[2013-10-16T18:45:01-04:00] WARN: Current  user[cassandra]: /var/chef/cache/cookbooks/cassandra/recipes/user.rb:23:in `from_file'
Recipe: cassandra::packages
  * chef_gem[cassandra-cql] action install
================================================================================
Error executing action `install` on resource 'chef_gem[cassandra-cql]'
================================================================================


Gem::Exception
--------------
Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in /


Cookbook Trace:
---------------
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file'
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `each'
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `from_file'
/var/chef/cache/cookbooks/cassandra/recipes/default.rb:23:in `from_file'


Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/cassandra/recipes/packages.rb

 36:     chef_gem pkg do
 37:       source "#{dest_gem_file}"
 38:       action :install
 39:     end
 40: #  end



Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file'

chef_gem("cassandra-cql") do
  provider Chef::Provider::Package::Rubygems
  action [:install]
  retries 0
  retry_delay 2
  package_name "cassandra-cql"
  source "/var/chef/cache/cassandra-cql-1.1.4.gem"
  cookbook_name "cassandra"
  recipe_name "packages"
end




================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/cassandra/recipes/default.rb
================================================================================


Gem::Exception
--------------
chef_gem[cassandra-cql] (cassandra::packages line 36) had an error: Gem::Exception: Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in /


Cookbook Trace:
---------------
  /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file'
  /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `each'
  /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `from_file'
  /var/chef/cache/cookbooks/cassandra/recipes/default.rb:23:in `from_file'


Relevant File Content:
----------------------
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:

 29:  node["cassandra"]["chef_gems"].each do |pkg, attrs|
 30:    gem_file = "#{pkg}-#{attrs["version"]}.gem"
 31:    dest_gem_file = "#{Chef::Config['file_cache_path']}/#{gem_file}"
 32:    cookbook_file "#{dest_gem_file}" do
 33:        source "gems/#{gem_file}"
 34:    end
 35:  #  if File.exist?("#{dest_gem_file}")
 36>>     chef_gem pkg do
 37:        source "#{dest_gem_file}"
 38:        action :install
 39:      end
 40:  #  end
 41:  end
 42:  
 43:  # Some distributed packages of Cassandra start the service in their
 44:  # postinstall; keep them all equal and a restart can be done after the configs
 45:  # are written on the first run. Added difficulty: they also come with init



[2013-10-16T18:45:01-04:00] ERROR: Running exception handlers
[2013-10-16T18:45:02-04:00] FATAL: Saving node information to /var/chef/cache/failed-run-data.json
[2013-10-16T18:45:02-04:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated
[2013-10-16T18:45:02-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-10-16T18:45:02-04:00] FATAL: Gem::Exception: chef_gem[cassandra-cql] (cassandra::packages line 36) had an error: Gem::Exception: Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in /

person travelingsultan    schedule 16.10.2013    source источник
comment
Пожалуйста, не забудьте отметить ответ как правильный! :)   -  person sethvargo    schedule 02.01.2014


Ответы (1)


  1. Вы можете и должны пропустить сегмент if File.exist?("#{dest_gem_file}"), так как предыдущий ресурс всегда будет создавать файл или вызывать исключение.
  2. Установка их с помощью менеджера пакетов, который может работать с зависимостями, может быть гораздо лучшим вариантом, если вы можете это сделать.
  3. Если это невозможно сделать с помощью диспетчера пакетов rubygems, поскольку ему необходимо скомпилировать собственные расширения для пакетов, вы можете рассмотреть возможность упаковки скомпилированных версий и использования системного диспетчера пакетов для их установки.
person borntyping    schedule 16.10.2013
comment
re: 1. Я хотел бы, но когда я пытаюсь это сделать, я получаю ошибку компиляции рецепта, я полагаю, из-за двухэтапной обработки шеф-повара (т.е. он пытается скомпилировать рецепт и терпит неудачу, потому что файл еще не существует, поэтому никогда не получает до этапа выполнения, на котором он будет создан). Добавление if это то, что исправило это, но по-прежнему требует двух прогонов шеф-повара. Я могу опубликовать подробности этой ошибки, если вы думаете, что я что-то упустил, и предыдущее объяснение не имеет смысла. - person travelingsultan; 17.10.2013
comment
Нет, моя ошибка - chef_gem устанавливает гемы до/во время этапа компиляции рецепта, чтобы их можно было сразу потребовать в рецепте. Это полезно только в том случае, если вы собираетесь использовать драгоценный камень из рецепта шеф-повара, в противном случае вам следует использовать ресурс gem_package (который не требует проверки File.exist?). - person borntyping; 17.10.2013
comment
Мне это нужно только во время рецепта, и я ожидал поведения, которое вы описали, но это не удалось так, как я описал, позвольте мне вернуться к этому состоянию (это займет некоторое время) и опубликовать сообщение об ошибке, возможно, я неправильно понял причину - person travelingsultan; 17.10.2013
comment
Я обновил исходный пост с ошибкой, которая возникает без файла File.exist? чек об оплате. AFAICT, это происходит на этапе компиляции из-за сообщения об ошибке и потому, что файл еще не существует в целевой системе. Итак, поскольку мне нужен драгоценный камень во время рецепта, я думаю, что должен использовать chef_gem, а не gem_package, и поэтому это не работает, поскольку, как вы сказали, это пытались установить на этапе компиляции? - person travelingsultan; 17.10.2013
comment
Да, чтобы использовать гем из рецепта, вам придется использовать chef_gem, но это означает, что он не будет доступен для установки при первом запуске, так как chef_gem устанавливаются до запуска других ресурсов (т. е. на этапе компиляции). если вы хотите использовать шеф-повар для распространения драгоценных камней (вместо того, чтобы размещать их из репозитория), вам, к сожалению, придется дважды запустить шеф-повар и проверить наличие файлов. - person borntyping; 17.10.2013