Ansible – Validação de Configuração – Parte 2

Olá Pessoal,

   Conforme em nosso post anterior, hoje iremos tratar de um outro parâmetro, com o intuito de fazer validação das configurações em nossos equipamentos Cisco. 

   Baseando-se em nossas menções a configuração que iremos “confrontar” será a diferença que temos na “running-config” com nosso arquivo base ( intended ), ou seja, nesse post iremos agora mostrar o que temos de comandos adicionais na configuração que não esta presente em nosso arquivo padrão.

   Vale lembrar que essa comparação será linha à linha, ou seja, para que isso faça mais sentido o ideal que você já tenha um template padrão de sua infra-estrutura aplicado para seus equipamentos, bem como, já tenha um histórico de armazenamento de configurações para começar a “confrontar” as configuração. É claro, que se você não tem, o importante é iniciar seu processo para backup de configuração ou criar políticas para que esse processo entre em produção, assim posteriomente, você pode revalidar suas configurações com o desejo de encontrar algo que foi alterado e que não deveria.  😉 

   Enfim, vamos ao nosso playbook onde iremos criar a validação. Devido ao teste eu acabei criando um processo anterior nesse script, baseando-se em configurações já apresentadas em posts anteriores sobre criação do “running-config“, devido a isso, eu apenas importei esse script para nosso playbook com a intenção de conseguir criar o arquivo inicial, e após isso, criar duas situações para comparar o antes e depois da mudança em nossa configuração do roteadore CSR1000V.

   Segue abaixo nossa playbook

---
- hosts: all
  connection: local
  gather_facts: no

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

  - name: Fill vars
    set_fact:
      provider:
        host: "{{ ansible_host }}"
        username: "{{ creds['username'] }}"
        password: "{{ creds['password'] }}"
        auth_pass: "{{ creds['auth_pass'] }}"

  - name: Capture running-config
    ios_command:
     provider: "{{ provider }}"
     commands:
        - show running-config
    register: running
    
  - name: Check that file exist
    stat:
      path: /home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt
    register: result_file

  - name: Save output running-config
    copy:
      content: "{{ running.stdout[0] }}"
      dest: "/home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt"
    when: result_file.stat.exists == False

  - name: Compare running-config with intended file
    ios_config:
      diff_against: intended
      provider: "{{ provider }}"
      intended_config: "{{ lookup('file', '/home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt') }}"
    register: test_diff

  - name: Take running-config and sets it to a variable called *before*
    set_fact: before="{{ test_diff['diff']['before'].split('\n')}}"
    when: test_diff['diff'] is defined

  - name: This takes the intended_config and sets it to a variable called *after*
    set_fact: after="{{ test_diff['diff']['after'].split('\n')}}"
    when: test_diff['diff'] is defined

  - name: Create a line-to-line diff of running-config to intended_config
    set_fact: difference="{{ after | difference(before) }}"
    when: test_diff['diff'] is defined

  - name: sanitized output "Lines added to running-config that are not present in intended_config"
    debug:
      var: difference
    when: test_diff['diff'] is defined

   No primeiro momento vocês podem observar que minha pasta não contém o arquivo, pois é a primeira vez que irei executar minha playbook. Após executar, vocês podem observar que tenho a mensagem de “ change ” em nosso “ log ” e consequentemente vamos observar que foi populado um novo arquivo em nosso servidor local ( ansible server ). 

   Após criação de nosso arquivo, nesse momento é efetuado alteração em meu roteador ( running-config ) criando um usuário adicional, para que assim possamos validar as diferenças de configurações que existem entre nossas bases. Segue abaixo:

   Com isso vocês agora podem observar que foi criado uma lógica de validação em relação ao meu arquivo de configuração ( running-config ), para que após a execução pela primeira vez da running-config ele não fique sobrescrevendo meu arquivo, para que desta forma, ela seja, minha configuração base ( intended ) que vou comparar posteriormente com o running-config. Abaixo você pode observar que existe uma ação ( skipping ) que é o momento de validação do arquivo existente, sendo que minha váriavel agora é ” True ” devido a isso minha tarefa em nossa playbook, não sera de fato executada ( gravar um novo arquivo ).

   Podemos também observar outras ações que estão ocorrendo que é justamente as menções de diferenças entre os arquivos, que é demonstrador através do ” before ” e “ after “. Para que vocês possam entender o que representa output em azul trazendo numeros é simbolo é recomendado que visualize esse link.


   Após todo essa validação o ideal que você faça as comparações do antes e depois de forma mais prática para seu output, pois, você pode obter linhas que de fato são adicionais em seu output, mas que de fato não foram alteradas. Devido a isso, foi necessário criar uma revalidação e ” sanitizar ” output utilizando as variáveis “ before ” e ” after ” para que possamos no final visualizar somente a linha que eu adicionei no running-config. Com esse output podemos concluir que de fato agora tenho uma alteração em meu equipamento que não deveria estar contido nele.

   Espero que esse playbook possa dar um dinamismo maior para sua infra, na qual você precisa validar se algo foi alterado ( change ) em seu equipamento e que de fato posso ter impactado algum incidente reportado posteriomente sua change. Vale lembra que aqui estamos fazendo os testes em apenas 1 equipamento para qual a ideia é que isso possa ser escalonado dentro de seu ambiente.  😀 

Abs,
Rodrigo

0
0

Link permanente para este artigo: https://ciscoredes.com.br/2017/10/26/ansible-validacao-de-configuracao-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