Gerenciar livros de culinária do chef em um ambiente de equipe

13

Estou aprendendo chef e tendo problemas para estruturar tudo para trabalhar com minha equipe.

Para começar, parece que você deve criar uma pasta chef-repo, onde você irá armazenar e modificar os livros de culinária usados para gerenciar seus nós.

Eu trabalho em vários projetos, e cada um deles já está sob controle de código-fonte. O ideal seria manter uma pasta de chef-repo em cada um dos meus projetos com os livros de receitas do projeto, certo?

No entanto, na pasta chef-repo, tenho que adicionar uma pasta de configuração (.chef) com minha configuração de faca e minhas validações de chave, e elas são específicas para mim. É normal simplesmente adicionar a pasta .chef ao arquivo gitignore?

Eu entendo que os livros de culinária são enviados ao servidor do chef para serem implantados. Como outras equipes separam a preparação dos ambientes de produção sem duplicar muito trabalho? Nós temos um ramo mestre que é o nosso ramo de produção, um ramo de desenvolvimento que é o nosso ramo de teste (recebe menos de 5% dos pedidos do site) e ramos de recursos. Na maioria das vezes, o ramo dev quando estável é mesclado ao branch master. Como podemos carregar os livros de culinária separadamente para podermos ter dois ambientes separados?

Obrigado pela ajuda!

    
por Alex Recarey 29.12.2011 / 20:12

4 respostas

15

Eu trabalho com vários projetos, então a solução da cjc não funciona para mim. Há também uma questão de configuração comum vs personalizada (endereços etc são comuns para a empresa, há também um pouco de mágica nas configurações). O esquema que eu finalmente decidi é um pouco complicado, mas é conveniente.

Em vez do global ~/.chef , eu uso o subdiretório '.chef' dentro do chef-repo, que não é armazenado no git (ele é adicionado ao .gitignore ). Eu também tenho arquivo config/knife.rb arquivo que é verificado no Git e contém configuração compartilhada. Começa com este trecho:

root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
  conf = File.join(root_dir, ".chef", conf_name)
  Kernel::load(conf) if File.exists? conf
end

Isso carrega arquivos .chef/knife-local.rb contendo configuração personalizada (na versão básica é apenas OPSCODE_USER='username' constante que é usada mais tarde, mas pode conter qualquer configuração de faca) e .chef/knife-secrets.rb que contém segredos compartilhados (chaves AWS etc) .

Abaixo disso, há uma configuração de faca regular que usa constantes definidas nesses arquivos, por exemplo:

client_key               "#{root_dir}/.chef/#{OPSCODE_USER}.pem"

Dessa forma, eu obtenho a padronização da configuração de faca em toda a empresa, o que, por sua vez, significa que qualquer fragmento de código ou chamada de faca compartilhada em um wiki funcionará para todos. Há bastante confusão e magia na própria faca - configurações diferentes só tornariam isso pior. Além disso, todos se beneficiam de pequenos snippets mágicos, como este para fazer com que knife ssh use login configurado no usuário ~/.ssh/config

Há também problemas de segredos compartilhados: a chave de validação do servidor do chef, as chaves da AWS armazenadas em knife-secrets.rb , a chave privada do EC2 do SSH, as chaves de pacote de dados criptografadas e assim por diante. Nós definitivamente não queremos que eles sejam armazenados no repositório - ou, na verdade, em qualquer lugar onde eles não sejam criptografados com segurança. Portanto, distribuímos esses arquivos como um arquivo .tar.gz , que é criptografado por GPG para todos na empresa e compartilhados pelo Dropbox.

Configurar tudo isso está ficando complicado, e eu quero que pessoas em equipe realmente usem a coisa, então há o elemento final: rake init task que cria .chef directory, symlinks config/knife.rb there, descriptografa e untars chef-secrets.tgz file, certifica-se de que a chave privada do Opscode Platform do usuário está lá e .chef/knife-local.rb está configurada corretamente, com plug-ins de faca symlinks e define as permissões adequadas no diretório e nos arquivos internos. Essa tarefa é configurada para que seja seguro executá-la várias vezes no repositório já inicializado (por exemplo, para atualizar segredos ou plug-ins de faca).

Há também uma tarefa auxiliar que repaga todos os segredos, criptografa o tarball para todos e o copia para a caixa de depósito, para facilitar a adição de novos funcionários ou a alteração de segredos.

Em relação a vários ambientes: o Chef tem um recurso chamado ambientes . Eu não usei ainda, mas deve fazer o que você precisa. Você também pode separar estritamente o ambiente de produção (para evitar que os desenvolvedores tenham quaisquer chaves que se relacionem de alguma forma ao env de produção) tendo duas organizações Hosted Chef separadas ou servidores Chef. Este snippet knife.rb mostra como configurar a faca de maneira diferente com base em atualmente check-out branch - você pode usar isso para definir o ambiente, bem como url do servidor chef. Há também o plugin de faca chamado fluxo de facas , fornecendo um fluxo de trabalho de duas organizações mais completo.

    
por 30.12.2011 / 14:17
3

Você precisa configurar dois servidores Chef, um para produção e outro para desenvolvimento. A razão é que nenhum único servidor Chef pode suportar desenvolvimento ramificado; mesmo com ambientes.

Ou você pode abandonar o conceito do servidor Chef e usar o chef-solo. Você pode manter seus livros de culinária no Git. Você pode ramificar & mesclar. Você pode ignorar os problemas com credenciais de faca, porque você não os usará mais.

Você não poderá usar busca por faca ou bolsas de dados **. Mas algumas pessoas não precisam desses recursos de qualquer maneira.

** Bem, você pode: link

    
por 14.09.2012 / 22:32
2

Eu tenho dois diretórios em minha casa, .chef e chef-repo. O chef-repo está no git. O .chef é um diretório privado que é o padrão para faca. Você não precisa colocar seus segredos de .chef no git; faca vai procurar por ~ / .chef.

    
por 29.12.2011 / 20:56
2

Seu diretório ~ / .chef não deve estar no repositório git.

Eu tenho um diretório ~ / projects / sob o qual eu mantenho meu repositório de chef. Neste vão as configurações dos meus servidores.

Meu último trabalho foi como engenheiro de sistemas na loja Ruby-on-Rails. Nossas configurações de nginx, verniz e rails (entre outras) vão no repo do chef, mas os próprios aplicativos do Rails foram mantidos em repositórios de gits separados e foram implementados separadamente.

Nosso ambiente de preparação era um único servidor que executava todo o ambiente de preparação. Isto não era ideal porque não se assemelhava à Produção onde Rails se afina e o DB está em caixas separadas. O que eu recomendaria é usar os ambientes do Chef para separar o armazenamento temporário e a produção. (Foi assim quando cheguei lá, e não tenho tempo para consertar isso antes de sair.)

    
por 30.12.2011 / 15:07

Tags