Отсутствие поддержки среды Chef-solo кажется довольно спорным. С одной стороны, одна из особенностей сред - это возможность привязать кулинарные книги к определенным средам, и это не имеет абсолютно никакого смысла для chef-solo. С другой стороны, многие из нас хотели бы иметь возможность объединять атрибуты уровня среды и использовать списки выполнения для конкретной среды при тестировании с помощью Vagrant. И я думаю, что, возможно, нашел простой способ обойти проблему. Предполагая, что я использую синтаксис JSON во всех своих средах и ролях, и я придерживаюсь следующего соглашения для установки атрибутов (от самого низкого до самого высокого приоритета):
Похоже, я могу просто проанализировать эти файлы самостоятельно и ввести атрибуты в chef-solo с помощью опции -j. Так, например, я мог бы сделать что-то вроде этого в моем Vagrantfile:
chef_env_conf = parse_json("./environments/#{ENV['CHEF_ENVIRONMENT']}.json")
chef.json = chef_env_conf["override_attributes"]
Поскольку атрибуты, установленные с помощью опции -j, применяются с обычным уровнем приоритета, это может быть еще один способ переопределить значения ролей по умолчанию, и это может быть все, что вам нужно в контексте, когда среда не загружается автоматически.
Вы можете сделать что-то подобное, чтобы получить списки выполнения для каждой среды (путем анализа файлов ролей):
chef_role_conf = parse_json("./roles/#{role}.json")
chef.run_list = chef_role_conf["env_run_lists"][ENV['CHEF_ENVIRONMENT']]
Я понимаю, что это не самый элегантный прием, но похоже, что для некоторых это могло бы быть работоспособным решением. Кто-нибудь думает, что это действительно плохая идея?
В Chef 11.6.0 наконец-то добавлена поддержка окружения в chef-solo.