Использование библиотечных функций в ресурсах шеф-повара - PullRequest
0 голосов
/ 22 января 2019

Я создал поваренную книгу шеф-повара "lcd_web_source" со следующей структурой каталогов.

enter image description here

Содержимое моего 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>

Короче говоря, ресурс не может найти функции, определенные в библиотеке.Помогите мне понять, почему это происходит.

1 Ответ

0 голосов
/ 31 мая 2019

Этот пример выглядит как курс из Академии Linux. Мне пришлось использовать action_class в DSL Custom Resource. Используя блок 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

Ссылка: https://docs.chef.io/custom_resources.html#custom-resource-dsl

...