Organize seus livros de receitas do site com Berkshelf e este truque

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 Berksfilecomo 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.rbdependê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 Berksfileque 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-cookbookssejam 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.inBerksfile

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 Berksfilessem as seções sitee 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.