【问题标题】:Chef custom resource propertiesChef 自定义资源属性
【发布时间】:2020-03-27 03:16:43
【问题描述】:

我使用以下方法创建了一本食谱:

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

【问题讨论】:

标签: ruby chef-infra


【解决方案1】:

自定义资源中有 2 个对象:current_resourcenew_resource。当您在配方中使用自定义资源时,您将创建 new_resource

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

load_current_value 中,您应该加载资源的当前状态。例如,如果您要创建一个具有某些路径和所有者的文件,那么在load_current_resource 中您应该获取该文件及其当前所有者,以便稍后检查资源是否已更改。在您当前的方法中,您实际上分配了current_resource.resource_prop1current_resource.prop2

由于new_resourcecurrent_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. 您需要计算并分配一些新资源的值。

有一个约定叫这个参数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

【讨论】:

  • 请参阅我的“更新 2”,这实际上与您的建议相同吗?或者“命名”块和 cuurent_resource 之间有区别吗?
【解决方案2】:

custom resources,在你的情况下应该是这样的

new_resource.resource_prop1

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多