Berkshelf é um gerenciador de dependência semelhante a um bundler para livros de receitas do Chef. A abordagem que ele incentiva é tratar seus livros de receitas como bibliotecas ou aplicativos.
- Os livros de receitas da biblioteca devem se concentrar em um componente específico, reutilizável e configurável.
- Os livros de receitas de aplicativos devem unir os da biblioteca para atingir objetivos de negócios específicos.
Por mais que o Berkshelf defenda que você mova os livros de receitas do Chef para seus próprios repositórios git , um usuário do Chef Solo ainda muito provavelmente acabará com alguns livros de receitas de aplicativos (ou livros de receitas do site se seguirmos a terminologia do Bibliotecário).
chef-repo
| Berksfile
|_ site-cookbooks
|_ my-wordpress
|_ my-rails
|_ my-sinatra
Infelizmente, a forma como o Berkshelf foi projetado é que ele irá ignorar Berksfiles para livros de receitas de aplicativos, ou seja, este layout não funcionará :
chef-repo
|_ site-cookbooks
|_ my-wordpress
| metadata.rb
| Berksfile
|_ my-rails
| metadata.rb
| Berksfile
|_ my-sinatra
metadata.rb
Berksfile
Ou seja, mesmo se você criar um nível superior Berksfile
como este:
site :opscode
metadata
cookbook 'my-wordpress', :path => './site-cookbooks/my-wordpress'
cookbook 'my-rails', :path => './site-cookbooks/my-rails'
cookbook 'my-sinatra', :path => './site-cookbooks/my-sinatra'
Apenas as metadata.rb
dependências do livro de receitas do site serão satisfeitas com o Berkshelf.
Por quê? Por causa de uma decisão de design . O que você pode contornar se estiver usando o Chef Server para armazenamento de livros de receitas, mas isso é uma história diferente.
Felizmente, encontrei um meio-termo para meu caso de uso. Este é o Berksfile
que eu tenho na raiz do meu repositório Chef Solo:
# vi_ft=ruby:
site :opscode
def dependencies(path)
berks = "#{path}/Berksfile.in"
instance_eval(File.read(berks)) if File.exists?(berks)
end
Dir.glob('./site-cookbooks/*').each do |path|
dependencies path
cookbook File.basename(path), :path => path
end
E este é o layout que tenho:
chef-repo
| Berksfile
|_ site-cookbooks
|_ my-wordpress
| metadata.rb
| Berksfile.in
|_ my-rails
| metadata.rb
| Berksfile.in
|_ my-sinatra
metadata.rb
Berksfile.in
Deste jeito,
./site-cookbooks
sejam notados pelo Berkshelf, o que significa que suas dependências são satisfeitasmetadata.rb
- Seus arquivos específicos serão avaliados para que todas as dependências do livro de receitas sejam bem colocadas no principal (graças a Deus, é Ruby).
Berksfile.in
Berksfile
Berksfile.in
arquivos são assim:
cookbook 'nodejs', :github => 'locomote-cookbooks/nodejs-cookbook'
cookbook 'npm', :github => 'locomote-cookbooks/chef-npm'
cookbook 'forever', :github => 'trabian/chef-forever'
Eles parecem normais Berksfiles
sem as seções site
e metadata
– vê-los fará o Berkshelf reclamar. Felizmente, você não precisa deles por causa do Berksfile na raiz.
Espero que isso o livre de alguma raiva do Berkshelf pela qual passei. Além disso, todos nós temos ambições e opiniões diferentes, vamos ouvir uns aos outros e não ser fanáticos. Paz.