Chef 模板:通过另一个变量查找哈希键

Chef 模板:通过另一个变量查找哈希键

我正在尝试为不同的环境构建 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] %>;
...

我试图根据节点所属的环境对其进行类似的评估stagingproduction

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] %>;
...

阅读此配方代码时,可以清楚地看到模板不会使用所有域 - 仅使用与其环境相关的域。阅读模板时,变量更短且更易于阅读。

相关内容