Ansible – Loop de Variáveis usando Jinja2 – Parte 3

Olá Pessoal,

   Baseado em nossos posts anteriores explicando sobre implementação de arquivos de configuração utilizando loops e dados capturados via uma base externa, hoje venho aqui para que possamos finalizar nosso conteúdo trazendo de fato nosso loop com as variavéis sendo inseridas em nosso arquivo de ” vars “.

   Como vocês observaram nos posts anteriores nosso arquivo incluido no “ group_vars/all.yml ” será alterado para que possamos agora inserir mais duas variáveis que iremos trabalhar para gerar nosso loop. Esses exemplos de fato são para que eu possa demonstrar, mas podemos pensar em varias situações onde seria interessante trabalhar criando essas interfaces ou definindo posteriormente VLANs. Segue o arquivo completo:

---
vars_from_csv: "{{ vars_dict }}"

cisco_881_l2_interfaces:
  - FastEthernet0
  - FastEthernet1
  - FastEthernet2
  - FastEthernet3

loopback_id:
  - 5
  - 6
  - 7
  - 10
  - 11

   Com isso populado em nosso arquivo, agora teremos que alterar nosso template ( jinja2 ) para inserir nosso loop com o intuito de varrer essas variáveis e criar nosso template de configuração. Nossa alteração será executada no “ template/script.j2 “.

!
hostname {{ vars_from_csv.new_hostname }}
!
{% if vars_from_csv.DHCP == 'true' %}
no ip dhcp conflict logging
ip dhcp excluded-address {{vars_from_csv.dhcp_exclude1_start}} {{vars_from_csv.dhcp_exclude1_end}}
!
ip dhcp pool POOL1
   network {{vars_from_csv.dhcp_network}} {{vars_from_csv.dhcp_netmask}}
   default-router {{vars_from_csv.dhcp_gateway}}
   dns-server 8.8.8.8 8.8.4.4
{% endif %}
!
interface loopback {{ vars_from_csv.id_loopback }}
 description + Management +
 ip address {{ vars_from_csv.ip_loopback }} {{ vars_from_csv.mask_loopback }}
 no shutdown
!
{% for interface in cisco_881_l2_interfaces %}
interface {{interface}}
 switchport access vlan 10
 spanning-tree portfast
!
{% endfor %}
{% for loopback in loopback_id %}
interface loopback {{loopback}}
  ip address {{ vars_from_csv.ip_loopback }} {{ vars_from_csv.mask_loopback }}
  no shutdown
!
{% endfor %}
!

   Como vocês podem observar estou trabalhando com a função “ for ” que é o argumento para gerarmos o loop até que exista essa variável populada em nosso arquivo, ou seja, essa função somente sairá do loop ” endfor ” se todos os ítens forem verificados, como consequência ele irá seguir para o próximo loop para executar a função das loopbacks, tendo como lógica a mesma explicada acima. 

   Após essas alterações podemos executar nossa playbook para que possamos avaliar se irá executar da forma que planejamos. Gostaria de lembrar que estamos criando esse template via uma base externa ( csv ) e também geramos ítens adicionais que de fato podem ser exemplificados como melhorias de algum template que precise criar que de alguma forma ele não foi demonstrado ou manipulado pelo arquivo csv.

   Segue aqui a menção que obtivemos com alteração ( change ) em todos os elementos do inventário.

   Para consolidarmos nossas alterações vamos observar nossos arquivos, não esquecendo que ainda continuamos fazendo as alterações ( true e false ) da configuração do DHCP normalmente, bem como trabalhando com os valores deles mesmo dentro de nosso loop, ou seja, depois de estruturado nossos dados podemos utiliza-lo diferentes formas.

Template Router 1 Template Router 2
!
hostname R1_floor1
!
no ip dhcp conflict logging
ip dhcp excluded-address 1.1.1.9 1.1.1.10
!
ip dhcp pool POOL1
network 1.1.1.8 255.255.255.248
default-router 1.1.1.1
dns-server 8.8.8.8 8.8.4.4
!
interface loopback 10
description + Management +
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface FastEthernet0
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet1
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet2
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet3
switchport access vlan 10
spanning-tree portfast
!
interface loopback 5
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 6
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 7
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 10
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 11
ip address 10.10.10.1 255.255.255.255
no shutdown
!
!
!
hostname R2_floor1
!
!
interface loopback 10
description + Management +
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface FastEthernet0
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet1
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet2
switchport access vlan 10
spanning-tree portfast
!
interface FastEthernet3
switchport access vlan 10
spanning-tree portfast
!
interface loopback 5
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 6
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 7
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 10
ip address 10.10.10.1 255.255.255.255
no shutdown
!
interface loopback 11
ip address 10.10.10.1 255.255.255.255
no shutdown
!
!

   Vocês podem observar que todas as loopbacks estão com o mesmo endereço IP, porém estou apenas demonstrando as possibilidades de trabalhar com esses valores e se for utilizar em seu ambiente de produção você terá que adequar suas variáveis/valores.

   Pessoal espero que vocês tenham gostado dessa série, porque eu gostei muito de trabalhar com essas possibilidades e ao mesmo tempo empolgado pois podemos observar o potencial que temos em nossas mãos para começar a trabalhar com automações e dinamismo em nossas estruturas. 

   Se você acha que podemos evoluir nesse projeto acompanhe no meu GitHub e dê suas sugestões e se também acredita que gostaria de trazer mais exemplos aqui deixe seu comentário. 

Abs,
Rodrigo

0
0

Link permanente para este artigo: https://ciscoredes.com.br/2018/04/02/ansible-loop-de-variaveis-usando-jinja2-parte-3/

Deixe um comentário

Seu e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Translate