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
свойство, которое должно работать идентично.