Começando a trabalhar com o Chef
DevOps na prática: começando a trabalhar com o Chef
Por: , outubro 23, 2013
Uma dos primeiros pontos quando se pensa nesta ferramenta é como ela funciona e, como toda documentação, nem tudo é direcionado para a parte prática.
Então, neste post, vou demonstrar pequenos passos práticos para a criação de receitas para o Chef. O Chef, nada mais é que uma tecnologia inovadora que gerencia configurações de forma consistente. Aplicando de forma automatizada, possibilita uma nova forma de entregar TI para o negócio.
Visando o entendimento da ferramenta, o Chef utiliza receitas, chamadas de cookbooks para a execução dos seus procedimentos. Assim, o mais importante do Chef são, além da instalação do serviço, os cookbooks que conterão todas as instalações e configurações necessárias para aplicar em sua máquina ou servidor.
Para começar, vamos realizar alguns testes com a ferramenta Chef-SOLO, que é independente de um servidor, aplicando as receitas localmente sem que haja uma a necessidade de uma outra máquina (servidor). Acho muito interessante este meio, pois para utilizar o Chef como server/client, é necessário realizar o cadastramento do nó cliente para o servidor. Quando falamos em uma estrutura escalável em nuvem, o procedimento de cadastramento do cliente para o servidor, pode ser algo bem complicado.
Obs.: os testes foram realizados no Ubuntu Server 12.04 LTS
Mas vamos lá, o primeiro passo é instalar o Chef-SOLO:
# curl -L https://www.opscode.com/chef/install.sh | bash
Agora, vamos baixar a estrutura básica do Chef:
# wget http://github.com/opscode/chef-repo/tarball/master
# tar -zxvf master
# mv opscode-chef-repo-f9d4b0c/ /opt/chef-repo
# mkdir /opt/chef-repo/.chef
Verifique no diretório "/opt/chef-repo/" a estrutura criada.
Crie e configure o cookbook path, para isso execute o seguinte procedimento:
# vi /opt/chef-repo/.chef/knife.rb
cookbook_path [ '/opt/chef-repo/cookbooks' ]
Configure o arquivo solo.rb:
# vi /opt/chef-repo/solo.rb
Adicione as linhas abaixo:
file_cache_path "/opt/chef-solo"
cookbook_path "/opt/chef-repo/cookbooks"
Será necessário criar o cookbook. Neste caso criaremos o cookbook chamado "teste" e importaremos este para a estrutura do Chef-SOLO:
# knife cookbook create teste
# mv /var/chef/cookbooks/teste /opt/chef-repo/cookbooks/
Agora, vamos começar a realizar testes com a receita, para isso, vamos editar o arquivo default.rb, que contém os procedimentos da receita, dentro da pasta recipes.
# vi /opt/chef-repo/cookbooks/teste/recipes/default.rb
Realizaremos uma instalação básica do apache2, adicione a seguinte estrutura no arquivo:
Antes de aplicar a receita, é necessário criar o JSON contendo o nome do cookbook a ser executado:
# vi /opt/chef-repo/teste.json
{ "run_list": [ "recipe[teste]" ]
Agora, execute a receita:
# chef-solo -c /opt/chef-repo/solo.rb -j /opt/chef-repo/teste.json
Starting Chef Client, version 11.6.2
Recipe: teste::default
* package[apache2] action install
- install version 2.2.14-5ubuntu8.12 of package apache2
Chef Client finished, 1 resources updated
Você pode executar novamente e constatar que ele não tenta realizar a instalação novamente.
Agora, vamos adicionar algumas funcionalidades em nossa receita.
Digamos que temos um arquivo de configuração específico em nosso servidor HTTP e precisamos deixá-lo na receita. Vamos chamar esse arquivo de config e armazená-lo dentro da receita na pasta "files". OBS.: digamos que no arquivo config contém a configuração do proxy apache.
Arquivo armazenado em: /opt/chef-repo/cookbooks/teste/files/default/config
Agora, vamos adicionar este item na receita:
cookbook_file "/etc/apache2/conf.d/proxy.conf" do
source "config"
OBS.: no item "source" olhe que referenciamos o arquivo de "config" criado anteriormente e armazenado na pasta "files"
Execute a receita e verifique se o arquivo "/etc/apache2/conf.d/proxy.conf" foi criado com sucesso.
Se você executar novamente, o Chef não alterará o arquivo de destino, a não ser que você o atualize. Isso é sensacional, pois imagine gerenciando um cluster, onde você simplesmente atualiza o arquivo de origem e todos os nós aplicam este mesmo arquivo.
Agora, vamos alterar a receita e colocar notificações chamando o restart de serviço Apache2, edite o default.rb adicionando as seguintes linhas:
Execute a receita.
Veja que todas as vezes que rodar a receita o item será lido mas nada acontecerá, isso devido a diretiva "action" esta como "nothing".
Agora, vamos notificar o serviço do apache para reiniciar todas as vezes que o arquivo proxy.conf ser alterado, para isso, altere o item "cookbook_file" configurado anteriormente para o seguinte modelo:
notifies :restart, "service[apache2]", :immediately
Modifique o arquivo config inserido na pasta files e execute a receita. Veja a saída:
* package[apache2] action install (up to date)
* cookbook_file[/etc/apache2/conf.d/proxy.conf] action create
- update content in file /etc/apache2/conf.d/proxy.conf from 174696 to 22a2d9
--- /etc/apache2/conf.d/proxy.conf 2013-10-17 15:43:52.000000000 +0000
+++ /tmp/.proxy.conf20131017-1096-glm39c 2013-10-17 15:44:01.000000000 +0000
+#TESTE
* service[apache2] action restart
- restart service service[apache2]
* service[apache2] action nothing (skipped due to action :nothing)
OBS.: se a configuração do arquivo config ser falho para o apache2, ocorrerá falha no restart. Isso é padrão, pois mesmo se não fosse com o Chef, o apache daria erro para reiniciar.
Segue a configuração final da nossa receita de teste:
Este artigo é apenas para começar, não fizemos muitas coisas, porém, para gerir alguns serviços tipo SQUID, APACHE, FIREWALL, etc, poderíamos utilizar esta estrutura.