Ansible – Script Configuração usando Jinja2 – Parte 2

Olá Pessoal,

   Vamos continuar nossas explicações sobre as configurações ( scripts ) que podemos fazer através de uma base externa ( csv ) que iniciamos em nosso post anterior

   Muitas pessoas mencionaram que de fato isso poderia ser feito através de um arquivo ( yaml ) ou propriamente sendo populado através de outra metodologia via ( group_vars ). Concordo, mas lembre-se, que eu havia mencionado que baseado em nossa estrutura de pastas vocês vão entender até nosso ultimo post as opções que teremos para trabalhar dessa forma.

   Como proposto vou trazer nossa variável ” vars_dict ” para nossa pasta ( group_vars/all.yml ) adicionando ela dentro de outra variável ( vars_from_csv ), para que de fato possamos utiliza-lá fazendo referências dentro de nosso script de configuração. 

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

   Como demostrado nesse momento já temos todos os nossos valores ( variáveis ) populadas, portanto, precisamos executar agora nosso template que irá capturar essas variáveis para inserir em nosso arquivo de configuração. 

   Dentro desse conceito “ DEVOPS “, bem como para utilização com Ansible, umas das linguagens mais utilizadas para essas demandas é chamada de JINJA2. Se vocês observarem a documentação ela também é utilizada como template para Python, portanto, desta forma você pode entender o porque da utilização nesse mundo de automação.

   Sua documentação é bem extensa, mas gostaria de deixar documentado em nosso BLOG os principais ítens, que nesse primeiro momento seria para criar nosso arquivo de configuração. Eles estão relacionados aos loops e variáveis que temos que criar para utilizar em nossos equipamentos.

  • {% … %} for Statements
  • {{ … }} for Expressions to print to the template output
  • {# … #} for Comments not included in the template output
  • # … ## for Line Statements

   Para execução de nosso template iremos adicionar em nossa playbook inicial uma ” role ” relacionado as tarefas que iremos executar para obter o jinja ( .j2 ).

---
- name: JINJA AND CSVFILE
  hosts: all
  gather_facts: no
  connection: local

  tasks:
  - name: OBTAIN LOGIN CREDENTIALS
    include_vars: secret.yaml

  - name: LOOKUP IN CSV FILE
    include_role:
      name: lookup_csv_info
    when: ./excel/test.csv is defined

  - name: EXECUTE JINJA2
    include_role:
      name: script_jinja2

   Após esse processo vamos construir nossa task via ” template “, onde nosso arquivo de origem será ( .j2 ) transformando ele um arquivo destino ( .conf ) que será posteriormente arquivo para executar em nossos equipamentos da infra-estrutura. Segue task do template:

---
- name: TEMPLATE
  template:
    src: ./template/script.j2
    dest: ./template/configuration/script_{{ inventory_hostname }}.conf
  with_items: "{{ inventory_hostname }}"

   Como observado precisamos agora ter nosso ” script.j2 ” construido, onde será ele o criador da configuração utilizando nossas variáveis capturadas anteriormente. 

!
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
!

   De fato o que podemos entender com essa metodologia é que podemos fazer ” loops ” e a utilização de condicionais “ if ” para que se tivermos um valor ( ” true/false ” ou ” 1/0 “ ) eu posso tomar algumas decisões nessa configuração. Observem que estou colocando como exemplo a variável “ DHCP ” sendo verdadeira ( ” true ” ), que por consequência eu preciso implementar o DHCP, caso contrário eu não desejo implementar esse recurso em meus roteadores.

   Com isso conseguimos observar que as alterações foram executadas utilizando nosso script.

   Para garantirmos que foi executado correto vamos observar nossos arquivos de configuração, criados para cada roteador.

Configuração do Roteador 1 Configuração do Roteador 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
!
!
hostname R2_floor1
!
!
interface loopback 10
description + Management +
ip address 10.10.10.1 255.255.255.255
no shutdown
!

   Vale lembrar, que não estou fazendo o acesso aos equipamento para descarregar as informações ( scripts ), pois não tenho todo esse inventário emulado nesse momento para inserir todos os roteadores. Caso tenha necessidade pode observar em nossos posts anteriores, mas a forma para implementar nos equipamentos seria adicionar essa task em nossa playbook ( ./script_jinja2/tasks/main.yaml ).

- name: Execute Script
  ios_config:
    provider: "{{ creds }}"
    src: ./template/configuration/script_{{ inventory_hostname }}.conf
  with_items: "{{ inventory_hostname }}"

   Talvez vocês devem estar se perguntando onde está o ” loop ” da configuração. Exato, ele vai ser adicionado em nosso próximo post.  💡 

   Espero que vocês tenha gostado e deixem seus comentários.

Abs,
Rodrigo

 

0
0

Link permanente para este artigo: https://ciscoredes.com.br/2018/03/13/ansible-script-configuracao-usando-jinja2-parte-2/

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