Tecnologia

Python para os DevOps: uma habilidade para se desenvolver

Criado em 4 de mar. de 2016

(Atualizado em 5 de mai. de 2021)

A Nova API Efí foi lançada em seis linguagens diferentes: PHP, Ruby, Node.js, .NET e Python. Neste artigo, o desenvolvedor sênior na Efí e scrum master da equipe de desenvolvimento inovativo, Francisco Carvalho, fala mais sobre a linguagem Python:

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 Efí nós temos muitas linhas de código em PHP, mas também temos milhares de linhas escritas em Node.js 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 90 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 atribui-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 Python, 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 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.

Um 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 dependencias do projeto isoladas e o pip para instalar e gerenciar estas dependencias.

Por fim, acredito que os administradores de redes e infra-estrutura 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. E para conhecer a documentação completa da API Efí, clique aqui

Acompanhe-nos e mantenha-se atualizado! Siga no Facebook, Twitter, Instagram e Linkendin!

Escrito por

Francisco Carvalho

Francisco Carvalho é graduado em Sistemas para Internet pelo Instituto Federal de Educação, Ciência e Tecnologia do Sudeste de Minas - Campus Barbacena, onde já trabalhava na área de desenvolvimento. Possui especialização em Engenharia de software centrada em métodos ágeis pelo Centro Universitário Una. Já trabalhou com projetos em Java, C#, PHP, Ruby e NodeJS. É desenvolvedor sênior na Gerencianet desde 2012 e scrum master da equipe de desenvolvimento inovativo. Atualmente trabalha com o foco em Javascript/NodeJS.

Compartilhe nas redes:

Gostou do que viu por aqui?

Cadastre-se para receber os melhores conteúdos exclusivos sobre tecnologia de pagamentos e gestão, para alavancar de vez os seus negócios.