1 de jun de 2018

YAML e JINJA2 - Parte II

Continuando com YAML, seja o arquivo teste.yml com a seguinte conteúdo:


---
SW1:
 router-id: "1.1.1.1"
 vlans:
    - vlan: 100
      desc: "Vlan da rede 192.168.100.0"
    - vlan: 200
      desc: "Vlan da rede 192.168.200.0"
    - vlan: 300 
      desc: "Vlan da rede 10.10.10.0"
    
 ospf:
    networks:
     - net: 192.168.100.0 
       netmask: "0.0.0.255"
       area: 0
     - net: 192.168.200.0 
       netmask: "0.0.0.128"
       area: 1
     - net: 10.10.10.0 
       netmask: "0.0.0.255"
       area: 2
...

O seguinte script lê o arquivo yaml e armazena o resultado em um dicionário de nome config.

#!/usr/bin/python

import yaml
from pprint import pprint

YAMFILE="/home/jose/teste.yml"

config = yaml.load(open(YAMFILE)) 

pprint(config)

O método load() é o encarregado de fazer o parseamento. O print do dicionário seria:

{'SW1': {'ospf': {'networks': [{'area': 0,
                                'net': '192.168.100.0',
                                'netmask': '0.0.0.255'},
                               {'area': 1,
                                'net': '192.168.200.0',
                                'netmask': '0.0.0.128'},
                               {'area': 2,
                                'net': '10.10.10.0',
                                'netmask': '0.0.0.255'}]},
         'router-id': '1.1.1.1',
         'vlans': [{'desc': 'Vlan da rede 192.168.100.0', 'vlan': 100},
                   {'desc': 'Vlan da rede 192.168.200.0', 'vlan': 200},
                   {'desc': 'Vlan da rede 10.10.10.0', 'vlan': 300}]}}
 

Podemos utilizar esse dicionário para criar um arquivo de configuração para SW1 por exemplo:

#!/usr/bin/python
import yaml
from pprint import pprint

#Carregando arquivo YAML na variavel dicionario config
config = yaml.load(open('teste.yml'))
#pprint(config)

for vlan in config['SW1']['vlans']:
 print("!")
 print("vlan %s" % vlan['vlan']) 
 print("desc %s" % vlan['desc'])

print("!")
print("router ospf 1")
print("router-id %s" % config['SW1']['router-id'])
for networks in config['SW1']['ospf']['networks']:
 print("network %s %s area %s" % (networks['net'],networks['netmask'],networks['area']))

O código acima quando executado resulta em:

!
vlan 100
desc Vlan da rede 192.168.100.0
!
vlan 200
desc Vlan da rede 192.168.200.0
!
vlan 300
desc Vlan da rede 10.10.10.0
!
router ospf 1
router-id 1.1.1.1
network 192.168.100.0 0.0.0.255 area 0
network 192.168.200.0 0.0.0.128 area 1
network 10.10.10.0 0.0.0.255 area 2


Que é uma configuração para um dispositivo Cisco IOS.

Temos visto que é possivél utilizar o dicionário gerado pelo parser pyyaml para gerar o nosso arquivo de configuração.

No script acima toda a lógica de como gerar o arquivo de configuração, esta no código fonte do script, dessa forma se outra pessoa por exemplo tem um arquivo yaml igual ao nosso e precisa gerar um arquivo de configuração, ela terá que desenvolver novamente a mesma lógica no seu código fonte.

Não seria legal por exemplo, ter essa lógica de como gerar o arquivo de configuração em algum "template", de forma a que nosso script simplesmente carrega o arquivo yaml, chama esse "template" e o nosso arquivo de configuração é gerado automaticamente?

Para isso utilizamos JINJA2!!, com JINJA2, podemos criar um template e simplesmente colocar como dados de entrada para dito template, os dados do nosso arquivo YAML, e pronto arquivo de configuração gerado.


Próximo post falaremos sobre a sintaxes de JINJA2... Obrigado e Bom Final de Semana...

Abçs
Jose






Nenhum comentário:

LinkWithin

Related Posts with Thumbnails