DevOps na prática: Começando a trabalhar com o Chef

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 desta 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.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s