# Chef - Instalando o ambiente comum

Chef é uma plataforma robusta e completa de automação, que transforma infraestrutura em código, ou seja, permite que instalação, manutenção e configuração de ambientes de infraestrutura sejam feitas de formas automáticas. Chef Possui vários módulos que permitem um alto nível de automação em vários níveis de abstração. Para esse tutorial será usado o Chef-Solo para automatização do ambiente de Ruby on Rails. Utilizando chef você garante que todos os desenvolvedores vão ter a mesma versão de todos os itens de configuração necessário, não havendo divergência de ambiente.
Utilizando a ferramenta Vagrant podemos testar nossa configuração antes de irmos para um servidor de produção. Assumindo que temos uma vagrant box instalada e funcional, iremos focar no chef.

### Instalando o chef

Para grandes infraestruturas o recomendado é utilizar o chef-server que permite automatizar e manter toda infraestrutura com mais de um servidor e várias receitas diferentes, para casos mais simples o chef-solo é suficiente, para isso nós vamos utilizar uma gem chamada 'knife-solo' que engloba o chef-solo e outros comando úteis.
* knife solo init é usado para criar uma estrutura de diretorio que é padrao com o Chef e é utilizado para criar e guardar receitas
* knife solo prepare user@target-node intala o chef em um nó
* knife solo cook user@target-node atualiza as receitas nesse nó, esse comando é utlizado se voce estiver atualizado a configuracao nesse nó.
* knife solo bootstrap user@target-node combina o prepare e o cook em comando, utilizado na primeira vez que estiver configurando um nó
* knife solo clean limpa o nó.
Para instalar essa gem, basta colocar a mesma no seu Gemfile e rodar um bundle install.
Depois o rode o comando knife solo init . para preparar a estrutura de pastas, a comunidade Chef chama essa estrutura de Kitchen.

### Administrando dependências

A comunidade chef já tem vários livros de receita preparados e a gem librarian-chef permite manter essas receitas de maneira similar ao bundle.
Coloque a gem librarian-chef no seu Gemfile e rode bundle install.
Depois rode o comando librarian-chef init isso irá criar um Cheffile onde você pode manter suas receitas. Edite o seu Cheffile como no exemplo abaixo.
Execute o comando librarian-chef install para instalar esses cookbooks.

### Criando seu livro de receitas e sua própria receita chef

A sintaxe do ruby permite códigos expressivos e fáceis de ler. Nessa receita nós configuramos tudo que é necessário para o nosso rails app funcionar, desde de instalar dependencias do SO até o próprio app.
No arquivo metadata.rb dentro do nosso site-cookbooks coloque os cookbooks que o nosso depende.

### Vamos cozinhar nossa receita!

Colocamos no nosso Vagrantfile onde está nossas receitas e qual receita usar e depois é só rodar um vagrant up que ela vai ser executada!

### Exemplo de ambiente Java/Android no ubuntu e distro

O receita a seguir instala:
* Chef recipe
* JDK 8 - Oracle
* Libs: lib32z1, lib32ncurses5, lib32bz2-1.0, lib32stdc++6
* Vim
* Wget
* Git
* Android Studio & Android SDK

## arquivo: android-environment.rb

Pra cozinhar a receita rodamos os comandos no terminal: