NetworkMix
Não é de agora que ouvimos falar de automação, vários fabricantes na área de redes apostam alto nisso e inclusive possuem até currículos/certificações focadas nessa especialidade, porém eu percebo que ainda não é tão comum encontrar profissionais que invistam nisso da forma que deveriam (na minha humilde opinião).
Quando falamos de automação em redes conseguimos encontrar muito material para diversas linguagens de programação/scripting, em redes o que vemos de forma mais comum é Python, mas abrindo o leque temos javascript, bash, perl, powershell, etc...
É muito difícil colocar automação dentro de uma caixinha única, muitas empresas possuem aplicações escritas em uma linguagem especifica, ou utilizam um sistema operacional especifico que muitas vezes dita qual a linguagem ‘oficial’ dentro da companhia e isso acaba refletindo no dia a dia de diversas áreas da empresa.
Gostaria de compartilhar o pouco conhecimento que tenho na linguagem Python, alguns scripts, estudo de caso, dicas, tutoriais e mais algumas coisas que podem acabar facilitando a vida de alguém.
Esse post não é necessariamente técnico, então se já tem alguma noção de Python ou já o tem instalado em sua máquina, sabe o que é uma função, dicionário, lista e loops, acredito que pode pular esse post e ir para um mais técnico aqui no blog.
Então vamos lá, Python já existe há relativamente um bom tempo, desenvolvido em 1991 por Guido Van Rossum. Inicialmente o projeto foi concebido como um hobby para mantê-lo ocupado durante o período do natal. A linguagem tem em ênfase a ‘facilidade’ na leitura de código e diminuição da quantidade de linhas necessárias para executar algo.
A versão mais atual (Janeiro 2023) é 3.11 e pode ser consultada em https://www.python.org/downloads/
Em alguns sites é normal vermos Python ser referenciada como uma linguagem de programação e outros a referenciando como linguagem de scripting, de forma geral eu recomendo não se prender a essas definições porque no final das contas isso não altera o resultado que buscamos que é automatizar alguma ação. Apenas para referência, normalmente todas as linguagens de scripting são consideradas linguagens de programação, a diferença principal é que linguagem de script não precisa que o código seja compilado para que seja possível executá-lo. Por exemplo, código em C++ precisa ser compilado antes de conseguirmos executá-los, programas em Python não precisam disso.
Primeiro passo para prosseguirmos é a instalação da versão mais recente de Python em nossa estação, o site oficial possui um tutorial bem simples de como fazer isso (https://docs.python.org/pt-br/3/using/windows.html#using-python-on-windows) em diversos sistemas operacionais, eu normalmente quando estou desenvolvendo, valido a função e execução no Windows e subo o código para o servidor que realmente fará uso do script, no meu caso, Linux.
Além disso, precisamos utilizar um IDE para conseguimos escrever nossos códigos e executá-los, IDE quer dizer ‘Integrated Development Environment’ que é um software que permite numa interface única criar, testar e editar nosso código. Felizmente temos diversas opções de IDE, eu recomendo duas possíveis opções, PyCharm ou Sublime, entre os dois, PyCharm é bem mais completo, mas pode assustar usuários iniciais pelas funcionalidades que possui, nesse e futuros artigos quando possível, utilizarei como referência Sublime, apenas por simplicidade. Um código escrito em um IDE funciona em outro normalmente, então cada um pode buscar seu preferido.
https://www.jetbrains.com/pycharm/
https://www.sublimetext.com/download
Alguns conceitos que eu acredito ser extremamente importantes são apresentados abaixo, são itens que eu sempre (e digo sempre) faço utilização quando preciso escrever algo:
Vamos analisar cada um dos itens acima na prática:
No Sublime precisamos preferencialmente salvar o arquivo antes de começarmos a trabalhar nele.
Programas escritos em Python precisam ser salvos com a extensão ‘.py’, no nosso exemplo eu salvei o arquivo como ‘teste_codigo_python.py’.
Uma dica é sempre evitar usar caracteres especiais no nome e no código em si, um acento em uma letra usado e validado em Windows pode gerar efeitos indesejáveis quando tentamos rodar o mesmo programa em um servidor Unix, por exemplo.
Para iniciamos uma lista precisamos utilizar ‘[]’ e inserir os dados dentro desses colchetes, por exemplo, abaixo estou iniciando a lista chamada ‘minha_lista’ e dentro dela inseri diversos valores, notem que para separar cada item dentro da lista preciso fazer uso de aspas simples ou dupla e vírgula separando os itens dentro da lista:
minha_lista = ['Cisco', 'Fortinet', 'CheckPoint', 'PaloAlto', 'Arista', 'Dell']
No nosso IDE a lista ficará dessa forma:
Dentro dessa lista temos 6 valores, podemos naturalmente pensar que os valores são contados/acessados a partir do 1, 2, 3 e por aí em diante, mas no nosso caso o programa começa a contar os valores a partir de zero, fica assim:
Posição 0 = Cisco
Posição 1 = Fortinet
Posição 2 = CheckPoint
Posição 3 = PaloAlto
Posição 4 = Arista
Posição 5 = Dell
Vamos ver na prática!
Para quem estiver usando Sublime, 'ctrl+b' é um atalho para rodar o programa.
Para acessar um valor especifico dentro de uma lista precisamos informar qual o posição desse valor, no exemplo abaixo estou printando/gerando output para console do item na posição 0 dentro de ‘minha_lista’:
Sempre que quisermos analisar os dados atuais de uma variável podemos utilizar a função ‘print’, é também uma ótima forma de acompanhar a execução do programa passo a passo.
Podemos incrementar a exibição de dados com texto que facilite o entendimento, por exemplo abaixo eu adicionei uma frase que vai ser exibida com a minha consulta da posição 4 da lista:
Mas e se ao invés de buscar um valor especifico na lista navegarmos por todos eles? Nesse caso precisamos utilizar a função de ‘loop’ ou em python ‘for’. O exemplo abaixo mostra isso:
Sempre que precisamos navegar por vários itens fazemos uso de ‘for’, o código acima instrui o programa a fazer um loop dentro da lista ‘minha_lista’ sendo que o valor de cada item é armazenado na variável temporária ‘item’. Essa variável pode ter qualquer nome, mas é sempre recomendável utilizar um nome que seja de fácil entendimento, pois muitas vezes precisamos retornar em um código que escrevemos meses depois e quanto mais complicações criarmos, mais difícil será para relembrarmos oque cada pedaço do código faz.
O próximo item que havíamos listado como essencial é ‘Condições’, conforme brevemente descrito, o uso de condições instrui o programa a executar uma função desde que a condição seja verdadeira, conforme vemos abaixo:
O exemplo acima ainda faz uso da função de loop, pois queremos navegar por todos os itens dentro da lista. Na linha 7 definimos a comparação utilizando ‘if’, a comparação é: ‘se o valor da variável item é igual (note o ‘==’) a ‘PaloAlto’. Como sabemos que o item ‘PaloAlto’ existe dentro da lista assim que a variável ‘item’ possuir esse valor a condição será alcançada/verdadeira e então executada. No nosso caso a função printa que ‘O valor procurado foi encontrado’.
Em caso negativo, o programa continua a sua execução e chega ao ‘else’ que é executado caso a condição superior não tenha sido alcançada.
E se ao invés de procurarmos o valor ‘PaloAlto’ queiramos que a condição seja verdadeira para qualquer valor diferente de ‘PaloAlto’, nesse caso o programa e output ficará dessa forma:
Note que a condição mudou, ao invés do ‘==’, estamos utilizando o ‘!=’ que se lê ‘se o valor da variável item for diferente a ‘PaloAlto’.
O resultado/output se torna o inverso do anterior.
Execução condicional é extremamente poderosa, dando grande flexibilidade na execução de ações especificas de acordo com um resultado esperado ou não.
Vamos agora falar de dicionários. De forma simplista podemos nos referir a um dicionário como uma coleção de par de valores, que é referenciado como ‘chave/key’ e ‘valor/value’.
Diferente de uma lista, quando precisamos iniciar um dicionário fazemos uso de chaves ‘{}’, temos um exemplo abaixo:
meu_dicionario = {'SWITCH01':'172.17.20.1', 'ROUTER01':'172.17.30.1'}
Note que ainda fazemos separação dos valores com uso de vírgula e aspas, mas como falamos um dicionário é uma coleção de pares de valores, no exemplo acima temos dois valores/pares:
A chave ‘SWITCH01’ possui o valor ‘172.17.20.1’
A chave ‘ROUTER01’ possui o valor ‘172.17.30.1’
Vamos dar uma olhada como podemos interagir sobre esses valores. De maneira geral podemos navegar por um dicionário de 3 formas, pelas chaves e valores, pelas chaves ou pelos valores:
No exemplo acima estamos na linha 4 iniciando o nosso dicionário ‘meu_dicionario’. Na linha 7, estamos fazendo uso de um loop (for), criando duas variáveis temporárias chamada ‘chave’ e ‘valor’, esse loop acontecerá nos items (key+value) no dicionário e então irá printar o valor da chave e valor.
Dicionário é um item que precisa de bastante prática por ser relativamente complexo, minha dica é ir brincando com dicionários para ganhar familiaridade.
Se eu quisesse navegar apenas nos valores da chave do dicionário o código ficaria da seguinte forma:
Em contrapartida se eu quisesse navegar apenas nos valores, teríamos o seguinte:
No dia a dia essa função pode ser usada para executar ações especificas de acordo com o tipo de equipamento, por exemplo, podemos ter uma função que verifica se o equipamento é roteador e em caso positivo reseta uma adjacência BGP ou colhe algum dado da tabela de roteamento.
Por fim temos dois últimos itens ‘Função’ e ‘Módulo’.
Após trabalharmos em nosso código e validarmos que ele funciona adequadamente, podemos transformá-lo em uma função que pode ser invocada sempre que necessário, sem que eu tenha que reescrevê-la sempre que preciso. Simplesmente valido que ela funciona e reaproveito a função sempre que precisar.
O exemplo abaixo mostra a definição de uma função chamada ‘minha_primeira_funcao’.
A função em si não é executada enquanto ela não for invocada. É possível fornecer dados a função quando ela é executada, mas para não deixar as coisas mais complexas não irei abordar isso nesse post.
Note que o programa foi executado, porém não gerou nenhum output, isso é porque a função não foi chamada, o exemplo abaixo mostra a função sendo corretamente chamada:
Como a nossa função não precisa de nenhum valor de entrada, podemos chama-la usando apenas "minha_primeira_funcao()"
Por fim, vamos brevemente falar de módulos, que são programas que podem ser importados em outros programas. Podemos categorizar módulos em públicos ou privados.
Os módulos públicos são módulos acessíveis por qualquer pessoa e que são distribuídos através do repositório ‘Pypi’.
Diversos módulos vêm embarcados quando instalamos Python, outros precisam ser instalados manualmente. É possível navegar sobre os módulos disponíveis em https://pypi.org/
Existem milhares de módulos disponíveis para as mais diversas necessidades, todos compartilhados pela comunidade. Esse é um dos motivos principais que faz Python ser tão popular, um código compartilhado por um desenvolvedor pode se encaixar a sua necessidade e ao invés de você ter que escrever a mesma função do zero, é necessário apenas instalá-la e utilizá-la.
Para instalar um módulo, fazemos uso de ‘pip’, que é o gerenciador de pacotes/módulos do Python, que também vem embarcado por padrão na instalação.
Para instalar um módulo usamos a sintaxe: ‘pip install packagename’
Por exemplo, o comando ‘pip install emoji’ irá instalar o módulo ‘emoji’ disponível através do repositório Pypi.
A partir desse momento já podemos utilizar esse módulo em qualquer programa, é importante ler a documentação do módulo para entender como ele deve ser usado, quais valores ele espera receber para funcionar, etc
Para importarmos um módulo dentro de um programa usamos ‘from’.
O exemplo acima importa a função ‘emojize’ do módulo ‘emoji’ que acabamos de instalar.
Executando a função da forma adequada temos o resultado 👍
Módulos privados são os módulos que não estão acessíveis para qualquer pessoa fazer uso, a função simples que criamos nos exemplos anteriores é um exemplo de módulo privado, só você tem acesso a ele.
Desde que o módulo esteja no mesmo diretório que a função principal que vai tentar executá-lo reside, a importação do módulo acontece da mesma forma, o exemplo abaixo mostra o módulo que criamos anteriormente sendo importado e a função importada sendo executada.
Como pudemos ver até aqui, a linguagem Python pode ser facilmente interpretada em sua leitura.
O post ficou relativamente extenso, mas não abordamos nem a ponta do iceberg das possibilidades e características dessa linguagem, queria apenas abordar alguns tópicos de maneira simplista para você ser capaz de entender os próximos artigos que serão publicados e serão focados em funções e módulos pré-montados para uma necessidade especifica.
Para quem tenha interesse em ir mais a fundo e realmente aprender de maneira adequada, recomendo o livro ‘Python Crash Course: A Hands-On, Project-Based Introduction to Programming’ a leitura é de fácil entendimento e diversos exemplos práticos são apresentados o que ajuda a solidificar o conhecimento.