Back-End

25 fev, 2016

Python para DevOps: uma habilidade para se desenvolver

Publicidade

A complexidade das camadas que compõem um sistema web exige cada vez mais esforço dos full stack developers ou full stack integrators, que devido à natureza dinâmica dos requisitos da indústria de software precisam se manter atualizados com as novas linguagens de programação e ferramentas que surgem e se provam eficazes com o passar dos anos.

Tim Peters, um guru da linguagem Python e muito influente na comunidade, escreveu em uma lista (muito famosa) que deve existir um e, preferencialmente um, jeito óbvio de solucionar um problema.

Podemos implementar uma lista de requisitos de várias formas, mas a produtividade que cobiçamos está diretamente relacionada à nossa capacidade de escolher os melhores acessórios possíveis para a realização do trabalho.

Todas as linguagens de programação têm seus contras e suas virtudes. Aqui na Gerencianet, nós temos muitas linhas de código em PHP, mas também temos milhares de linhas escritas em NodeJS e Ruby. Utilizamos muitas procedures no MySQL, porém temos Redis e MongoDB nos lugares que julgamos necessário. Procuramos escolher a tecnologia certa para tornar nosso caminho o mais simples possível e quando precisamos automatizar algumas tasks, recorremos ao Python.

Python é uma linguagem de programação open source, bem documentada, com uma comunidade ativa forte e mantida por uma organização sem fins lucrativos, a PSF (Python Software Foundation). Foi criada na década de 1990 por Guido van Rossum, inicialmente para ser utilizada no projeto Amoeba. É multiplataforma, ou seja, compilada para bytecodes que são executados em uma máquina virtual. O mais interessante é que uma das implementações dessa máquina virtual é escrita em… Python!

Em Python, tudo é objeto. Podemos passar funções como parâmetro e atribuí-las a outros objetos. Tem tipagem dinâmica e é multiparadigma, sendo possível programar seguindo um modelo de orientação a objetos, de forma imperativa, estruturada ou mesmo de forma funcional, aplicando funções.

Python pode ser também uma boa opção para o desenvolvimento web, principalmente com frameworks completos como Django ou microframeworks como Flask. A pygame para o desenvolvimento de jogos também tem se mostrado promissora.

A linguagem é nativa em praticamente todas as distribuições Linux. Muitos plugins, jogos e aplicativos foram desenvolvidos utilizando Phyton, como Civilization IV, Frets On Fire, Ubuntu Software Center. Dentre outros aplicativos conhecidos que possuem uma vasta lista de plugins em Python estão GIMP, Inkscape, Sublime Text e Gedit. As primeiras versões de YouTube e Dropbox também eram em Python. Sem falar do Google App Engine e do G1.

Por conseguinte, é importante destacar como Python pode ser útil na criação de scripts para automatização de tarefas. Sua biblioteca padrão é rica em recursos para manipulação de textos, estruturas de dados como listas, tuplas, dicionários e pilhas, além de vários módulos que auxiliam na utilização de funcionalidades do sistema operacional, como listar arquivos e navegar entre diretórios, fazer ssh e rodar um comando remoto, utilizar o Git, enviar requisições para endpoints remotos, abrir e modificar arquivos.

Com o propósito de demonstrar o quão simples e poderosos são os scripts em Python, abaixo seguem algumas linhas de código que, dado um diretório via linha de comando, geram um backup compactado de todos os arquivos existentes naquele diretório.

#!/usr/bin/env python2.7
# coding: utf-8

import argparse
import glob
import tarfile
from time import gmtime, strftime

def backup():
   parser = argparse.ArgumentParser()
   parser.add_argument('--dir', help='Diretório a ser verificado')

   args = parser.parse_args()
   arqs = glob.glob(args.dir)

   dt = strftime("%d-%m-%Y-%H-%M-%S", gmtime())
   tar = tarfile.open('backup-' + dt, "w")

   for arq in arqs:
       tar.add(arq, arq.split('/')[-1])

   tar.close()

if __name__ == '__main__':
   backup()

O script acima pode ser utilizado com o comando abaixo, supondo que esteja salvo em um arquivo com nome backup.py e estejamos no mesmo diretório do arquivo:

./backup.py --dir /home/francisco/documents

Um arquivo no formato backup-14-02-2016-22-11-42 será criado. Podemos observar a utilização do módulo argparse para receber e fazer o parse dos argumentos, o módulo glob para listar os arquivos e o tarfile para gerar o tarfile. Do módulo time importamos duas funções para auxiliar na criação do nome do arquivo no formato especificado. Tudo muito alto nível, sem complicação.

Outro módulo muito útil é o os. Com ele, podemos manipular recursos do sistema operacional. O código abaixo, por exemplo, dá permissão de execução para o arquivo especificado:

#!/usr/bin/env python2.7
# coding: utf-8

import os, argparse, stat

def add_x():
   parser = argparse.ArgumentParser()
   parser.add_argument('--file', help='Arquivo ao qual será atribuído permissão de execução (somente para o dono)')
   args = parser.parse_args()
   os.chmod(args.arquivo, stat.S_IEXEC)

if __name__ == '__main__':
   add_x()

Suponhamos que agora precisamos rodar um comando, porém em outra máquina. Podemos utilizar o modulo paramiko para facilitar:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.0.10', username='francisco, password='123456', port=22, timeout=600)
stdin, stdout, stderr = client.exec_command('ls -l')
result = stdout.readlines();
client.close();
print result

O código acima loga via ssh no IP especificado, executa “ls -l” e exibe o resultado. Como o paramiko é uma dependência externa, é interessante  utilizar o virtualenv  para manter as dependências do projeto isoladas e o pip para instalar e gerenciar essas dependências.

Por fim, acredito que os administradores de redes e infraestrutura podem considerar o Python, assim como o Shell script, uma boa opção para automatizar tarefas. Para os desenvolvedores, acredito que será uma opção até mais confortável.

Para aqueles interessados em se aventurar e aprofundar os conhecimentos na linguagem, neste link está a documentação oficial. Quem quiser participar da python-brasil, uma lista de discussão bastante movimentada, pode se inscrever aqui.