Durante a minha árdua trajetória com o PHP, sempre fiz “subidas” de projetos utilizando um cliente FTP. Um processo manual, extremamente repetitivo (e chato).
Já com Python, pude utilizar o SSH, que me proporcionou maior agilidade e liberdade dentro do ambiente de produção. Mas que não deixou de ser um processo manual, extremamente repetitivo, chato e muito suscetível a falhas.
Foi utilizando o Django que conheci o Fabric, e percebi quanto tempo podemos economizar automatizando o processo de deploy de nossos projetos.
O Agile e o deploy contínuo
Todo e qualquer procedimento de upload do seu projeto para o ambiente de produção corre algum tipo de risco. Com o deploy automatizado, a tendência é que este risco seja reduzido, e que você possa fazer a entrega do seu projeto para diversos ambientes com o menor esforço possível.
Logo, não consigo imaginar um cenário eficiente de deploy contínuo, sem a utilização de alguma ferramenta de automatização. É através destas que respeitamos uma das premissas do Agile, e diminuímos a incidência de falha humana.
Mas o que é o Fabric?
O Fabric é uma lib Python, e ferramenta de linha de comando, para auxiliá-lo em seu deploy e na administração remota dos seus sistemas.
Embora seja feita em Python, pode ser utilizada em projetos escritos em qualquer linguagem. Equivale ao Capistrano, alternativa mais famosa, escrita em Ruby.
Em casa de ferreiro, espeto de ferro
Para dar um exemplo de uso do Fabric, podemos utilizar o esquema de deploy do meu blog. Sim! O processo está automatizado, e você pode conferí-lo no BitBucket.
Antes de mais nada, é necessário ter o Fabric instalado:
$ pip install fabric
Todo o procedimento será escrito em um arquivo chamado fabfile.py. Com o comando fab, a ferramenta carregará este arquivo e permitirá a execução de todos os métodos públicos definidos dentro dele.
Vamos listar todos os métodos que criei no fabfile.py do blog:
$ fab -l Available commands: bootstrap Initialize remote host environment. collect_static Collect all static files from Django apps and copy ... create_virtualenv Setup virtualenv on remote host. database_restart Restart the database server on remote server. deploy Send the code to the remote host. http_restart Restart the HTTP server on remote server. migrate Execute South on remote host, to update the databas... production Use production environment on remote host. staging Use staging environment on remote host. syncdb Execute syncdb on remote host. update_apache_conf Move apache and fastcgi files to the public html. update_requirements Update Python dependencies on remote host.
Como é possível notar na listagem acima, temos operações de deploy (deploy, syncdb, update_requirements e update_apache_conf) e operações de administração remota (database_restart, http_restart, migrate, etc). Os métodos production e staging são basicamente para “setar” para qual ambiente o deploy será realizado. Por exemplo, a cada nova subida de release, executo o seguinte comando:
$ fab production deploy http_restart
Onde basicamente:
- Defino o usuário, IP, e paths para o ambiente de produção através do método production.
- Executo o envio dos arquivos através de Rsync para o servidor, com o método deploy.
- Reinicio o Apache através do método http_restart.
Se olharmos atentamente o método deploy, utilizamos uma lib (importada no início do arquivo) chamada rsync_project. Que corresponde a ferramenta de linha de comando (encontrada em sistemas baseados em Unix) chamada rsync. O que o Fabric faz (com maestria) é “abstrair” essas operações para que possamos fazer os nossos procedimentos através de uma interface simples (outros comandos, como scp e sudo também são utilizados pelo Fabric).
A função run faz grande parte da magia acontecer. Com ela, abrimos uma conexão SSH com o nosso servidor, e executamos comandos como se estívessemos em um terminal. Extremamente útil para fazer restart de serviços, escalonamento de logs, limpeza de temporários, etc.
Considerações finais
O Fabric é muito simples de usar. Lendo o básico da documentação, já somos capazes de automatizar os processos mais triviais.
Recomendo o fabfile.py da Caktus Consulting Group. Simples e bem escrito, foi nele que me baseei para escrever o script apresentado neste post.
Referências
Fonte: Blog Klaus Laube