Пользовательские свойства ресурса Chef - PullRequest
1 голос
/ 11 марта 2020

Я создал кулинарную книгу, используя:

chef generate cookbook demo
chef generate attribute default
chef generate resource package

recipes \ default.rb :

demo_package 'Demo'

resources \ package.rb :

property :resource_prop1, String
property :resource_prop2, String

default_action :install

load_current_value do
  puts
  puts "the current value before change for 'test_prop1': #{resource_prop1}"
  puts "the current value before change for 'test_prop2': #{resource_prop2}"
  resource_prop1 = node['demo_resource']['test_prop1']
  resource_prop2 = node['demo_resource']['test_prop2']
  puts "the current value after change for 'test_prop1': #{resource_prop1}"
  puts "the current value after change for 'test_prop2': #{resource_prop2}"
end

action :install do
    puts "the current value after load properties for 'test_prop1': #{new_resource.resource_prop1}"
    puts "the current value after load properties for 'test_prop2': #{new_resource.resource_prop2}"
end

атрибуты \ default.rb :

default['demo_resource'] = {}
default['demo_resource']['test_prop1'] = 'test value 1'
default['demo_resource']['test_prop2'] = 'test value 2'

Я ожидал, что результат будет выглядеть следующим образом:

the current value before change for 'test_prop1':
the current value before change for 'test_prop2':
the current value after change for 'test_prop1': test value 1
the current value after change for 'test_prop2': test value 2
the current value after load properties for 'test_prop1': test value 1
the current value after load properties for 'test_prop2': test value 2

, но Я действительно получил:

the current value before change for 'test_prop1':
the current value before change for 'test_prop2':
the current value after change for 'test_prop1': test value 1
the current value after change for 'test_prop2': test value 2
the current value after load properties for 'test_prop1': 
the current value after load properties for 'test_prop2':

Я пытаюсь найти правильный способ ссылки на свойства ресурса из блока действий. Что я делаю не так?


ОБНОВЛЕНИЕ

Я попытался изменить эту строку:

puts "the current value after load properties for 'test_prop1': #{new_resource.resource_prop1}"

в это:

puts "the current value after load properties for 'test_prop1': #{resource_prop1}"

но я получил эту ошибку:

NameError undefined local variable or method `resource_prop1' for #<#Class:0x0000000007b51178>:0x00000000084b3680> Did you mean?  resources

ОБНОВЛЕНИЕ 2

Мне удалось обойти эту проблему, изменив Блок local_current_value выглядит следующим образом:

load_current_value do |package|
  puts
  puts "the current value before change for 'test_prop1': #{package.resource_prop1}"
  puts "the current value before change for 'test_prop2': #{package.resource_prop2}"
  package.resource_prop1 = node['demo_resource']['test_prop1']
  package.resource_prop2 = node['demo_resource']['test_prop2']
  puts "the current value after change for 'test_prop1': #{package.resource_prop1}"
  puts "the current value after change for 'test_prop2': #{package.resource_prop2}"
end

Ответы [ 2 ]

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

В пользовательских ресурсах есть 2 объекта: current_resource и new_resource. Вы создаете new_resource, когда используете свой собственный ресурс в рецепте:

demo_package 'Demo' do
  resource_prop1 'foo'
  resource_prop2 'bar'
end

Внутри load_current_value вы должны загружать текущее состояние ресурса. Например, если вы хотите создать файл с некоторым путем и владельцем, то в load_current_resource вы должны получить файл и его текущего владельца для последующей проверки, изменился ли ресурс. В вашем текущем методе вы фактически присваиваете current_resource.resource_prop1 и current_resource.prop2.

И так как new_resource и current_resource являются различными объектами, значения, которые вы устанавливаете в load_current_resource, не передаются из current_resource в new_resource.

Если вам нужны загруженные значения внутри блока действий, используйте current_resource:

action :install do
    puts "the current value after load properties for 'test_prop1': #{current_resource.resource_prop1}"
    puts "the current value after load properties for 'test_prop2': #{current_resource.resource_prop2}"
end

Ответ на обновление 2

Когда вы передаете параметр в load_corrent_resource, этот параметр фактически ссылается на new_resource. Это иногда полезно, если

  1. Вам нужны некоторые значения из new_resource для вычисления значений current_resource.
  2. Вам необходимо вычислить и присвоить некоторое значение new_resource.

Существует соглашение для вызова этого параметра desired, например:

load_current_value do |desired|
  # will assign current_resource.resource_prop1 = calculate_value(new_resource.resource_prop1)
  resource_prop1 calculate_value(desired.resource_prop1)
  [...]
  # will assign new_resource.resource_prop2
  desired.resource_prop2 some_calculation
end
0 голосов
/ 14 марта 2020

см. пользовательских ресурсов , в вашем случае это должно быть что-то вроде

new_resource.resource_prop1
...