O Chef 11.6.0 finalmente adicionou suporte para ambientes no chef-solo.
A falta de suporte ao ambiente do chef-solo parece ser bastante controversa. Por um lado, uma das características dos ambientes é a capacidade de fixar livros de receitas para ambientes específicos, e isso não faz absolutamente nenhum sentido com o chef-solo. Por outro lado, muitos de nós gostariam de poder mesclar em atributos de nível de ambiente e usar listas de execução específicas do ambiente ao testar com o Vagrant. E acho que encontrei uma maneira simples de contornar o problema. Supondo que eu use a sintaxe do JSON em todos os meus ambientes e funções, e me ater à seguinte convenção para definir atributos (da menor para a mais alta precedência):
Parece que eu posso apenas analisar esses arquivos e injetar os atributos em chef-solo usando a opção -j. Por exemplo, eu poderia fazer algo assim no meu Vagrantfile:
chef_env_conf = parse_json("./environments/#{ENV['CHEF_ENVIRONMENT']}.json")
chef.json = chef_env_conf["override_attributes"]
Como os atributos definidos pela opção -j são aplicados no nível de prioridade normal , pode ser outra maneira de substituir os padrões de função, e isso pode ser tudo o que você precisa em um contexto em que o ambiente não é enviado automaticamente.
Você pode fazer algo semelhante para obter listas de execução por ambiente (analisando os arquivos de função):
chef_role_conf = parse_json("./roles/#{role}.json")
chef.run_list = chef_role_conf["env_run_lists"][ENV['CHEF_ENVIRONMENT']]
Eu percebo que este não é o hack mais elegante, mas parece que pode ser uma solução viável para algumas pessoas. Alguém acha que é uma má ideia?