Назад | Перейти на главную страницу

Шаблон 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] %>;
...

Я пытаюсь получить это, чтобы оценить что-то вроде этого, в зависимости от среды, к которой принадлежит узел staging или production:

server example.com example.dev;

Проблема в том, что node.chef_environment часть не интерполируется. Как мне решить эту проблему?

Я подозреваю, что ваш код не работает, потому что 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] %>;
...

При чтении этого кода рецепта становится ясно, что шаблон не будет использовать все домены - только те, которые связаны с его средой. При чтении шаблона переменные короче и легче читаются.