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