在执行(运行时)时运行Ruby代码

时间:2019-08-03 22:55:14

标签: chef

这是代码,我想在收敛时执行它以在运行时获取变量值:

属性/default.rb

default['dir_list'] = []

recipes / defailt.rb

node['dir_list'].each do |dir|
  directory dir.to_s do
    group 'root'
    owner 'root'
    mode '755'
    recursive true
    action :create
  end
end

食谱/list_dir.rb

node.default['dir_list'] = ['/usr/dir1', '/usr/dir2', /usr/dir3']

run_list

  • 食谱[list_dir]
  • 食谱[默认]

这里是第一个配方list_dir.rb,设置具有默认创建的3个目录的变量。

问题出在这里,default.rb没有设置这些目录,因为这些值是在编译时获取的。

无论如何,我们可以在运行时设置node ['dir_list']并在default.rb上执行代码。

在这里,我试图通过在运行时提供目录列表来动态创建多个目录。因此,请提供在运行时调用目录资源的最佳方法。

1 个答案:

答案 0 :(得分:0)

  

无论如何,我们可以在运行时设置节点['dir_list']

确定可以,这里是chef documenation的专家

  

可以在食谱(或食谱)中定义属性,然后将其用于覆盖节点上的默认设置。在Chef Infra Client运行期间加载食谱时,会将这些属性与节点上已经存在的属性进行比较。首先根据食谱顺序加载属性文件中定义的属性。对于每个食谱,首先加载default.rb文件中的属性,然后按词法排序顺序加载其他属性文件(如果存在)。当Cookbook属性优先于默认属性时,Chef Infra Client在节点上运行Chef Infra Client时将应用这些新设置和值。

您可以使用attribute types之一来设置\更改配方中的节点属性。有关更多信息,请参见change attributes

例如,配方中节点对象的默认属性:

node.default['apache']['dir'] = '/etc/apache2'

一些注意事项:

  1. 确保设置节点属性的配方出现在读取该节点属性的任何其他配方之前(我发现您提到了运行清单顺序)
  2. 通常在配方中设置节点属性,因为该值仅在厨师-客户融合阶段才知道。如果不是这种情况,请考虑将node属性移动到属性文件。