RailsConf'09: Gerenciamento de configuração usando Chef
A RailsConf’09 começou ontem e o Hisamoto e eu estivemos bastante ocupados desde então. Ontem foi o dia dos tutoriais e nós assistimos um sobre gerenciamento de configuração, utilizando uma ferramenta nova chamada Chef.
Edd Dumbill, foi o palestrante e ele também é um dos membros da equipe de desenvolvimento do Chef. Segundo ele, os programadores estão cada vez mais adquirindo funções operacionais em decorrência da rotina de desenvolvimento. Isso se deve ao fato de precisarem configurar e manter ambientes de suporte ao desenvolvimento e de produção, com controle de versão, rotinas de deploy, integração contínua e os demais serviços de rede, de forma que se o processo não for automático, a manutenção desses ambientes acarreta em uma sobrecarga operacional.
Chef foi desenvolvido em Ruby utilizando o framework Merb e em parte agrega as mesmas funcionalidades que o Puppet e o Cfengine possuem, como o gerenciamento de configuração propriamente dito, mas existem diferenças importantes de natureza objetiva e também subjetiva entre essas ferramentas e o Chef. Gerenciamento de configuração é apenas uma parte do que é possível realizar com o Chef. Trata-se de um sistema bastante rico em funcionalidades para administração de infra-estrutura, na verdade é parte de um framework de administração de sistemas.
O Chef utiliza uma arquitetura cliente/servidor, onde o servidor, chamado de Chef Server, controla os clientes, chamados de Chef Clients. Tudo pode ser administrado via interface web, com suporte de uma API REST e autenticação OpenID.
Cada Chef Client é responsável pela configuração de um ou mais Nodes, que são os sistemas (computadores e roteadores, por exemplo), onde as Recipes são aplicadas.
Recipe é a unidade reutilizável do Chef. Nela estão definidos os Resources que configuram um determinado aspecto do sistema.
Para exemplificar o conteúdo de uma Recipe, temos o trecho abaixo que serve para gerenciar o arquivo sudoers de ambientes Linux:
package "sudo" do action :upgrade end template "/etc/sudoers" do source "sudoers.erb" mode 0440 owner "root" group "root" variables( :sudoers_groups => node[:authorization][:sudo][:groups], :sudoers_users => node[:authorization][:sudo][:users] ) end
Para mais detalhes sobre a criação de Recipes, veja a página sobre Recipes no Wiki do Chef.
As Recipes ficam armazenadas em Cookbooks, que são as unidades de distribuição do Chef. É através delas que os Nodes aprendem o que devem fazer para se configurar.
Existem Recipes para configurar um servidor de Apache, MySQL, OpenLDAP, entre outros, tornando o provisionamento e o gerenciamento desses serviços automático e mais seguro.
A criação de Recipes é realizada através de um script rake e elas são escritas em Ruby. Isso é uma grande vantagem pois a configuração dos Nodes torna-se um script executável. Ao invés de ter um manual descrevendo o que um servidor deve fazer e como configurá-lo, pode-se deixar isso registrado em Recipes. Além disso, segundo os autores, o Chef teve a chance de aprender com a experiência do Puppet para aprimorar a implementação.
No final da palestra, eles apresentaram um sistema que utiliza o Chef como base para a administração de ambientes de cloud, chamado PoolParty, com suporte a Amazon EC2 e VMWare.


