我正在尝试为不同的环境构建 nginx 文件。我的配方有一个哈希图,如下所示:
domain = {
production: {
public: 'example.com',
internal: 'example.dev'
},
staging: {
public: 'examplestage.com',
internal: 'examplestage.dev'
}
}
template '/etc/nginx/conf.d/example.conf' do
source 'example.conf.erb'
variables(
:domain => domain,
)
end
在我的模板中,我想做这样的事情:
...
server <%= @domain[node.chef_environment][:public] %> <%= @domain[node.chef_environment][:public] %>;
...
我试图根据节点所属的环境对其进行类似的评估staging
:production
server example.com example.dev;
问题是,该node.chef_environment
部分没有进行插值。我该如何解决这个问题?
答案1
我怀疑你的代码失败是因为 'node.chef_environment' 是一个字符串,而你的哈希键是符号。如果是这样的话,@domain[node.chef_environment.to_sym][:public]
可能会有效。
但是:最好避免将这种逻辑放入模板中 - 而是在配方中执行:
template '/etc/nginx/conf.d/example.conf' do
source 'example.conf.erb'
variables(
:domains => domain[node.chef_environment.to_sym],
)
end
然后,在模板中:
...
server <%= @domains[:public] %> <%= @domains[:internal] %>;
...
阅读此配方代码时,可以清楚地看到模板不会使用所有域 - 仅使用与其环境相关的域。阅读模板时,变量更短且更易于阅读。