Tecnologia

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:

package "apache2" do
 action :install
end

Antes de aplicar a receita, é necessário criar o JSON contendo o nome do cookbook a ser executado:

# vi /opt/chef-repo/teste.json
Adicione a seguinte linha:
{ "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
Compiling Cookbooks...
Converging 1 resources
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:

# vi /opt/chef-repo/cookbooks/teste/recipes/default.rb
cookbook_file "/etc/apache2/conf.d/proxy.conf" do
 source "config"
 mode 0755
 owner "root"
 group "root"
end

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:

service "apache2" do
action :nothing
end

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:

cookbook_file "/etc/apache2/conf.d/proxy.conf" do
 source "config"
 mode 0755
 owner "root"
 group "root"
 notifies :restart, "service[apache2]", :immediately
end

Modifique o arquivo config inserido na pasta files e execute a receita. Veja a saída:

# chef-solo -c /opt/chef-repo/solo.rb -j /opt/chef-repo/teste.json
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 3 resources
Recipe: teste::default
 * 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
       @@ -1,2 +1,2 @@
       -TESTE
       +#TESTE
        #TESTE
 * service[apache2] action restart
   - restart service service[apache2]
 * service[apache2] action nothing (skipped due to action :nothing)
Chef Client finished, 2 resources updated

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:

package "apache2" do
 action :install
end
cookbook_file "/etc/apache2/conf.d/proxy.conf" do
 source "config"
 mode 0755
 owner "root"
 group "root"
 notifies :restart, "service[apache2]", :immediately
end
service "apache2" do
 action :nothing
end

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.


  • Receba nosso conteúdo em primeira mão.