Chef: можно ли определить ресурс Chef, использующий шаблон, и вызвать его из другой кулинарной книги?

У меня был ресурс, который использовал шаблон в Chef, и он работал нормально. Другие ресурсы и рецепты в кулинарной книге могут вызывать этот ресурс. В моем случае я определил ресурс артефакта maven, где, учитывая некоторые параметры maven (имя репо, идентификатор артефакта и т.д.), вы можете загрузить файл из репозитория Nexus maven.

Однако, когда я вызываю ресурс из любой другой кулинарной книги, кроме той, в которой он определен (с metadata.rb с указанием зависимости, конечно), я получаю ошибку

 Chef::Exceptions::FileNotFound
           ------------------------------
           template[/usr/local/nexus-download.bash] (/tmp/kitchen/cache/cookbooks/cookbook-1/resources/nexus_http_artifact.rb line 52) had an error: Chef::Exceptions::FileNotFound: Cookbook 'cookbook-2' (1.0.0) does not contain a file at any of these locations:
[...]

Шаблон был в основном сценарием bash, который позже запускался для загрузки артефакта по сети из репозитория maven (Nexus) после проверки суммы MD5 и сравнения с текущей загрузкой с использованием Nexus HTTP API.

1 ответ

Вы можете управлять кулинарной книгой, из которой взят шаблон, через cookbookсвойство ресурса шаблона. Для настраиваемого ресурса свойство cookbook по умолчанию соответствует вызывающей книге рецептов, в которой ресурс используется, а не там, где он объявлен. Вы можете легко это изменить, потому что знаете название книги рецептов, которую пишете. Итак, мы можем сделать что-то вроде этого:

поваренные книги / mytemplate / ресурсы / foo.rb

provides :foo

property :template_source, String, default: "foo.erb"
property :template_cookbook, String, default: "mytemplate"

action :run do
  template "/tmp/foo.xyz" do
    source new_resource.template_source
    cookbook new_resource.template_cookbook
  end
end

поваренные книги /mytemplate/templates/foo.erb:

THIS IS THE DEFAULT TEMPLATE

поваренные книги /test/metadata.rb:

name "test"
version "0.0.1"

depends "mytemplate"

поваренные книги / тест / рецепты /default.rb:

foo "whatever"

Затем вызывающие абоненты могут переопределить это, например, с помощью своих собственных имен шаблонов и местоположений, и "внедрить зависимости" шаблон в ресурс:

поваренные книги / тест / рецепты /default.rb:

foo "whatever" do
  template_cookbook cookbook_name
  template_source "bar.erb"
end

поваренные книги / тест / шаблоны /bar.erb:

THIS IS THE OVERRIDDEN TEMPLATE

В cookbook_file ресурс имеет cookbook свойство, которое должно работать идентично.

Другие вопросы по тегам