【问题标题】:Run ruby code at execution (run time) time在执行(运行时)时运行 ruby​​ 代码
【发布时间】:2019-08-05 21:30:03
【问题描述】:

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

属性/default.rb

default['dir_list'] = []

recipes/default.rb

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

recipes/list_dir.rb

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

run_list

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

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

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

不管怎样,我们可以在运行时设置node['dir_list'],然后执行default.rb上的代码。

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

【问题讨论】:

  • 我应该按照你的描述工作。确保在default 之前调用list_dir 配方。如果不是,您始终可以使用include_recipedefault 中包含list_dir 配方。

标签: chef-infra


【解决方案1】:

不管怎样,我们可以在运行时设置node['dir_list']

当然可以,这是来自chef documenation的摘录

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

您可以使用attribute types 之一设置\更改配方中的节点属性。请参阅change attributes 了解更多信息。

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

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

几点说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 2017-12-16
    • 2023-03-13
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多