Ruby/Chef include_recipe 并知道来自父文件的变量?

Ruby/Chef include_recipe 并知道来自父文件的变量?

我正在尝试在包含的文件中使用局部变量。我收到错误,提示它未定义。我不知道该怎么做,你呢?我有一个配方文件夹,里面有:

recipes/
    development.rb
    testing.rb
    config.rb

开发.rb

username = "vagrant"
static = []
django = ["project1", "project2"]

include_recipe "server::config"   # <-- Trying to use static and django in there.

配置.rb

static.each do |vhost|  #  <-- How do I get the "static" var in here?
    ...
end

django.each do |vhost|  #  <-- How do I get the "django" var in here?
    ...
end

答案1

您不能在配方之间共享变量,但有两种方法可以在配方之间共享数据。

  1. 首选方法是将static和外部化为django中的属性attributes/default.rb。这意味着它们将在对象上可用node,并可从每个配方中访问。

属性/默认.rb

default["server"]["static"] = []
default["server"]["django] = ["project1", "project2"]

食谱/config.rb

node["server"]["static"].each do |vhost|
  ...
end

node["server"]["django"].each do |vhost|
  ...
end
  1. 使用Chef 库创建一个返回这些数组的通用方法。

我的建议是一定要坚持选择第一种,这是最常见的方法。希望对您有所帮助!

答案2

这次参加聚会有点晚了,我认为接受的解决方案是这里的首选,但是......

可以在“父”配方中设置变量,并通过修改收敛时的节点将其用于包含的配方中,例如

node.default['django'] = ["project1", "project2"]

我过去曾经这样做过,我希望辅助配方在从不同的“父”配方调用时表现得略有不同,即安装不同的 git repo,基于访问从属性中略有不同的配置集。

至于这是否是最佳实践,我欢迎评论,但这似乎比编写资源来包装 git lwrp 更容易。

相关内容