Зависимости поваренной книги от версии шеф-повара - PullRequest
0 голосов
/ 15 марта 2019

У меня есть кулинарная книга-обертка, которая использует ресурсы из других кулинарных книг, но они имеют другие ограничения. Я попытался определить свой metadata.rb следующим образом:

name 'yp_linko'
maintainer 'The Authors'
maintainer_email 'devops@yp.ca'
license 'all_rights'
description 'Installs/Configures yp_linko'
long_description 'Installs/Configures yp_linko'
version '1.3.4'

depends 'apt'
if chef_version '<= 12' then
  depends 'ypg_tomcat'
else
  depends 'yp_tomcat'
end

Это не сработало, так как повар схватил обе кулинарные книги во время конвергенции. Я пробовал пару различных синтаксисов (only_if, если и т. Д.), И ни один не работал. У кого-нибудь есть идеи, чтобы обойти эту проблему?

1 Ответ

1 голос
/ 17 марта 2019

TL; DR

Вы используете ограничение от DSL Chef таким образом, что оно не предназначено для использования. Вы должны выполнять ветвление на основе логического выражения, а не ограничения метаданных. Я предлагаю несколько способов сделать это, используя String # to_f в качестве примеров (не рекомендуется, если вы заботитесь об уровнях исправлений при семантическом версионировании), а также более точный, но часто упускаемый из вида Gem: :. Версия 1007 *

Не используйте ограничение для ветвления

if chef_version '<= 12'

Вы пытаетесь использовать ограничение из DSL. Это ограничение имеет конкретную цель : объявлять версии chef-client, поддерживаемые кулинарной книгой, а не обеспечивать логическое ветвление. Не глядя на базовый код Chef для DSL, я бы сказал, что маловероятно, что выражение питает ваше выражение if-then так, как вы ожидаете. На данный момент, не обращая внимания на то, является ли это правильным шаблоном, вы можете попробовать получить текущую версию инструментов Chef несколькими способами:

  1. Ветвление в версии chef-client, скорее всего, в виде Float (обычно это String). Например:

    if Chef::VERSION.to_f <= 12
    
  2. Получить значение узла из ohai с чем-то вроде:

    if node['chef_packages']['chef']['version'].to_f <= 12
    
  3. Анализировать значение непосредственно у клиента, например ::

    depends %x(chef-client --version).split[1].to_f <= 12 ? 'ypg_tomcat' : 'yp_tomcat'
    

Однако во всех случаях вам придется иметь дело с тем фактом, что вам передают String, содержащую семантическое управление версиями, а не Float или Integer. Итак, вам нужно выяснить, как вы действительно хотите анализировать информацию, которая потенциально подвержена ошибкам (хотя, см. Ниже трюк, использующий Gem :: Version). В любом случае, если вы проанализировали его так, как хотите, вы можете сопоставить его, используя оператор сравнения, чтобы получить желаемое поведение ветвления.

Лучшие варианты

Вместо того, чтобы пытаться ограничить метаданные бизнес-логикой, вам, вероятно, следует переместить данные в атрибут. Рассмотрим атрибут, такой как node['yp_linko']['tomcat_cookbook'], который можно установить на основе какого-либо другого обнаруживаемого значения узла, кроме семантического контроля версий.

Другим подходом было бы объявить обе кулинарные книги зависимостью, а затем включить ту, которая вам нужна, в рецепт вашей поваренной книги yp_linko . Например, если вы не объявили несовместимые версии клиента-шеф-повара в кулинарных книгах Tomcat:

# metadata.rb
depends 'yp_tomcat'
depends 'ypg_tomcat'

# default.rb
if Chef::VERSION <= Gem::Version.new(12)
  include ypg_tomcat::default
else
  include yp_tomcat::default
end

И, наконец, вы должны подумать, имеет ли смысл в первую очередь запускать разные версии ваших клиентов Chef в рамках инфраструктуры. Может быть, бизнесу нужно это сделать, но это реальная проблема, которую вы на самом деле пытаетесь решить. Разветвление в ваших кулинарных книгах - это решение X / Y для решения проблемы инфраструктуры. Вполне вероятно, что у вас есть другие поваренные книги с аналогичными проблемами, поэтому, по крайней мере, стоит подумать, имеет ли смысл ставить всех ваших клиентов на одну версию, а не решать проблему на уровне поваренной книги.

...