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
Comentários Recentes