Использование библиотечных функций в ресурсах шеф-повара
Я создал поваренную книгу шеф-повара "lcd_web_source" со следующей структурой каталогов.
Содержание моего helpers.rb показано ниже
module Lcd_web_source
module Helpers
def platform_package_httpd
case node['platform']
when 'centos' then 'httpd'
when 'ubuntu' then 'apache2'
end
end
def platform_service_httpd
case node['platform']
when 'centos' then 'httpd'
when 'ubuntu' then 'apache2'
end
end
end
end
Chef::Recipe.include(Lcd_web_source::Helpers)
Chef::Resource.include(Lcd_web_source::Helpers)
содержимое файла ресурсов "hello.rb" выглядит следующим образом
include Lcd_web_source::Helpers
resource_name :hello_httpd
property :greeting, :kind_of => String
default_action :create
action :create do
package platform_package_httpd
service platform_service_httpd do
action [:enable, :start]
end
template '/var/www/html/index.html' do
source 'index.html.erb'
owner 'apache'
group 'apache'
variables(
greeting_scope: node['greeting_scope'],
greeting: new_resource.greeting,
fqdn: node['fqdn']
)
end
end
а мой рецепт default.rb выглядит как
package platform_package_httpd
hello_httpd 'greet world' do
greeting "Hello"
action :create
end
Когда этот рецепт запускается, первое утверждение
package platform_package_httpd
работает нормально, что означает, что рецепт может найти библиотечные функции.
Но второе утверждение терпит неудачу со следующей ошибкой
NameError: undefined local variable or method `platform_package_httpd' for #<#<Class:0x0000000004326f00>:0x0000000004244268>
Короче говоря, ресурс не может найти функции, определенные в библиотеке. Помогите мне понять, почему это происходит.
0 ответов
Этот пример выглядит из курса Linux Academy. Я должен был использовать action_class
в пользовательском ресурсе DSL. С использованием action_class
Блок я смог использовать метод, который я создал в библиотеки /helper.rb
Измените свой hello.rb, чтобы включить action_class
блок
action_class do
include Lcd_web_source::Helpers
end
resource_name :hello_httpd
property :greeting, :kind_of => String
default_action :create
action :create do
package platform_package_httpd
Я хотел бы оставить памятку тем, у кого есть еще одна похожая проблема.
Если вы реализуете собственный ресурс в Provider/.rb (определение находится в resources /.rb другим способом, см. https://docs-archive.chef.io/release/12-3/custom_resources.html),
в этом случае, action_class
становится недопустимым синтаксисом, я не смог найти документ для этого в режиме поставщика, но, вдохновленный @Paul B, я считаю, что решение помещает этот оператор в поставщик /*.rb:
include ::YourModule::YourSubModule