我正在尝试在包含的文件中使用局部变量。我收到错误,提示它未定义。我不知道该怎么做,你呢?我有一个配方文件夹,里面有:
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
您不能在配方之间共享变量,但有两种方法可以在配方之间共享数据。
- 首选方法是将
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
- 使用Chef 库创建一个返回这些数组的通用方法。
我的建议是一定要坚持选择第一种,这是最常见的方法。希望对您有所帮助!
答案2
这次参加聚会有点晚了,我认为接受的解决方案是这里的首选,但是......
可以在“父”配方中设置变量,并通过修改收敛时的节点将其用于包含的配方中,例如
node.default['django'] = ["project1", "project2"]
我过去曾经这样做过,我希望辅助配方在从不同的“父”配方调用时表现得略有不同,即安装不同的 git repo,基于访问从属性中略有不同的配置集。
至于这是否是最佳实践,我欢迎评论,但这似乎比编写资源来包装 git lwrp 更容易。