<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DevOps on Cisco Redes</title>
        <link>https://ciscoredes.com.br/tags/devops/</link>
        <description>Recent content in DevOps on Cisco Redes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>pt-br</language>
        <lastBuildDate>Wed, 04 Jul 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://ciscoredes.com.br/tags/devops/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Ansible – Gerenciando erros na playbook</title>
            <link>https://ciscoredes.com.br/2018/07/04/ansible-gerenciando-erros-na-playbook/</link>
            <pubDate>Wed, 04 Jul 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/07/04/ansible-gerenciando-erros-na-playbook/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Error_Adding_more_tasks.jpg&#34; alt=&#34;Featured image of post Ansible – Gerenciando erros na playbook&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Hoje venho aqui para trazer mais um ítem para que possamos agregar em nossas implementações de Ansible, e como vocês vêem observando nós temos algumas alternativas para identificar quando houve um erro com o device, ou de alguma forma que executamos algum erro no módulo que estamos escrevendo por falta de um parâmetro, erro na digitação, caminho da pasta apresentada erronêamente, etc.&lt;/p&gt;&#xA;&lt;p&gt;   Pois bem, nós temos algumas formas de contornar esses alarmes, ou demostrar quais equipamentos estão sendo ignorados, para que possamos continuar com a execução do restante de nossa playbook. Para que possamos iniciar, gostaria primeiramente de apresentar a primeira opção que com certeza vai acontecer, é o fato de termos algum problema no preenchimento da planilha ( &lt;strong&gt;.csv&lt;/strong&gt; ), que por sua vez está atrelado a falta de algum valor em alguma coluna desse arquivo. &lt;/p&gt;&#xA;&lt;p&gt;   Desta forma, para testarmos eu acabei excluindo apenas um valor relacionado à coluna do router &lt;strong&gt;R1&lt;/strong&gt; e &lt;strong&gt;R4&lt;/strong&gt;, com isso podemos apresentar as metodologias para fazer essa tratativa de erros através de termos que são agregados a sua playbook. A forma que podemos trabalhar é de fato trazendo a função ” &lt;strong&gt;ignore_errors&lt;/strong&gt; “, “ &lt;strong&gt;fail&lt;/strong&gt; ” e ” &lt;strong&gt;any_errors_fatal&lt;/strong&gt; “. Se desejar, recomendo também consultar a documentação do Ansible sobre ” &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/2.3/playbooks_error_handling.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Error handling&lt;/a&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Abaixo vocês vão observar alteração que fiz no arquivo que popula todas as minhas variáveis do ( &lt;strong&gt;.csv&lt;/strong&gt; ) e abaixo a menção sobre o “ &lt;strong&gt;ignore_errors&lt;/strong&gt; ” classificado como “ &lt;strong&gt;yes&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: GET VARIABLES FROM CSVFILE&#xA;  set_fact:&#xA;    vars_dict:&#xA;        DHCP: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=1 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_start: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=2 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_end: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=3 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_network: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=4 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_netmask: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=5 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_gateway: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=6 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        new_hostname: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=7 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        id_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=8 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=9 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=10 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback_x: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=11 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback_x: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=12 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback_y: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=13 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback_y: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=14 delimiter=,&amp;#39;) }}&amp;#34;&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;  ignore_errors: yes&#xA;  tags:&#xA;    - always&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após a inserção desse recurso o que iremos fazer é executar nossa playbook e observar o comportamento na execução do código. Como esperado verifico que o status para os dois roteadores está mostrando como ” &lt;strong&gt;ignoring&lt;/strong&gt; “, ou seja, ele acaba excluindo meu erro e continua execução dos meu outros roteadores, ou melhor dizendo, dos meus hosts já populados em nosso arquivo.\&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Error_Task.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Se obervamos, vamos analisar os erros posteriores da minha playbook, porque é devido as variavéis que deveriam ter sido capturadas anteriormente, porém sem o recurso de ” &lt;strong&gt;ignore_errors&lt;/strong&gt; ” não vemos a mensagem de “ &lt;strong&gt;ignoring&lt;/strong&gt; “, que por consequência vamos observar na finalização que temos nosso contador demostrando como “ &lt;strong&gt;failed=1&lt;/strong&gt; ” capturados nessa task ( &lt;strong&gt;TEMPLATE 881&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Error_Plus_Failed.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Então, para que também seja executado nessa task é necessario adicionar ” &lt;strong&gt;ignore_errors&lt;/strong&gt; ” e agora vamos observar novamente a mensagem e automaticamente temos nosso contador “ &lt;strong&gt;failed&lt;/strong&gt; ” zerado.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Error_Adding_more_tasks.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Caso você tenha necessidade pode-se usar o recurso de ” &lt;strong&gt;any_errors_fatal&lt;/strong&gt; ” como sendo ” &lt;strong&gt;True&lt;/strong&gt; “, que por sua vez, vai demonstrar o erro e popular em nosso contador.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Fatal_errors_task.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Talvez vocês estejam pensando em que momento poderia utilizar esses métodos, ou seja, um ítem para pensarmos rápido seria em situações que nossos equipamentos populados no inventário estejam ” &lt;strong&gt;unreachable&lt;/strong&gt; ” que por sua vez vai parar toda execução de sua playbook.&lt;/p&gt;&#xA;&lt;p&gt;   Outro ponto interessante, para que possamos armazenar os logs das execuções de nossa playbook, seria habilitar dentro do arquivo ” &lt;strong&gt;ansible.cfg&lt;/strong&gt; ” um caminho para nossos logs, pois em algumas circunstâncias não vamos estar sempre presentes para analisar naquele momento o erro que ocorreu, ou seja, você vai observar os futuros problemas através desse arquivo.&lt;/p&gt;&#xA;&lt;p&gt;   Para isso devemos editar nosso arquivo e adicionar o caminho através do “ &lt;strong&gt;log_path&lt;/strong&gt; ” conforme pode observar abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Log_Errors.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após isso podemos consultar nosso arquivo populado em nosso diretorio e todas as informações salvas baseado em um timestamp.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Log_Errors_text.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;  &lt;em&gt;&lt;strong&gt;Obs.:&lt;/strong&gt;&lt;/em&gt; Nesse parâmetro precisamos ficar esperto com o tamanho desse arquivo se for uma task muito longa e com muitos hosts, bem como para ter um significado maior teríamos que popular “ &lt;strong&gt;verbose&lt;/strong&gt; ” no comando &lt;strong&gt;ad-hoc&lt;/strong&gt; do Ansible.&lt;/p&gt;&#xA;&lt;p&gt;   Bom pessoal, espero que tenham gostado dessas dicas e espero alguns comentários e idéias para compartilharmos.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Script baseado na família do equipamento – parte 5</title>
            <link>https://ciscoredes.com.br/2018/07/02/ansible-script-baseado-na-familia-do-equipamento-parte-5/</link>
            <pubDate>Mon, 02 Jul 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/07/02/ansible-script-baseado-na-familia-do-equipamento-parte-5/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Tag_Execution.jpg&#34; alt=&#34;Featured image of post Ansible – Script baseado na família do equipamento – parte 5&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Já faz um tempo que não adiciono nada em relação a este tema, então vamos trazer mais opções para que vocês possam observar essas idéias e possam adaptar ou criar dentro de seus ambientes que trabalham no dia a dia.&lt;/p&gt;&#xA;&lt;p&gt;   Neste detalhamento vou atrelar aos códigos que já estavamos desenvolvendo nos &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2018/04/26/ansible-loop-com-validacao-de-variaveis-parte-4/&#34; &gt;posts anteriores&lt;/a&gt; que trazia o conceito de trabalhar com ( &lt;strong&gt;.csv&lt;/strong&gt; ) e scripts &lt;strong&gt;Jinja2&lt;/strong&gt;, bem como respondendo o que eu havia perguntando no post anterior de nossa série.&lt;/p&gt;&#xA;&lt;p&gt;   Pois bem, nesse primeiro momento vamos fazer a nossa tratativa para selecionar o equipamento através de uma funcionalidade básica, que por sua vez vai depender de alguns parâmetros ” &lt;em&gt;&lt;strong&gt;ad-hoc&lt;/strong&gt;&lt;/em&gt; ” no momento de execução de nossa playbook. Eu quis dizer básico, pois vamos adicionar ” &lt;strong&gt;tags&lt;/strong&gt; ” que de alguma forma será identificada manualmente pela inserção do desenvolvedor do código.&lt;/p&gt;&#xA;&lt;p&gt;   Dentro do ambiente Ansible essas ” &lt;strong&gt;tags&lt;/strong&gt; ” são tratadas inerente ao comando ou ação que você esta executando em sua “ &lt;strong&gt;task&lt;/strong&gt; “, ou seja, essas marcações vão ser interpretadas a partir do momento que ela é definida na execução de sua ” &lt;em&gt;&lt;strong&gt;playbook&lt;/strong&gt;&lt;/em&gt; “. Portanto, se a ” &lt;strong&gt;tag&lt;/strong&gt; ” estiver identificada aquela task será executada e obviamente se você estiver incluindo “ &lt;em&gt;sub tasks&lt;/em&gt; “, “ &lt;em&gt;roles&lt;/em&gt; ” as mesmas ações de suas “ &lt;strong&gt;tags&lt;/strong&gt; ” precisam ser identificadas no ambiente. Essa é uma maneira mais rápida e prática identificar as ações que devem ser executadas em sua playbook, porém dependendo de sua demanda outros caminhos e soluções precisam ser analisadas. Para maiores detalhes recomendo observar documentação &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tags em Ansible&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Na versão &lt;strong&gt;2.4&lt;/strong&gt; e &lt;strong&gt;2.5&lt;/strong&gt; já temos algumas nomenclaturas adicionadas para que você consiga anexar em sua lógica de execução, e assim facilitar em algumas metodologias. Nesses parâmetros podemos definir ” &lt;strong&gt;always&lt;/strong&gt; “, ” &lt;strong&gt;tagged&lt;/strong&gt; “, “ &lt;strong&gt;untagged&lt;/strong&gt; ” e ” &lt;strong&gt;never&lt;/strong&gt; “. Outro ponto que podemos declarar em algumas situações é através do ” &lt;strong&gt;–skip-tags&lt;/strong&gt; “, na qual eu reforço aqui, que devemos usar através de comandos ” &lt;em&gt;ad-hoc&lt;/em&gt; “, como já explicado &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/08/21/ansible-rodar-um-grupo-de-seu-inventario/&#34; &gt;nesse post sobre esse recurso&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Com isso mapeado, nesse caso vou trazer um exemplo para que possamos gerar scripts distintos para uma plataforma &lt;strong&gt;Cisco 881&lt;/strong&gt; e outra plataforma &lt;strong&gt;Cisco 1941&lt;/strong&gt;. Venho ressaltar que no script do 1941 estou apenas anexando o nome do router para validação e declarando para identificar que de fato rodamos o template correto via automação. &lt;strong&gt;PS.:&lt;/strong&gt; Esse script não tem muito sentido olhando na visão de router, mas vou testar a lógica.&lt;/p&gt;&#xA;&lt;p&gt;   Primeiramente analisando meu código eu tenho tasks que precisam ser executadas independentemente da plataforma, ou seja, estou utilizando a tag ” &lt;strong&gt;always&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: JINJA AND CSVFILE&#xA;  hosts: all&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;    tags:&#xA;      - always&#xA;&#xA;  - name: LOOKUP IN CSV FILE&#xA;    include_role:&#xA;      name: lookup_csv_info&#xA;    when: ./excel/test.csv is defined&#xA;    tags:&#xA;      - always&#xA;&#xA;  - name: EXECUTE JINJA2&#xA;    include_role:&#xA;      name: script_jinja2&#xA;    tags:&#xA;      - always&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como mencionando preciso adicionar nas minhas “ &lt;em&gt;roles&lt;/em&gt; ” que também precisam identicar em que situação iremos rodas essas tarefas. Neste meu caso popular as varíaveis são essenciais, portanto vamos também adicionar a tag ” &lt;strong&gt;always&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: GET VARIABLES FROM CSVFILE&#xA;  set_fact:&#xA;    vars_dict:&#xA;        DHCP: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=1 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_start: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=2 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_end: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=3 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_network: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=4 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_netmask: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=5 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_gateway: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=6 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        new_hostname: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=7 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        id_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=8 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=9 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=10 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback_x: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=11 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback_x: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=12 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback_y: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=13 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback_y: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=14 delimiter=,&amp;#39;) }}&amp;#34;&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;  tags:&#xA;    - always&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Enfim, chegamos no ponto onde vou definir minhas variaveis distintas e obviamente meu template ” &lt;em&gt;script&lt;/em&gt; ” distinto. Nesse caso eu criei um arquivo adicional chamado de ” &lt;strong&gt;script_1941.j2&lt;/strong&gt; ” para emular minha plataforma e avaliar se estou populando corretamente via “ &lt;strong&gt;tags&lt;/strong&gt; “. Após esse detalhamento adicionei mais uma tarefa para separar essas demandas.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: TEMPLATE 881&#xA;  template:&#xA;    src: ./template/script.j2&#xA;    dest: ./template/configuration/script_{{ inventory_hostname }}.conf&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;  tags:&#xA;    - router881&#xA;&#xA;- name: TEMPLATE 1941&#xA;  template:&#xA;    src: ./template/script_1941.j2&#xA;    dest: ./template/configuration/script_{{ inventory_hostname }}.conf&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;  tags:&#xA;    - router1941&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Agora podemos executar e analisar quais templates estão sendo gerados utilizando via comando ” &lt;em&gt;ad-hoc&lt;/em&gt; “. Para isso vamos seguir desta forma chamando como  &lt;strong&gt;–tags “router1941”&lt;/strong&gt; .&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Tag_Execution.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Agora vamos observar a criação dos templates com suas caracteristicas dessa seleção de “ &lt;em&gt;tag&lt;/em&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Executation_tag_completed.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;br&gt;&#xA;   Quando usado por exemplo um &lt;strong&gt;–skip-tags “router1941”&lt;/strong&gt; você pode observar que rodamos outra “ &lt;em&gt;tag&lt;/em&gt; “, portanto excluindo toda tarefa relacionada a essa demanda. Se pensarmos, podemos também utilizar a tag ” &lt;strong&gt;router881&lt;/strong&gt; ” que terá a mesma execução.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/06/Ansible_Tag_Skip_tag.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Enfim, mais uma vez podemos verificar a diversidade que podemos atender baseando em sua demanda. Em nosso próximo post essa escolha será automatica na qual irei validar no router real que plataforma estamos trabalhando e após isso farei a entrega do template correto ao equipamento. Reforçando que esse códigos estão todos disponivéis no meu Github.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e falta apenas provar para vocês a questão levantada no post anterior sobre as validações de erros.  😉 &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Script Configuração usando Jinja2 – Parte 2</title>
            <link>https://ciscoredes.com.br/2018/03/13/ansible-script-configuracao-usando-jinja2-parte-2/</link>
            <pubDate>Tue, 13 Mar 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/03/13/ansible-script-configuracao-usando-jinja2-parte-2/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_script_jinja2_executed.jpg&#34; alt=&#34;Featured image of post Ansible – Script Configuração usando Jinja2 – Parte 2&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Vamos continuar nossas explicações sobre as configurações ( &lt;strong&gt;scripts&lt;/strong&gt; ) que podemos fazer através de uma base externa ( &lt;strong&gt;csv&lt;/strong&gt; ) que iniciamos em nosso post &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2018/03/08/ansible-configuracao-via-csv-file-loops/&#34; &gt;anterior&lt;/a&gt;. &lt;/p&gt;&#xA;&lt;p&gt;   Muitas pessoas mencionaram que de fato isso poderia ser feito através de um arquivo ( &lt;strong&gt;yaml&lt;/strong&gt; ) ou propriamente sendo populado através de outra metodologia via ( &lt;strong&gt;group_vars&lt;/strong&gt; ). 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.&lt;/p&gt;&#xA;&lt;p&gt;   Como proposto vou trazer nossa variável ” &lt;strong&gt;vars_dict&lt;/strong&gt; ” para nossa pasta ( &lt;strong&gt;group_vars/all.yml&lt;/strong&gt; ) adicionando ela dentro de outra variável ( &lt;strong&gt;vars_from_csv&lt;/strong&gt; ), para que de fato possamos utiliza-lá fazendo referências dentro de nosso script de configuração. &lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;vars_from_csv: &amp;#34;{{ vars_dict }}&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como demostrado nesse momento já temos todos os nossos valores ( &lt;strong&gt;variáveis&lt;/strong&gt; ) populadas, portanto, precisamos executar agora nosso template que irá capturar essas variáveis para inserir em nosso arquivo de configuração. &lt;/p&gt;&#xA;&lt;p&gt;   Dentro desse conceito “ &lt;strong&gt;DEVOPS&lt;/strong&gt; “, bem como para utilização com Ansible, umas das linguagens mais utilizadas para essas demandas é chamada de &lt;a class=&#34;link&#34; href=&#34;http://jinja.pocoo.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JINJA2&lt;/a&gt;. 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.&lt;/p&gt;&#xA;&lt;p&gt;   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.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;ul&gt;&#xA;&lt;li&gt;{% … %} for Statements&lt;/li&gt;&#xA;&lt;li&gt;{{ … }} for Expressions to print to the template output&lt;/li&gt;&#xA;&lt;li&gt;{# … #} for Comments not included in the template output&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;h1 id=&#34;--for-line-statements&#34;&gt;… ## for Line Statements&#xA;&lt;/h1&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Para execução de nosso template iremos adicionar em nossa playbook inicial uma ” &lt;em&gt;role&lt;/em&gt; ” relacionado as tarefas que iremos executar para obter o jinja ( &lt;strong&gt;.j2&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: JINJA AND CSVFILE&#xA;  hosts: all&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: LOOKUP IN CSV FILE&#xA;    include_role:&#xA;      name: lookup_csv_info&#xA;    when: ./excel/test.csv is defined&#xA;&#xA;  - name: EXECUTE JINJA2&#xA;    include_role:&#xA;      name: script_jinja2&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após esse processo vamos construir nossa task via ” &lt;em&gt;template&lt;/em&gt; “, onde nosso arquivo de origem será ( &lt;strong&gt;.j2&lt;/strong&gt; ) transformando ele um arquivo destino ( &lt;strong&gt;.conf&lt;/strong&gt; ) que será posteriormente arquivo para executar em nossos equipamentos da infra-estrutura. Segue task do template:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: TEMPLATE&#xA;  template:&#xA;    src: ./template/script.j2&#xA;    dest: ./template/configuration/script_{{ inventory_hostname }}.conf&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como observado precisamos agora ter nosso ” &lt;em&gt;script.j2&lt;/em&gt; ” construido, onde será ele o criador da configuração utilizando nossas variáveis capturadas anteriormente. &lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!&#xA;hostname {{ vars_from_csv.new_hostname }}&#xA;!&#xA;{% if vars_from_csv.DHCP == &amp;#39;true&amp;#39; %}&#xA;no ip dhcp conflict logging&#xA;ip dhcp excluded-address {{vars_from_csv.dhcp_exclude1_start}} {{vars_from_csv.dhcp_exclude1_end}}&#xA;!&#xA;ip dhcp pool POOL1&#xA;   network {{vars_from_csv.dhcp_network}} {{vars_from_csv.dhcp_netmask}}&#xA;   default-router {{vars_from_csv.dhcp_gateway}}&#xA;   dns-server 8.8.8.8 8.8.4.4&#xA;{% endif %}&#xA;!&#xA;interface loopback {{ vars_from_csv.id_loopback }}&#xA; description + Management +&#xA; ip address {{ vars_from_csv.ip_loopback }} {{ vars_from_csv.mask_loopback }}&#xA; no shutdown&#xA;!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   De fato o que podemos entender com essa metodologia é que podemos fazer ” &lt;strong&gt;loops&lt;/strong&gt; ” e a utilização de condicionais “ &lt;strong&gt;if&lt;/strong&gt; ” para que se tivermos um valor ( &lt;em&gt;” true/false ” ou ” 1/0 “&lt;/em&gt; ) eu posso tomar algumas decisões nessa configuração. Observem que estou colocando como exemplo a variável “ &lt;strong&gt;DHCP&lt;/strong&gt; ” sendo verdadeira ( ” &lt;em&gt;true&lt;/em&gt; ” ), que por consequência eu preciso implementar o DHCP, caso contrário eu não desejo implementar esse recurso em meus roteadores.&lt;/p&gt;&#xA;&lt;p&gt;   Com isso conseguimos observar que as alterações foram executadas utilizando nosso script.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_script_jinja2_executed.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para garantirmos que foi executado correto vamos observar nossos arquivos de configuração, criados para cada roteador.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_folders_arq_conf_routers.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Configuração do Roteador 1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Configuração do Roteador 2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;!  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  !&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;!  hostname R2_floor1  !  !  interface loopback 10  description + Management +  ip address 10.10.10.1 255.255.255.255  no shutdown  !&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;   Vale lembrar, que não estou fazendo o acesso aos equipamento para descarregar as informações ( &lt;strong&gt;scripts&lt;/strong&gt; ), 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 ( &lt;strong&gt;./script_jinja2/tasks/main.yaml&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- name: Execute Script&#xA;  ios_config:&#xA;    provider: &amp;#34;{{ creds }}&amp;#34;&#xA;    src: ./template/configuration/script_{{ inventory_hostname }}.conf&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Talvez vocês devem estar se perguntando onde está o ” &lt;strong&gt;loop&lt;/strong&gt; ” da configuração. Exato, ele vai ser adicionado em nosso próximo post.  💡&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenha gostado e deixem seus comentários.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Configuração via CSV File – Parte 1</title>
            <link>https://ciscoredes.com.br/2018/03/08/ansible-configuracao-via-csv-file-loops/</link>
            <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/03/08/ansible-configuracao-via-csv-file-loops/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_tree_project_csv_file.jpg&#34; alt=&#34;Featured image of post Ansible – Configuração via CSV File – Parte 1&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Dando sequência as nossas publicações sobre Ansible, e como já comentei com vocês que estou pegando alguns exemplos que de fato são situações que nós Engenheiros de Rede acaba vivenciado para executar esse tipo de trabalho em nosso dia a dia, ou seja, venho com a pergunta. Vocês já receberam aquele Excel &lt;strong&gt;( .csv ),&lt;/strong&gt; para de fato fazer algumas alterações em seus equipamentos?&lt;/p&gt;&#xA;&lt;p&gt;   Se sim, acredito que você está no caminho correto, pois hoje, venho com mais um exemplo que vamos fazer as preparações para tratar nossos dados e posteriormente criar nossos arquivos de configuração que serão aplicados em nossos equipamentos &lt;strong&gt;Cisco ( IOS )&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Vale lembrar, para que seja efetivo nossa Automação precisamos ter um inventário consolidado, onde as informações relacionadas ao nossos equipamentos devem ser coerentes para futuro crescimento de nossa infra-estrutura. Se você ainda não acompanhou os posts anteriores, recomenda-se ler esses &lt;a class=&#34;link&#34; href=&#34;https://www.ciscoredes.com.br/category/ansible&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tópicos sobre Ansible.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;   Como vocês podem observar vamos tratar nossos dados via um arquivo &lt;strong&gt;( .csv )&lt;/strong&gt;, que de alguma forma são valores/informações populadas através de outras fontes ( ferramentas, pessoas, etc ). Em nosso exemplo, estou colocando diversas informações que a principio vocês possam não entender, mas no decorrer de nossos posts isso fará sentido para o entendimento correto e as opções que podemos criar em nossa automação.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;inventory_hostname,DHCP,dhcp_exclude1_start,dhcp_exclude1_end,dhcp_network,dhcp_netmask,dhcp_gateway,new_hostname,id_loopback,ip_loopback,mask_loopback&#xA;R1,true,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R1_floor1,10,10.10.10.1,255.255.255.255&#xA;R2,false,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R2_floor1,10,10.10.10.1,255.255.255.255&#xA;R3,false,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R3_floor1,10,10.10.10.1,255.255.255.255&#xA;R4,false,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R4_floor1,10,10.10.10.1,255.255.255.255&#xA;R31,true,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R31_floor1,10,10.10.10.1,255.255.255.255&#xA;R32,true,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R32_floor1,10,10.10.10.1,255.255.255.255&#xA;R5,false,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R5_floor1,10,10.10.10.1,255.255.255.255&#xA;R6,true,1.1.1.9,1.1.1.10,1.1.1.8,255.255.255.248,1.1.1.1,R6_floor1,10,10.10.10.1,255.255.255.255&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como vocês podem observar isso são exemplos e vocês podem adaptar conforme sua necessidade e as solicitações que são exigidas pelas diferentes áreas de sua empresa. Todo o desenvolvimento de nossa automação também é muito co-relacionada com a estrutura de pastas e arquivos que vamos utilizar dentro do Ansible, portanto segue a estrutura que estou utilizando para esse exemplo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_tree_project_csv_file.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Uma outra informação diferente dos exemplos citados em nossos posts sobre Ansible, é que estou criando como fictício todos esses roteadores em nosso arquivo de inventário ( &lt;strong&gt;./hosts&lt;/strong&gt; ), para que nosso exemplo seja mais robusto e obviamente no final de nosso exemplo irei demonstrar como aplicar as configurações. Segue meu inventário criado para esse exemplo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers-client]&#xA;R1 ansible_host=192.168.0.22&#xA;R2 ansible_host=192.168.0.23&#xA;R31 ansible_host=192.168.0.24&#xA;R5 ansible_host=192.168.0.25&#xA;R6 ansible_host=192.168.0.26&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Tendo como base essas informações vamos trabalhar com um módulo que Ansible oferece que é de executar um “&lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/playbooks_lookups.html#the-csv-file-lookup&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; &lt;em&gt;lookup&lt;/em&gt;&lt;/a&gt; ” dentro de um arquivo &lt;strong&gt;( .csv )&lt;/strong&gt;. Para que nosso código seja mais estruturado minha playbook principal irá chamar minha “&lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/playbooks_reuse_roles.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; &lt;em&gt;role&lt;/em&gt; &lt;/a&gt;” definida como ( &lt;strong&gt;./lookup_csv_info.yaml&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: JINJA AND CSVFILE&#xA;  hosts: all&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: LOOKUP IN CSV FILE&#xA;    include_role:&#xA;      name: lookup_csv_info&#xA;    when: ./excel/test.csv is defined&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Talvez vocês devem estar se perguntando o porque utilizar “ &lt;strong&gt;roles&lt;/strong&gt; ” dentro desse código? De fato a funcionalidade role é muito utilizada no sentido de trazer mais dinamismo, funcionalidade e flexibilidade  para seu código, pois eles podem se tornar difíceis de gerenciar e difíceis de manter com um único arquivo. As roles permitem que você crie playbooks mínimas que, em seguida, busque uma estrutura de diretório para determinar as etapas de configurações reais que precisam executar, bem como proceder para as próximas roles se anterior foi executada/validada da forma correta.&lt;/p&gt;&#xA;&lt;p&gt;   Seguindo essa linha de raciocínio, demostro agora a playbook específica que irá pesquisar todas as informações dentro de nosso arquivo ( &lt;strong&gt;.csv&lt;/strong&gt; ). Ressalto, que em nosso arquivo temos mais informações do que de fato existem ( &lt;em&gt;&lt;strong&gt;hostnames&lt;/strong&gt;&lt;/em&gt; ) nosso arquivo de ( &lt;strong&gt;./hosts&lt;/strong&gt; ), ou seja, estamos pesquisando em nossa planilha se existem elementos que coincidem com nosso inventário.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: GET VARIABLES FROM CSVFILE&#xA;  set_fact:&#xA;    vars_dict:&#xA;        DHCP: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=1 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_start: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=2 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_exclude1_end: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=3 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_network: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=4 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_netmask: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=5 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        dhcp_gateway: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=6 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        new_hostname: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=7 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        id_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=8 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        ip_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=9 delimiter=,&amp;#39;) }}&amp;#34;&#xA;        mask_loopback: &amp;#34;{{ lookup(&amp;#39;csvfile&amp;#39;, &amp;#39;{{ inventory_hostname }} file=./excel/test.csv col=10 delimiter=,&amp;#39;) }}&amp;#34;&#xA;  with_items: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Para que possamos ver que as informações estão sendo capturadas vamos colocar uma task contendo debug de uma variável para observar o comportamento. Essa variável em nosso caso é ” &lt;strong&gt;var_dict&lt;/strong&gt; ” onde se tem todo o ” &lt;strong&gt;dicionário&lt;/strong&gt; ” com os valores populados de cada elemento. Para adicionar essa validação foi inserido o comando:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  - debug: var={{&amp;#39;vars_dict&amp;#39;}}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Desta forma temos esse output e a confirmação que os dados estão sendo populados corretamente.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_var_dictionary_csv_file.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Acredito que vocês observaram que temos todos os elementos que foram lidos/capturados baseado em cada coluna de nosso arquivo &lt;strong&gt;( .csv )&lt;/strong&gt; comparado ao nosso inventário em uma única “ &lt;em&gt;&lt;strong&gt;task&lt;/strong&gt;&lt;/em&gt; “. Porquê?&lt;/p&gt;&#xA;&lt;p&gt;   Isso está relacionado justamente com ” &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/playbooks_loops.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;loops&lt;/a&gt; ” que podemos criar dentro de nossas “ &lt;em&gt;&lt;strong&gt;tasks&lt;/strong&gt;&lt;/em&gt; “, fazendo com que ele faça a mesma tarefa diversas vezes baseado no requisito que estamos utilizando. Para nosso exemplo estou usando a variável “ &lt;strong&gt;{{ inventory_hostname }}&lt;/strong&gt; “, justamente para que ela pesquise no arquivo todos os roteadores expostos no arquivo ( &lt;strong&gt;./hosts&lt;/strong&gt; ). Essa função pode ser observada através do ” &lt;strong&gt;with_items:&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e no próximo post vou detalhar como trabalhar com esse dados. &lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-includes/images/smilies/mrgreen.png&#34; alt=&#34;:mrgreen:&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt; &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Instalar SSH usando processo de automação</title>
            <link>https://ciscoredes.com.br/2017/12/21/ansible-instalar-ssh-usando-processo-de-automacao/</link>
            <pubDate>Thu, 21 Dec 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/12/21/ansible-instalar-ssh-usando-processo-de-automacao/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/tree_ansible_ssh.jpg&#34; alt=&#34;Featured image of post Ansible – Instalar SSH usando processo de automação&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Já faz um bom tempo que não escrevo aqui no BLOG, mas tudo isso é devido outras tarefas que estão tomando também um certo tempo ( recertificação CCIE, estudos DevOps, projetos particulares, aulas, treinamentos, etc ). Enfim, hoje venho aqui trazer uma situação real que acredito que diversos leitores de nosso canal podem vivenciar em sua infra-estrutura e de alguma forma já fizeram esse questionamento quando começei aqui explicar sobre Ansible 💡 . Você pode conferir nossos posts sobre &lt;a class=&#34;link&#34; href=&#34;https://www.ciscoredes.com.br/tag/ansible&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible aqui&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   De fato, vocês observaram que a todo momento o que implementamos usando essa ferramenta foi utilizando o processo de acesso remoto a nossos equipamentos, é claro, executando as operações necessarias via CLI. Mas qual é esse acesso remoto? **SSH. &lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-includes/images/smilies/mrgreen.png&#34; alt=&#34;:mrgreen:&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;**&lt;/p&gt;&#xA;&lt;p&gt;   Pois bem, se observarmos todos os módulos para Networking os acessos aos equipamentos é feito pela biblioteca &lt;a class=&#34;link&#34; href=&#34;http://www.paramiko.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;” Paramiko “&lt;/a&gt;, e antes da versão 2.4 do Ansible não tinhamos nenhum módulo para utilizarmos os acessos via Telnet. Devido a isso, foi criado na versão 2.4.0  um módulo para que pudessemos avaliar os equipamentos ou executar algum comando ( &lt;strong&gt;CLI&lt;/strong&gt; ) pelo acesso via Telnet. Esse módulo você pode conferir através desse link (&lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/telnet_module.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; Telnet no Ansible&lt;/a&gt; ).&lt;/p&gt;&#xA;&lt;p&gt;   Baseado nesses fatos, a ideia é acessar os equipamento via telnet, implementar script para habilitar o SSH, e após essa configuração toda a nossa infra-estrutura já estaria apta para utilizar-se de uma metodologia de maior segurança para acesso remoto aos equipamentos e pronto para trabalharmos com qualquer outro módulo disponível dentro da estrutura do Ansible. O que posso dizer é, mais ou menos!!! &lt;/p&gt;&#xA;&lt;p&gt;   Como estamos pensando em automação vamos pontuar os ítens para que isso seja efetivo:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Acessar o equipamento via telnet.&lt;/li&gt;&#xA;&lt;li&gt;Verificar se o equipamento tem o ssh habilitado.&lt;/li&gt;&#xA;&lt;li&gt;Qual a versão implementada do SSH.&lt;/li&gt;&#xA;&lt;li&gt;Caso negativo, devemos instalar o script para acesso via SSH e importar a chave SSH para o host remoto da gerência para evitarmos as perguntas se queremos aceitar a chave em nosso primeiro acesso.&lt;/li&gt;&#xA;&lt;li&gt;Caso positivo, devemos importar a chave SSH para o host remoto da gerência para evitarmos as perguntas se queremos aceitar a chave em nosso primeiro acesso.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;   As dificuldades encontradas com o módulo telnet do Ansible é de fato capturar alguns logs ( utilizar pipe ) e fazer as tratativas dos outputs para obter somente o necessário, então o desafio foi encontrar biblioteca para usarmos nesta demanda. Depois de avaliar diferentes caminhos/testes e pedir ajuda à grupo discussão no &lt;a class=&#34;link&#34; href=&#34;https://networktocode.slack.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;SLACK Networktocode&lt;/a&gt; ( onde indico para todos com intuito adquirir experiências com essas pessoas, e claro, de uma comunidade que de fato ajuda muito nas dúvidas e idéias para desenvolvermos nossas soluções ), verifiquei poderíamos trabalhar com a biblioteca ” &lt;a class=&#34;link&#34; href=&#34;http://ntc-docs.readthedocs.io/en/latest/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ntc-ansible&lt;/a&gt; “, pois ela já oferece o acesso via telnet e temos diversos outputs ” &lt;strong&gt;show commands&lt;/strong&gt; ” formatados &lt;strong&gt;JSON&lt;/strong&gt; ” &lt;em&gt;JavaScript Object Notation&lt;/em&gt; “, onde a comunidade executou via TextFSM, trazendo assim esse ” &lt;em&gt;array&lt;/em&gt; ” para ficar de fato mais pratico a consulta de nossos outputs. Mas, nossa vida não é fácil, pois esse comando que é necessario em minha playbook não tinhamos pronto, porém não foi impactante devido a conseguir executar os filtros e capturar o output essencial do comando.&lt;/p&gt;&#xA;&lt;p&gt;   Para nossa estrutura de arquivos e pastas eu desenvolvi desta forma.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/tree_ansible_ssh.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Vocês podem observar que temos uma estrutura de ” &lt;em&gt;roles&lt;/em&gt; “, ” &lt;em&gt;templates&lt;/em&gt; ” e ” &lt;em&gt;output&lt;/em&gt; ” onde a principal pasta para corresponder a nossa playbook estaria dentro de roles, desta forma podemos fazer nossas validações ” &lt;em&gt;conditionals&lt;/em&gt; ” na playbook e trabalhar baseado nos outputs/status para as execuções das tarefas posteriores. Nosso arquivo raiz para iniciar implementação estaria em ” ssh_config.yaml “.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: INSTALL SSH IN CISCO DEVICES&#xA;  hosts: routers-client&#xA;  gather_facts: no&#xA;  connection: local&#xA;  vars:&#xA;    template_dir: /home/rodrigo/Documents/ansible/ntc-ansible/ntc-templates/templates/&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: INCLUDE SSH ENABLE ROLE&#xA;    include_role:&#xA;      name: ensure_ssh_enabled&#xA;&#xA;  - name: INCLUDE SSH KEY ON THE PATH .ssh/known_hosts&#xA;    include_role:&#xA;      name: get_ssh_key&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como podem observar a primeira validação é garantir se temos implementado o SSH, e caso negativo, iremos fazer a implementação de nosso script. Dentro da estrutura de roles podemos ter diversos arquivos denominados com o mesmo nome, porém ele sempre irá buscar o arquivo main.yaml que é a base de nossa role.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: ACCESS BY TELNET&#xA;  ntc_show_command:&#xA;      connection: telnet&#xA;      platform: cisco_ios&#xA;      template_dir: &amp;#34;{{ template_dir }}&amp;#34;&#xA;      command: &amp;#34;{{ item }}&amp;#34;&#xA;      host: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;      username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;      password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;      secret: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;  with_items:&#xA;      - show ip ssh | include SSH Enabled - version 2&#xA;  register: ssh_telnet&#xA;&#xA;- name: ENABLE SSH IF REQUIRED&#xA;  include_tasks: enable_ssh.yaml&#xA;  when: &amp;#34;ssh_telnet.results.0.response.0 != &amp;#39;SSH Enabled - version 2.0&amp;#39;&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Para ficar mais claro vocês podem observar no debug ( via ah-hoc command ” &lt;strong&gt;-vvv&lt;/strong&gt; ” ) output sendo demostrado com valor essencial para validar via condição ( when ) de qualquer coisa que seja diferente de versão 2 , então ele irá chamar nossa próxima task para implementar nosso script.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_response_ssh_version2.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;PS.:&lt;/strong&gt; Nessa execução o valor é o mesmo comparado portando ele esta executando o ” &lt;em&gt;skipping&lt;/em&gt; “&lt;/p&gt;&#xA;&lt;p&gt;   Em nossa próxima task temos novamente o acesso sendo executado via telnet e a implementação dos comandos necessário para subirmos o protocolo SSH, liberando assim esse equipamento para seus devidos fins.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: INSTALL SSH TEMPLATE&#xA;  ntc_config_command:&#xA;      connection: telnet&#xA;      platform: cisco_ios&#xA;      host: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;      username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;      password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;      secret: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;      commands_file: &amp;#34;/home/rodrigo/Documents/ansible/IWAN Project/ssh_installation_by_telnet/template/ssh_configuration.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após toda essa validação e configuração ( se necessario ) nós precisamos fazer com que nosso host tenha essa chave inserida em seu arquivo de controle ( &lt;strong&gt;~/.ssh/known_hosts&lt;/strong&gt; ) para que ele não faça essa pergunta chata quando for acessar pela primeira vez seu equipamento.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_answer_ssh_accept.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para isso, iremos ter nossa próxima role para trazer essas validações e inserções dentro do arquivo necessário. Após chamar role ” &lt;strong&gt;get_ssh_key&lt;/strong&gt; ” iremos novamente ter nosso arquivo &lt;strong&gt;main.yaml&lt;/strong&gt; sendo executado e nele iremos tratar as informações.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: ACCESS BY TELNET&#xA;  ntc_show_command:&#xA;      connection: telnet&#xA;      platform: cisco_ios&#xA;      template_dir: &amp;#34;{{ template_dir }}&amp;#34;&#xA;      command: &amp;#34;{{ item }}&amp;#34;&#xA;      host: &amp;#34;{{ inventory_hostname }}&amp;#34;&#xA;      username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;      password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;      secret: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;  with_items:&#xA;      - show ip ssh | begin ^ssh-rsa&#xA;  register: ssh_key&#xA;&#xA;- name: Save output in variable related inline command&#xA;  set_fact: myvar=&amp;#34;{{ ssh_key.results.0.response.0 }}&amp;#34;&#xA;  when: ssh_key is defined&#xA;&#xA;- name: Replace space inside myvar&#xA;  set_fact:&#xA;    clean: &amp;#34;{{ myvar.replace(&amp;#39;\n&amp;#39;,&amp;#39;&amp;#39;) }}&amp;#34;&#xA;  when: ssh_key is defined&#xA;&#xA;- name: ADD KEY INSIDE LOCALHOST OF SSH CONNECTION&#xA;  lineinfile:&#xA;    path: ~/.ssh/fake_hosts&#xA;    state: present&#xA;    line: &amp;#34;{{ inventory_hostname }} {{ clean }}&amp;#34;&#xA;    insertafter: EOF&#xA;  when: ssh_key is defined&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Um dos problemas enfrentados nesse tópico foi justamente a comparação da chave existente com o fato de possívelmente eu já ter essa chave inserida em seu arquivo de hosts, portanto dependendo de sua infra-estrutura essas informações poderiam ficar duplicadas e também a cada execução ele salvar a mesma chave em seu arquivo. Para validação no arquivo temos um módulo muito interessante chamado ” &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/lineinfile_module.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;lineinfile&lt;/em&gt;&lt;/a&gt; ” que de fato ele pesquisa no arquivo se temos essa informação, caso negativo, ele insere o que foi solicitado. Como dito o problema sobre a inserção toda vez que executava a playbook ficava atrelado algum espaço ( &lt;strong&gt;\n&lt;/strong&gt; ) que ele tinha do output ficando interpretável para o modulo &lt;em&gt;lineinfile&lt;/em&gt;, com isso precisou ser feito um ” &lt;em&gt;replace&lt;/em&gt; ” desses espaços para que pudesse comparar minha variável com o arquivo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;PS.:&lt;/strong&gt; Vocês vão observar que criei um arquivo ” &lt;strong&gt;fake_hosts&lt;/strong&gt; ” justamente para que você não fique testando dentro de seu arquivo de produção e de alguma forma possa impactar aquilo que esta funcionado, portanto criei o arquivo para você validar os seus passos e analisar se esta sendo executado da maneira correta, pois no momento de rodar talvez em cima de 100, 300 devices o rollback pode ficar complicado. ( rsrs )&lt;/p&gt;&#xA;&lt;p&gt;   Vamos partir do principio que não temos nada instalado em nosso equipamento e a configuração que será implementado é conforme abaixo. &lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!&#xA;username ssh privilege 15 password 0 sshansible&#xA;!&#xA;ip domain-name cisco.com&#xA;!&#xA;crypto key generate rsa modulus 2048&#xA;!&#xA;ip ssh version 2&#xA;ip ssh source-interface g3&#xA;ip ssh time-out 5&#xA;!&#xA;line vty 0 4&#xA; login local&#xA; transport input all&#xA;!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Abaixo você pode conferir que removi toda a configuração de ssh e deletei no meu arquivo de teste para garantir que não temos nada populado.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_removed_config_fakehosts.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso, em nosso próximo output você poderá observar que de fato não consigo fazer nenhum acesso &lt;strong&gt;SSH&lt;/strong&gt;, e após execução de nossa playbook ( capturando duas changes ) temos de fato implementado nosso script e chave inserida. O erro mencionado abaixo em meu detalhamento refere-se ao fato de eu não ter salvo nossa chave &lt;strong&gt;SSH&lt;/strong&gt; no arquivo correto, devido ao que foi comentando logo acima.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_execute_ssh_insert.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para garantir podemos acessar nosso equipamento e consolidar as informações relacionados ao script implementado, bem como, adicionei um novo usuario.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_cli_ssh_user.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Validando nosso arquivo ” &lt;em&gt;fake_hosts&lt;/em&gt; ” para garantir que temos a mesma chave inserida no arquivo e comparado ao nosso equipamento.\&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_key_detail_fakehosts.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Vale lembrar que, o foi adicionado em nosso arquivo de ” &lt;em&gt;known_hosts&lt;/em&gt; ” é o hostname, portanto se você acessa seus equipamentos pelo nome ele terá essa menção adicionado no arquivo, porém se o DNS não resolver esse nome você terá que acessar pelo endereço IP e que nesse caso não é a mesma informação que populamos em nosso arquivo de “ &lt;em&gt;known_hosts&lt;/em&gt; “, sendo assim ele irá questionar para adicionar sua chave.&lt;/p&gt;&#xA;&lt;p&gt;   Logo abaixo, coloco alguns exemplo para garantir o correto funcionamento, colocando hipóteses de alguns itens que podemos obter durante a implementação que diversos hosts. &lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_ssh_instalado_device.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Nesse caso foi removido apenas ” &lt;em&gt;no ip ssh version 2&lt;/em&gt; ” para que possamos implementar o script, mas não inserir chaves duplicadas em nosso arquivo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/12/ansible_version_nao_instalado_key_inserida.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Declaro que esse post ficou bem grande, porém quis demonstrar todas as possibilidades colocando os outputs e anuências que foram vivenciadas até o desenvolvimento dessa automação.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e de fato ajude de alguma forma a solucionar problemas vivenciados em seu dia a dia. Fique a vontade de compartilhar esse artigo e de colocar mais sugestões ou melhorias para essa estrutura.&lt;/p&gt;&#xA;&lt;p&gt;   Esses códigos estão disponivéis também no meu Github.  😛 &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Módulo Networking</title>
            <link>https://ciscoredes.com.br/2017/11/24/ansible-modulo-networking/</link>
            <pubDate>Fri, 24 Nov 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/11/24/ansible-modulo-networking/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/11/Ansible_Mod_Networking_Webinar_Novembro.jpg&#34; alt=&#34;Featured image of post Ansible – Módulo Networking&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Acredito que vocês vêem acompanhando sobre os posts que estou descrevendo sobre essa nova tecnologia de ” &lt;strong&gt;DevOps&lt;/strong&gt; ” para qual estou me atualizando baseado em Ansible.&lt;/p&gt;&#xA;&lt;p&gt;   Devido a isso gostaria de divulgar algumas informações adicionais para vocês que também estão se interessando nesse tópico, trazendo assim um histórico para nosso BLOG sobre essa comunidade que está crescendo e principalmente os módulos de networking está tendo uma visbilidade muito importante não somente da RedHat, mas em relação também as vendors de oferecerem essas facilidades para comunidade.&lt;/p&gt;&#xA;&lt;p&gt;   Com isso, gostaria de agregar aquilo que já comentei em nosso 3 post sobre o módulo de networking, bem como agora podemos acompanhar evolução ( roadmap ) das novas versão que estão para chegar. Aqui são slides que capturei para apresentar para vocês, porém se desejam ver na integra temos o &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/webinars-training/ask-an-expert-networking-nov-2017&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible Webinar Networking.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/11/Ansible_Mod_Networking_Webinar_Novembro.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/11/Ansible_MVPA_Webinar_Novembro.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/11/Ansible_Roadmaps_Webinar_Novembro.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;br&gt;&#xA;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Validação de Configuração – Parte 3</title>
            <link>https://ciscoredes.com.br/2017/10/30/ansible-validacao-de-configuracao-parte-3/</link>
            <pubDate>Mon, 30 Oct 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/10/30/ansible-validacao-de-configuracao-parte-3/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible-Compare_running_startup_CLI_add_user.jpg&#34; alt=&#34;Featured image of post Ansible – Validação de Configuração – Parte 3&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Seguindo em nossos posts, continuamos trabalhando para fazer nossas comparações entre as configurações que estão aplicadas em nosso ambiente. Hoje vamos tratar sobre a validação do módulo ” &lt;strong&gt;startup-config&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Como vocês observaram anteriormente, sempre estavamos validando situações onde iríamos comparar arquivos ( &lt;em&gt;&lt;strong&gt;scripts&lt;/strong&gt;&lt;/em&gt; ) que poderiam ser aplicados em nossos equipamentos ou validados no sentido de possíveis alterações que de fato não se equipara com nossa base ( &lt;em&gt;&lt;strong&gt;backup&lt;/strong&gt;&lt;/em&gt; ).&lt;/p&gt;&#xA;&lt;p&gt;   Logo abaixo, iremos fazer uma validação simples entre “ &lt;em&gt;startup-config&lt;/em&gt; ” com a ” &lt;em&gt;running-config&lt;/em&gt; “, com isso temos outro motivo para possíveis troubleshooting identificar rapidamente se algo foi alterado, e se de fato essa alteração foi feita da maneira correta, sempre lembrando-se que, essas alterações podem aparecer desde que ainda não foram salvas na &lt;strong&gt;NVRAM&lt;/strong&gt;. Abaixo temos o script:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- hosts: all&#xA;  connection: local&#xA;  gather_facts: no&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Fill vars&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: Compare startup-config with running-config&#xA;    ios_config:&#xA;      diff_against: startup&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;    register: test_diff&#xA;&#xA;  - name: Take startup-config and sets it to a variable called *before*&#xA;    set_fact: before=&amp;#34;{{ test_diff[&amp;#39;diff&amp;#39;][&amp;#39;before&amp;#39;].split(&amp;#39;\n&amp;#39;)}}&amp;#34;&#xA;    when: test_diff[&amp;#39;diff&amp;#39;] is defined&#xA;&#xA;  - name: This takes the running_config and sets it to a variable called *after*&#xA;    set_fact: after=&amp;#34;{{ test_diff[&amp;#39;diff&amp;#39;][&amp;#39;after&amp;#39;].split(&amp;#39;\n&amp;#39;)}}&amp;#34;&#xA;    when: test_diff[&amp;#39;diff&amp;#39;] is defined&#xA;&#xA;  - name: Create a line-to-line diff of running-config to startup_config&#xA;    set_fact: difference=&amp;#34;{{ after | difference(before) }}&amp;#34;&#xA;    when: test_diff[&amp;#39;diff&amp;#39;] is defined&#xA;&#xA;  - name: sanitized output &amp;#34;Lines added to running-config that are not present in startup_config&amp;#34;&#xA;    debug:&#xA;      var: difference&#xA;    when: test_diff[&amp;#39;diff&amp;#39;] is defined&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Vale ressaltar que utilizamos a mesma técnica já explicada anteriormente, onde temos que “ &lt;em&gt;sanitizar&lt;/em&gt; ” as diferenças para que de fato tenhamos a saída mais ” &lt;em&gt;clean&lt;/em&gt; ” possível, e claro de fácil visualização. No primeiro momento, como vocês vão perceber apenas executei nossa playbook para demonstrar que de fato meu equipamento foi ligado e permanece com a mesma configuração. &lt;/p&gt;&#xA;&lt;p&gt;   A mensangem ” &lt;em&gt;skipping&lt;/em&gt; ” é justamente para mencionar que nossa variável esta ” &lt;em&gt;zerada&lt;/em&gt; ” e que essa tarefa está sendo pulada para as tarefas seguintes. Segue abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible-Compare_running_startup_no_difference.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Agora, como já temos tudo garantido, vamos novamente fazer uma alteração em nosso roteador relacionado a um novo usuário, e claro, não vamos salvar em nossa NVRAM.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible-Compare_running_startup_CLI_add_user.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Feito isso, agora esperamos que após execução da playbook iremos visualizar que nosso novo usuário foi inserido na ” &lt;em&gt;&lt;strong&gt;running-config&lt;/strong&gt;&lt;/em&gt; “. Segue abaixo o output trazendo assim a linha adicional:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible-Compare_running_startup_show_difference.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso, finalizamos nossas 3 opções de validação de configuração, para qual pode atender diversas opções dentro de nosso ambiente de produção ou mesmo de futuros laboratórios. Pensando assim, vendo nossas demonstrações você avalia que isso de fato pode automatizar algum processo que hoje você precisa executar manualmente ou não consiga gerenciar suas configurações de equipamentos? O que seria mais interessante? &lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;PS.:&lt;/strong&gt; Vale lembrar novamente que estamos executando somente em um roteador, porém isso, pode ser escalável a muitos equipamentos, apenas alterando nosso arquivo de hosts.&lt;/p&gt;&#xA;&lt;p&gt;   Deixe seus comentários.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Validação de Configurações</title>
            <link>https://ciscoredes.com.br/2017/10/23/ansible-validacao-de-configuracoes/</link>
            <pubDate>Mon, 23 Oct 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/10/23/ansible-validacao-de-configuracoes/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible_version_2_4.jpg&#34; alt=&#34;Featured image of post Ansible – Validação de Configurações&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible_version_2_4.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Enfim, depois de um longo periodo voltamos para trazer mais tópicos sobre nossa estrutura de DevOps utilizando Ansible. Acredito que algumas pessoas devem ter visto que a RedHat fez anúncio sobre atualização do &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/devel/release_and_maintenance.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible para a versão 2.4&lt;/a&gt;, e se observarem o módulo de networking foi o que teve a maior quantidade de release, portanto podemos observar que o projeto e a comunidade esta empenhanda em trazer mais beneficios para nossa área. Segue a menção explicada pelo engenheiro do modulo de &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/blog/networking-features-in-ansible-2-4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;networking da RedHat&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;   Para critério de equiparação eu já fiz atualização para a nova versão, pois nossos exemplos e laboratórios já estão com os novos módulos. Segue a versão que estamos trabalhando nesse momento.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;h5 id=&#34;rootubuntuhomerodrigo-ansible-version-ansible-2400-config-file--etcansibleansiblecfg-configured-module-search-path--urootansiblepluginsmodules-uusrshareansiblepluginsmodules-ansible-python-module-location--usrlibpython27dist-packagesansible-executable-location--usrbinansible-python-version--2712-default-nov-19-2016-064810-gcc-540-20160609&#34;&gt;root@ubuntu:/home/rodrigo# ansible –version ansible 2.4.0.0 config file = /etc/ansible/ansible.cfg configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’] ansible python module location = /usr/lib/python2.7/dist-packages/ansible executable location = /usr/bin/ansible python version = 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]&#xA;&lt;/h5&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Como estamos trabalhando em exemplos sobre backups de configuração, historico de configuração, neste post vou trazer algumas funcionalidades que temos agora para comparar nossas configurações e obter outputs que podem trazer beneficios em nosso dia a dia. O módulo voltado para Cisco, onde iremos trabalhar seria “&lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/ios_config_module.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; ios_config&lt;/a&gt; “, que por sua vez, teve algumas alterações nessa nova edição. Para contextualizar, existem algumas possibilidades que dependendo do seu ambiente podem-se enquadrar de uma forma diferente, portanto, para nosso caso eu irei criar um arquivo ( .conf ) que iremos apenas adicionar usuários para que possamos comparar nossas configurações. Segue exemplo de meu arquivo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!&#xA;username R1 privilege 15 password 0 rodrigo3&#xA;username teste2 privilege 15 password 0 rodrigo3&#xA;username teste12 privilege 15 password 0 teste&#xA;!&#xA;!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;PS.: Não é obrigatório a criação do arquivo como sendo ( .conf ), ele pode ser como texto e utilizar a estrutura que você tem em seu ambiente. &lt;/p&gt;&#xA;&lt;p&gt;   Após a criação de nosso arquivo base, iremos construir nosso playbook para que possamos fazer as comparações das configurações. Neste primeiro exemplo, iremos fazer a comparação da ” running-config ” com o arquivo base, e assim output que irá trazer em nossa variavél será a diferença entre os dois arquivos.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- hosts: all&#xA;  connection: local&#xA;  gather_facts: no&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Fill vars&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: Compare running-config with base file&#xA;    ios_config:&#xA;      diff_against: running&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;      src: /home/rodrigo/Documents/ansible/input/{{ inventory_hostname }}.conf&#xA;    register: test_diff&#xA;&#xA;  - debug: var=test_diff.updates&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso, podemos agora fazer nossa validação através de nosso playbook utilizando comando ad-hoc ( –check ). Vale lembrar que o &lt;em&gt;“check”&lt;/em&gt; não irá popular nenhuma configuração em seu equipamento.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible_compare_running.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Assim podemos comparar com nossa configuração apresentada em nosso roteador que os usuários não estão presentes em nossa configuração ( running-config ), entretanto vocês podem observar que temos um usuario ( rodrigo ) que o mesmo não foi demostrado em nosso output. Porque?&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible_running_config.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;br&gt;&#xA;   Isso ocorre porque a validação que é feita é somente a comparação do &lt;strong&gt;R1.conf&lt;/strong&gt; com a &lt;strong&gt;running-config&lt;/strong&gt;, trazendo assim somentes as diferenças ( &lt;strong&gt;check&lt;/strong&gt; ) do que temos na configuração base com o que está no roteador ( &lt;strong&gt;running-config&lt;/strong&gt; ), e não o inverso. Teremos outras funções para que essa diferença também seja apresentada.&lt;/p&gt;&#xA;&lt;p&gt;   Devido a este ponto, para os próximos posts irei trazer mais validações usando essa nova funcionalidade ( diff_against ).&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Notificação BOT Telegram</title>
            <link>https://ciscoredes.com.br/2017/09/04/ansible-notificacao-bot-telegram/</link>
            <pubDate>Mon, 04 Sep 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/09/04/ansible-notificacao-bot-telegram/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/notifica%C3%A7%C3%A3o_telegram_ansible.jpg&#34; alt=&#34;Featured image of post Ansible – Notificação BOT Telegram&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Seguindo nossa sequência sobre Ansible, hoje gostaria de trazer um adendo que estaria envolvido simplesmente em criar uma notificação que poderá ser exibida no Telegram, através de nossos famosos e tão comentado &lt;strong&gt;BOTs&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Para que todo esse processo funcione, você terá a necessidade de criar um &lt;em&gt;BOT&lt;/em&gt; simples pelo Telegram, para isso você pode interagir com nosso amigo &lt;a class=&#34;link&#34; href=&#34;https://telegram.me/botfather&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;@BotFather&lt;/a&gt;. Se necessitar de mais informações sobre os procedimentos para criação desse &lt;em&gt;BOT&lt;/em&gt;, recomendo que pesquise nesse &lt;a class=&#34;link&#34; href=&#34;https://telegram.org/faq#q-how-do-i-create-a-bot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link, na pagina do Telegram&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Em nossos testes eu criei meu &lt;em&gt;BOT&lt;/em&gt; e vou utiliza-lo para fazer as notificações para uma sala de teste, no intuito de inserir meu &lt;em&gt;BOT&lt;/em&gt; para visualizar as notificações.&lt;/p&gt;&#xA;&lt;p&gt;   Seguindo com nossas configurações, irei utilizar o mesmo exemplo que já estamos trabalhando, porém vou agregar mais um arquivo no projeto, denominado como telegram.yaml&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;  - name: Send test message&#xA;    telegram:&#xA;        token: bot000:xxxx&#xA;        chat_id: -yyyy&#xA;        msg: Ansible playbook executed&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como podem observar eu omiti algumas informações de nosso exemplo devido a ser referenciado ao meu &lt;strong&gt;token e ID de BOT&lt;/strong&gt;, portanto a partir de seu &lt;em&gt;BOT&lt;/em&gt; essas informações vocês devem alterar olhando especificamente em seu &lt;em&gt;BOT&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Um dos motivos mais difíceis para conseguir funcionar essa notificação através do BOT, foi conseguir adquirir esse chat_id, que com exclusividade vou detalhar um pouco de que forma facilitar sua vida.&lt;/p&gt;&#xA;&lt;p&gt;   Como exemplo o nome do BOT seria rodrigo_bot&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Você deve inserir seu BOT em um grupo&lt;/li&gt;&#xA;&lt;li&gt;Você precisa enviar uma mensagem em seu grupo para seu BOT&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Neste caso você deve fazer &lt;em&gt;&lt;strong&gt;/my_id @rodrigo_bot&lt;/strong&gt;&lt;/em&gt; ( Eu tentei diversas mensagens, mas a única que trouxe a informação foi utilizando &lt;em&gt;/my_id&lt;/em&gt; )&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Em seu browser você deve colocar&lt;em&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://api.telegram.org/botXXX:YYYY/getUpdates&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://api.telegram.org/botXXX:YYYY/getUpdates&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; ( lembre-se de trocar as variáveis citadas pelo token de seu BOT )&lt;/li&gt;&#xA;&lt;li&gt;Após a resposta você deve procurar pelo campo ,&lt;em&gt;&lt;strong&gt;“chat”:{“id”:-xxxxxx&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;BINGO!!!!&lt;/strong&gt;  😆&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;   Enfim, agora você pode utilizar as informações para preencher em seu arquivo do Ansible ( telegram.yaml ). Se quiser fazer um teste antes para validar sobre o chat-id o telegram aceita notificação via CURL. Esse comando é aceito no Linux ( &lt;em&gt;&lt;strong&gt;curl -X POST “https://api.telegram.org/botxxx:yyyyy/sendMessage” -d “chat_id=-wwwww&amp;amp;text=my sample text”&lt;/strong&gt;&lt;/em&gt; ), lembrando-se que para funcionar você precisa anexar suas informações de token e chat_id.&lt;/p&gt;&#xA;&lt;p&gt;   Para que possamos finalizar eu chamei através de nosso arquivo principal ( backup_router.yaml ) nossa notificação na sala de bate papo.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Configuration Backup in Cisco Devices&#xA;  hosts: routers&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Define access&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: Obtain commands&#xA;    include: commands_variance.yaml&#xA;&#xA;  - name: Obtain Telegram&#xA;    include: telegram.yaml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Segue a execução de nossa playbook. Nesse caso chamei duas mensagens para popular mais opções para você.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/ansible_telegram_playbook.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após a execução podemos consultar em nossa sala de bate papo nossa mensagem populada.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/notifica%C3%A7%C3%A3o_telegram_ansible.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Espero que tenham gostado e nossa próxima integração será através de outra ferramenta de messaging. Aguardem!!!&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Rodar um Grupo de seu Inventário</title>
            <link>https://ciscoredes.com.br/2017/08/21/ansible-rodar-um-grupo-de-seu-inventario/</link>
            <pubDate>Mon, 21 Aug 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/08/21/ansible-rodar-um-grupo-de-seu-inventario/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Limit_group_switches.jpg&#34; alt=&#34;Featured image of post Ansible – Rodar um Grupo de seu Inventário&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Detalhando um pouco mais sobre nossa estrutura do Ansible, gostaria de trazer hoje algumas facilidades que podemos executar através de um recurso chamado ” &lt;em&gt;&lt;strong&gt;Ad-Hoc commands&lt;/strong&gt;&lt;/em&gt; “, onde caracteriza que podemos passar variáveis, limitar host, executar module, etc, através de nossa própria execução do playbook.&lt;/p&gt;&#xA;&lt;p&gt;   Neste exemplo, o que vou trazer de dica é que, a partir do momento que temos um lista grande hosts ( &lt;strong&gt;inventário&lt;/strong&gt; ) em algum determinado momento acredito que, não queremos obter as informações de todos que estão presentes nesta lista, por isso podemos trazer limitações de quais hosts iremos executar nossas task. Como podem observar abaixo, fiz alteração em nosso arquivo de ( &lt;strong&gt;hosts&lt;/strong&gt; ) adicionando mais equipamentos e trazendo grupos distintos de equipamentos ( &lt;strong&gt;routers e switches&lt;/strong&gt; ). Para maiores detalhes dos comandos &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/intro_adhoc.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ad-hoc veja no site da documentação&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Vale lembrar que, em nossa simulação até o momento não temos esses equipamentos adicionais, foi mais pela questão demonstrar sobre quais os grupos, equipamentos estamos trazendo nesse post.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;R1 ansible_host=192.168.0.19&#xA;R33 ansible_host=192.168.0.21&#xA;&#xA;[switches]&#xA;SW1 ansible_host=192.168.0.20&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Devido a termos as segmentações de equipamentos fiz alteração em nosso arquivo abaixo, chamando na função ” &lt;em&gt;hosts&lt;/em&gt; ” ambos os grupos, mas isso não é um ítem obrigatório, pois iremos chamar nossas funções via parâmetro na execução de nossa playbook.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Acesso remoto aos equipamentos&#xA;  hosts: routers, switches&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Define access&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: Obtain commands&#xA;    include: commands_variance.yaml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após essa alteração vamos executar nosso playbook, porém iremos adicionar um comando adicional ( &lt;strong&gt;–limit “routers”&lt;/strong&gt; ), que por sua vez irá executar nossas tarefas em todos os routers definidos anteriormente. Segue em detalhe em nosso quadro azul.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Limit_group.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após essa menção detalho que estamos agora chamando nosso próximo grupo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Limit_group_switches.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Logo abaixo faço uma pequena alteração, chamando agora especificamente um hosts que está dentro de um grupo de equipamentos, fazendo com que eu possa executar as tasks sem executar as tarefas em qualquer outro equipamentos que esteja em nossa lista de inventário.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Limit_switches.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Agregar TimeStamp ao Arquivo</title>
            <link>https://ciscoredes.com.br/2017/08/16/ansible-agregar-timestamp-ao-arquivo/</link>
            <pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/08/16/ansible-agregar-timestamp-ao-arquivo/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Timestamp_Backup.jpg&#34; alt=&#34;Featured image of post Ansible – Agregar TimeStamp ao Arquivo&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Como vocês estão observando, segue mais uma evolução desenvolvimento para nosso script em Ansible. Acredito que vocês haviam se perguntado: Não vejo nenhum objetivo se eu ficar armazenando/sobrescrever o mesmo arquivo sem ter nenhum histórico ou obter um database de alteração desse arquivo? Pois é, eu também pensei dessa forma, mas devido à isso trago agora uma alteração pequena, porém importante para você rastrear seu histório de alteração ou de logs.&lt;/p&gt;&#xA;&lt;p&gt;   Em nosso playbook podemos utilizar-se da função “&lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/playbooks_lookups.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; lookup&lt;/a&gt; ” atrelado a data+time de nosso sistema operacional que está executando a playbook. Vale ressaltar que essa data não tem nenhuma amarração com o time de seu equipamento ( router, switch, etc ), e sim a máquina host que esta executando nossa biblioteca do ansible, que por consequência devemos garantir para que ela esteja sincronizada com algum serviço de NTP.&lt;/p&gt;&#xA;&lt;p&gt;   Para essa visualização eu fiz alteração apenas em nosso arquivo ” &lt;strong&gt;commands_variance.yaml&lt;/strong&gt; “, adicionando nossa função ” &lt;em&gt;lookup&lt;/em&gt; “, e por consequencia adicionei minha varável ao nome do arquivo que estou salvando em ” &lt;strong&gt;.txt&lt;/strong&gt; “&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;  - name: Timestamp&#xA;    set_fact: mydate=&amp;#34;{{lookup(&amp;#39;pipe&amp;#39;,&amp;#39;date +%Y%m%d_%H%M%S&amp;#39;)}}&amp;#34;&#xA;&#xA;  - name: show running-config&#xA;    ios_command:&#xA;     provider: &amp;#34;{{ provider }}&amp;#34;&#xA;     commands:&#xA;        - show running-config&#xA;    register: config&#xA;&#xA;  - name: save output Running&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_running_{{mydate}}.txt&amp;#34;&#xA;&#xA;  - name: show version&#xA;    ios_command:&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;      commands:&#xA;        - show version&#xA;    register: config&#xA;&#xA;  - name: save output Version&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_version.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após execução de nossa playbook segue o detalhamento da criação de meu arquivo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Timestamp_Backup.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Aguardo comentário e se alguém tiver mais alguma ideia para que possamos manipular esses comandos/arquivos fique a vontade de mencionar ou compartilhar.  😉 &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Variações no Playbook – ” Include “</title>
            <link>https://ciscoredes.com.br/2017/08/14/ansible-variacoes-no-playbook-include/</link>
            <pubDate>Mon, 14 Aug 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/08/14/ansible-variacoes-no-playbook-include/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Inventory_hostname.jpg&#34; alt=&#34;Featured image of post Ansible – Variações no Playbook – ” Include “&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Baseando-se em nosso ultimo &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/08/09/ansible-criacao-do-playbook/&#34; &gt;post&lt;/a&gt;, acredito que vocês tenham pensado em algumas alternativas para capturar comandos dos equipamentos ou de alguma forma ser mais flexível para armazenar arquivos. Pensando em algumas alternativas segue aquelas que acho interessante compartilhar com vocês para que isso possa de alguma forma ser uma implementação dentro de seu ambiente.&lt;/p&gt;&#xA;&lt;p&gt;Como vocês observaram nosso arquivo de texto estava sendo salvo com o IP do equipamento, talvez isso não seja interessante e você gostaria de salvar esse documento através do hostname do equipamento, tendo isso como principio vamos fazer algumas alterações para que isso possa acontecer. Nosso primeiro passo é editar o arquivo de hosts ( &lt;strong&gt;inventário&lt;/strong&gt; ) colocando nele a denominação do hostname e nossa variável ” &lt;em&gt;&lt;strong&gt;ansible_host&lt;/strong&gt;&lt;/em&gt; ” obviamente atrelado ao nosso IP de gerenciamento.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;R1 ansible_host=192.168.0.19&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Desta forma precisamos fazer uma pequena alteração em nosso playbook adicionando a variável ” &lt;em&gt;&lt;strong&gt;inventory_hostname&lt;/strong&gt;&lt;/em&gt; ” no momento de salvar nosso arquivo ( &lt;strong&gt;.txt&lt;/strong&gt; ). Para ficar melhor documentado, vocês podem observar que podemos adicionar algo após nossa variável, e assim a documentação do nome desse arquivo fica personalizada.  🙂&lt;/p&gt;&#xA;&lt;p&gt;   Segue abaixo nosso novo arquivo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Acesso remoto aos equipamentos&#xA;  hosts: routers&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Define access&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: show running-config&#xA;    ios_command:&#xA;     provider: &amp;#34;{{ provider }}&amp;#34;&#xA;     commands:&#xA;        - show running-config&#xA;    register: config&#xA;&#xA;  - name: save output Running&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_running.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso, podemos executar nosso playbook como explicado anteriormente, e logo vocês podem observar a diferença de ” &lt;em&gt;output&lt;/em&gt; “, para qual temos o hostname populado ” &lt;strong&gt;R1&lt;/strong&gt; “, bem como o arquivo de texto que foi gerado como ” &lt;strong&gt;R1_running.txt&lt;/strong&gt; “&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Inventory_hostname.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Depois de fazermos essas alterações vocês talvez queiram incluir mais comandos em nossa playbook, para que de alguma forma seja documentado, ou seja, vocês podem ir adicionando mais comandos conforme exemplo anterior e salvar em um novo arquivo. Segue exemplo para adicionarmos mais comandos: &lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- name: show version&#xA;    ios_command:&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;      commands:&#xA;        - show version&#xA;    register: config&#xA;&#xA;  - name: save output Version&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_version.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após compilar novamente nossa playbook vocês podem observar que foram executados os dois comandos e consequentemente gerados dois arquivos.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Many_commands.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Agora vêm o ponto, pensando em comandos e sobre a escalabilidade desse formato, onde teremos uma playbook gigantesca para executar várias tarefas.  💡 O que podemos fazer?&lt;/p&gt;&#xA;&lt;p&gt;   Acredito que seja mais interessante criarmos um arquivo ( &lt;em&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/em&gt; ), onde colocaremos todos nossos comandos, e desta forma, podemos chamar esse arquivo através de nossa playbook principal, assim ela não fica poluída com varias ações para ser executada. Para isso devemos usar nosso modulo “&lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/include_module.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; include&lt;/a&gt; “, conforme segue abaixo em nosso script.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Acesso remoto aos equipamentos&#xA;  hosts: routers&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Define access&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: Obtain commands&#xA;    include: commands_variance.yaml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após essa inserção eu criei um novo documento ( &lt;em&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/em&gt; ), onde foi inserido todos os comandos que desejo fazer para meu equipamento, e assim fica mais claro as execuções de tarefas dentro de nossa playbook.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;  - name: show running-config&#xA;    ios_command:&#xA;     provider: &amp;#34;{{ provider }}&amp;#34;&#xA;     commands:&#xA;        - show running-config&#xA;    register: config&#xA;&#xA;  - name: save output Running&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_running.txt&amp;#34;&#xA;&#xA;  - name: show version&#xA;    ios_command:&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;      commands:&#xA;        - show version&#xA;    register: config&#xA;&#xA;  - name: save output Version&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ inventory_hostname }}_version.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Após a execução o mesmo output é observado, porém temos uma estruturação muito mais adequada para execução e mapeamento de seu script. O que acharam? Deixem seus comentários.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Criação do Playbook</title>
            <link>https://ciscoredes.com.br/2017/08/09/ansible-criacao-do-playbook/</link>
            <pubDate>Wed, 09 Aug 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/08/09/ansible-criacao-do-playbook/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Playbook_Executed.jpg&#34; alt=&#34;Featured image of post Ansible – Criação do Playbook&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Conforme mencionado em nosso último post, hoje gostaria de trazer para você as configurações executadas em nosso playbook, para que possamos acessar nosso equipamento Cisco ( &lt;strong&gt;CSR1000V&lt;/strong&gt; ) para capturar sua configuração ( &lt;em&gt;running-config&lt;/em&gt; ) e salvar essa configuração em uma pasta específica. Para que isso possa acontecer é necessário fazer algumas validações, e assim garantir acesso ao nosso equipamento. Primeiramente um teste rápido que devemos executar via Ubuntu é fazermos o teste de ping, conforme abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Ping_CSR1000V.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após esse processo devemos garantir que nosso roteador é acessível via protocolo &lt;strong&gt;SSH&lt;/strong&gt; ( &lt;em&gt;Secure Shell&lt;/em&gt; ), isso é necessário porque o &lt;strong&gt;Ansible&lt;/strong&gt; utiliza-se somente desse protocolo para acesso aos equipamentos ( &lt;em&gt;Roteadores, Switches, Servidores, etc&lt;/em&gt; ) e quando pensarmos nessa utilização precisamos garantir que o protocolo SSH esteja habilitado em nosso equipamento e da mesma forma acessível. Conforme abaixo, eu estou executando o acesso ao meu equipamento, e como esperado ele me questiona para confirmação de acesso usando uma nova chave de SSH para o equipamento. Após esse processo digito a senha e tenho acesso completo ao equipamento. Se tiver interesse em habilitar o SSH Server no Ubuntu siga esse &lt;a class=&#34;link&#34; href=&#34;https://www.vivaolinux.com.br/dica/Instalando-e-configurando-servidor-SSH-%28Ubuntu%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;procedimento&lt;/a&gt;, mas nesse momento você não precisa se preocupar em habilitar esse serviço nesse sistema operacional.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_SSH_Access.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após esse acesso podemos validar em nosso roteador qual sessão foi estabelecida com o equipamento, bem como verificar o tipo de criptografia, status e username logado. Conforme mostrado na figura com a representação &lt;strong&gt;numero ( 1 )&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Logo abaixo, temos maiores detalhes sobre a conexão e a chave criptográfica utilizada pelo protocolo. Após essa validação, eu saio do modo de acesso via SSH ao roteador e podemos observar na figura com a representação &lt;strong&gt;numero ( 2 )&lt;/strong&gt; que não temos mais nenhuma sessão estabelecida com o equipamento. Se quiser monitorar acesso ao seu roteador habilite o ” &lt;em&gt;debug ip ssh detail&lt;/em&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_SSH_Router_Auth.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para que vocês possam fazer a configuração de SSH ao nosso roteador segue os comandos básicos abaixo, vale lembra que aqui nesse ambiente de teste estou utilizando um usuário local criado no equipamento com acesso privilegiado, entretanto devemos lembrar que ambientes mais robustos seria interessante que esse usuario fosse autenticado através de outras plataformas como Radius, TACACS+.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;!&lt;br&gt;&#xA;username rodrigo privilege 15 password 0 rodrigo&lt;br&gt;&#xA;!&lt;br&gt;&#xA;ip domain name cisco.com&lt;br&gt;&#xA;!&lt;br&gt;&#xA;ip ssh time-out 60&lt;br&gt;&#xA;ip ssh source-interface GigabitEthernet3&lt;br&gt;&#xA;ip ssh version 2&lt;br&gt;&#xA;!&lt;br&gt;&#xA;line vty 0 15&lt;br&gt;&#xA;login local&lt;br&gt;&#xA;transport input ssh&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Enfim, depois de garantir total acesso ao equipamento, segue abaixo a configuração de nosso playbook para que possamos capturar o ” &lt;em&gt;show running-config&lt;/em&gt; “.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- hosts: routers&#xA;  gather_facts: no&#xA;  connection: local&#xA;&#xA;  tasks:&#xA;  - name: OBTAIN LOGIN CREDENTIALS&#xA;    include_vars: secret.yaml&#xA;&#xA;  - name: Define access&#xA;    set_fact:&#xA;      provider:&#xA;        host: &amp;#34;{{ ansible_host }}&amp;#34;&#xA;        username: &amp;#34;{{ creds[&amp;#39;username&amp;#39;] }}&amp;#34;&#xA;        password: &amp;#34;{{ creds[&amp;#39;password&amp;#39;] }}&amp;#34;&#xA;        auth_pass: &amp;#34;{{ creds[&amp;#39;auth_pass&amp;#39;] }}&amp;#34;&#xA;&#xA;  - name: show running-config&#xA;    ios_command:&#xA;     provider: &amp;#34;{{ provider }}&amp;#34;&#xA;     commands:&#xA;        - show run&#xA;    register: config&#xA;&#xA;  - name: save output to /home/rodrigo/Documents/ansible&#xA;    copy:&#xA;      content: &amp;#34;{{ config.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/{{ ansible_host }}.txt&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Podemos observar abaixo que temos nossos arquivos criados, conforme em nossos posts anteriores e devidamente validado, pois no presente momento não temos nenhum backup de configuração ( &lt;strong&gt;.txt&lt;/strong&gt; )&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Before_Execute_Playbook.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após todo esse processo devemos executar nosso playbook através do comando ” &lt;em&gt;ansible-playbook -i hosts backup_cisco_router.yaml&lt;/em&gt; “. Na sequencia podemos observar todos os passos de nosso playbook sendo visualizado através das confirmações de nossas “ &lt;em&gt;tasks&lt;/em&gt; “, e na última ação ” &lt;em&gt;PLAY RECAP&lt;/em&gt; ” ele sempre irá trazer para nós o resumo se foi feito com sucesso e se tivemos alguma alteração baseado na ultima solicitação.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Playbook_Executed.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso podemos visualizar nosso arquivo ” &lt;strong&gt;.txt&lt;/strong&gt; ” com toda a configuração atual de nosso equipamento.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/08/Ansible_Show_Running.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e no proximo post vou demostrar algumas variações que podemos executar dentro dessa lógica de script.&lt;/p&gt;&#xA;&lt;p&gt;   Aguardo comentários.  🙂&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Execução da Playbook</title>
            <link>https://ciscoredes.com.br/2017/07/18/ansible-execucao-playbook/</link>
            <pubDate>Tue, 18 Jul 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/07/18/ansible-execucao-playbook/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/07/ansilbe-process.png&#34; alt=&#34;Featured image of post Ansible – Execução da Playbook&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Como já venho tratando sobre esse tópico em nossos posts anteriores, hoje venho aqui para explicar um pouco sobre o processo de execução de nosso playbook criado para rodar dentro da plataforma do Ansible.&lt;/p&gt;&#xA;&lt;p&gt;   Como já fizemos as tratativas dos arquivos de ” &lt;em&gt;hosts&lt;/em&gt; “, também conhecido como inventário, e também uma forma prática de criar um arquivo de senhas para acesso aos nossos equipamentos, a ideia seria irmos para a criação de nosso ” &lt;em&gt;playbook&lt;/em&gt; “, porém achei mais interessante trazer antes de que forma é composto o playbook para que possamos acessar as bibliotecas, e assim obter as configurações e execução de nosso python por trás de toda a estrutura.&lt;/p&gt;&#xA;&lt;p&gt;   Segue abaixo os componentes que podemos considerar para que toda a estrutura implementada no ansible possa executar.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/07/ansilbe-process.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Dentro desse propósito explico os ítens atrelado a essa estrutura:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Inventory =&lt;/strong&gt; Arquivo que hospeda todas as definições dos seus equipamentos atrelados aos seus IPs de gerenciamento de sua infraestrutura, ou até mesmo através de um resolução de DNS.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Modules =&lt;/strong&gt; Nesse caso podemos definir como sendo o modulo que roda todas as classes dentro do Ansible. Podemos mencionar aqui toda a estrutura do ansible galaxy, instalação / atualização para o Ubuntu, modulos de networking, monitoração, etc&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ansible Config =&lt;/strong&gt; Essa configuração já é definida na própria instalação do software, porém é nesta base que temos visualizar e obviamente torna-se um item importante para fazer a conexão ao nosso ambiente de script que está acoplado ao Python. Em nossos testes posteriores não iremos fazer nenhuma tratativa nesse arquivo, pois não iremos cobrir alterações dentro dessa estrutura.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Python =&lt;/strong&gt; Essa biblioteca já vem instalada com o software e são dessas bibliotecas que acessamos para os parametros relacionados aos equipamentos, em nosso caso estamos usando especificamente para questões dos modulos para Cisco.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Playbook =&lt;/strong&gt; Nele podemos ter diferentes “ &lt;em&gt;plays&lt;/em&gt; “, ou seja, pode existir chamadas arquivos remotos, como eu expliquei anteriormente sobre utilização do arquivo ” secret.yaml ” para fazer as tratativas dos usuário/senhas. Basicamente é um conjunto de tarefas usando os módulos, executados em um conjunto definido de hosts, tendo assim a execução em sequencia aos seus passos criados dentro do ” &lt;em&gt;playbook&lt;/em&gt; “. Veja abaixo o exemplo:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/07/ansible_playbook.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Desta forma temos a estruturação de nosso ” &lt;em&gt;playbook&lt;/em&gt; “, para que assim possamos pensar nas etapas de consulta ou configuração de nossos equipamentos. Em nosso próximo post irei trazer as configurações executadas para que possamos fazer a captura do arquivo de configuração dos equipamentos via ansible e assim salvar em um diretorio especifico.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Criar arquivo host</title>
            <link>https://ciscoredes.com.br/2017/06/14/ansible-criar-arquivo-host/</link>
            <pubDate>Wed, 14 Jun 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/06/14/ansible-criar-arquivo-host/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_logo.png&#34; alt=&#34;Featured image of post Ansible – Criar arquivo host&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_logo.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Conforme venho comentando com vocês hoje gostaria de trazer a primeira iniciativa para que possamos criar nosso arquivo denominado como &lt;strong&gt;host&lt;/strong&gt;. O que seria este arquivo?&lt;/p&gt;&#xA;&lt;p&gt;   Devido ao seu próprio nome, ele é um arquivo que podemos fazer analogia baseando-se no inventário de sua rede, portanto neste arquivo você deve popular todos os seus equipamentos que serão visívies à partir da instalação que você executou de seu Linux ( &lt;strong&gt;Ubuntu – &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/05/11/instalacao-ansible-ubuntu/&#34; &gt;veja nosso post anterior&lt;/a&gt;&lt;/strong&gt; ). Em nossa pequena topologia para testes, eu apenas adicionei meu router &lt;strong&gt;CSR1000V&lt;/strong&gt; dentro dos parâmetros desse arquivo conforme abaixo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[router]&#xA;192.168.0.13&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso poderíamos pensar em fazer segmentações nesse arquivo separando roteadores, switches, firewalls conforme exemplo abaixo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;192.168.0.13&#xA;192.168.0.20&#xA;&#xA;[switches]&#xA;192.168.0.21&#xA;192.168.0.22&#xA;&#xA;[firewalls]&#xA;192.168.0.23&#xA;192.168.0.24&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Dependendo da escalabilidade de crescimento de seu ambiente esse arquivo pode tomar outras formas, definindo assim, uma melhor forma de criar seu inventário. Uma das possibilidades que você pode executar nesse arquivo seria a criação de uma ” &lt;strong&gt;variável&lt;/strong&gt; “, fazendo com que você implemente uma inserção de informação para esse grupo.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;192.168.0.13&#xA;192.168.0.20&#xA;&#xA;[routers:vars]&#xA;ntp_server=200.160.7.186&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Seguindo um pouco mais adiante podemos fazer inserção de grupos dentro de grupos e ainda utilizar variavéis para colocar aquela determinada informação.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;192.168.0.13&#xA;192.168.0.20&#xA;&#xA;[switches]&#xA;192.168.0.21&#xA;192.168.0.22&#xA;&#xA;[dcsaopaulo:children]&#xA;routers&#xA;switches&#xA;&#xA;[dcsaopaulo:vars]&#xA;ntp_server=200.160.7.186&#xA;&#xA;[brasil:children]&#xA;dcsaopaulo&#xA;dcriodejaneiro&#xA;dcbrasilia&#xA;dcrecife&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Podemos também utilizar um range de endereços IPs que irão seguir uma sequência, facilitando assim a definição dos endereços dentro do arquivo, economizando uma lista maior com somente os endereços IPs&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;192.168.0.[1:255]&#xA;192.168.1.[1:128]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Para finalizarmos podemos também fazer associação desses endereços IPs por nome de hosts, mas vale lembrar, para que isso funcione você precisar ter o &lt;strong&gt;DNS&lt;/strong&gt; funcionando corretamente, para que esse nome seja resolvido antes dele consultar seu device na sua infraestrutura. Segue um exemplo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[routers]&#xA;R1_andar_1&#xA;R2_andar_1&#xA;&#xA;[switches]&#xA;SW1_sala_10&#xA;SW2_sala_10&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso você já consegue manipular seus equipamentos através de seu arquivo de ” host “, fazendo com essa maquina possa alcançar a sua infraestrutura e manipular seus equipamentos. Para maiores detalhes, exemplos recomendo fazer a consulta através da documentação do &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/intro_inventory.html#inventory&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Inventory Ansible&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Validação Sintaxe – Ansible</title>
            <link>https://ciscoredes.com.br/2017/05/15/validacao-sintaxe-ansible/</link>
            <pubDate>Mon, 15 May 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/05/15/validacao-sintaxe-ansible/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Atom_indent_lines.jpg&#34; alt=&#34;Featured image of post Validação Sintaxe – Ansible&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Conforme nossas notificações anteriores, hoje gostaria de trazer algumas facilidades que podem ajudar vocês em relação a validação de ” &lt;em&gt;Syntax&lt;/em&gt; “. O que seria isso?&lt;/p&gt;&#xA;&lt;p&gt;   Toda linguagem de programação, bem como nossa ” &lt;em&gt;&lt;strong&gt;costumeira&lt;/strong&gt;&lt;/em&gt; ” CLI tem sua syntax correta, para que nossos comandos sejam aplicados de forma correta em nossos equipamentos, bem como nesse caso, a lógica seria executar algumas validações em meu script ” &lt;em&gt;Ansible&lt;/em&gt; “, para que ele já possa mostrar onde podem estar contidos os erros.&lt;/p&gt;&#xA;&lt;p&gt;   Com isso, vocês podem perceber que o Atom pode trazer diferentes temas e pacotes para customização de seu editor, onde para nosso caso vou trazer 3 pacotes que irá ajudar em suas validações de script. Vale lembrar que esses pacotes que encontrei, foram os que mais me agradam, portanto se alguém que já trabalha com esse editor para desenvolvimento de scripts e tiver mais algumas dica interessante, posta em nossos comentários para que possamos desenvolver juntos as facilidades.  😛 &lt;/p&gt;&#xA;&lt;p&gt;   Para procurar os pacotes e fazer a instalação, você deve ir em &lt;em&gt;Edit -&amp;gt; Preferences -&amp;gt; + Install&lt;/em&gt;. Logo, você deve visualizar algo conforme nossa figura abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Install_packages_atom.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após, isso eu recomendo esses três pacotes para que você procure na aba de packages e faça a instalação dos mesmos:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;language-ansible&lt;/li&gt;&#xA;&lt;li&gt;linter-ansible-syntax&lt;/li&gt;&#xA;&lt;li&gt;linter-js-yaml&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;   Após instalação alguns recursos precisam ser configurados, para que de fato eles possam trabalhar a seu favor. Em dois casos a recomendação é que você faça edição de um arquivo do Atom chamado ( &lt;strong&gt;config.cson&lt;/strong&gt; ), para isso segue os links dos 3 pacotes recomendados acima para que você leia e execute conforme recomendação.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://atom.io/packages/language-ansible&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://atom.io/packages/language-ansible&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://atom.io/packages/linter-ansible-syntax&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://atom.io/packages/linter-ansible-syntax&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://atom.io/packages/linter-js-yaml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://atom.io/packages/linter-js-yaml&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;   Com isso após estes passos, podemos observar alguns ítens que são inseridos logo abaixo de nossa aplicação dando dicas de possíveis erros em nosso script:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Error_script_ansible.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Em nossos dois retângulos azuis, podemos visualizar os alertas que nossos pacotes inserem como notificação e o retângulo laranja a descrição da falha, bem como em que linha ela esta ocorrendo. Desta forma, já conseguimos ter alguma visualização de possíveis erros de digitação, estruturação de variáveis, variáveis sem contéudo, etc.&lt;/p&gt;&#xA;&lt;p&gt;   Como uma última dica e que pode ajudar de alguma forma a visualização da sua indentação, onde pode trazer para você vários problemas, como um espaço adicionado ou até um ” &lt;em&gt;TAB&lt;/em&gt; ” executado por engano ( achando que estava na CLI do Cisco…rsrsrs  🙂 ). Para isso devemos novamente ir em &lt;em&gt;&lt;strong&gt;Edit -&amp;gt; Preferences -&amp;gt; Editor&lt;/strong&gt;&lt;/em&gt; ( Scroll on ) e você irá visualizar &lt;em&gt;Show Indent Guide&lt;/em&gt;. Como em nossa figura:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Atom_indent_lines.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Você pode visualizar em nosso retângulo azul à esquerda as linhas nas verticais representando o nível de cada argumento que você esta inserindo em seu código.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado dessas dicas e se alguém tiver mais alguma dica fique a vontade em compartilhar. Em nosso próximo post vou iniciar com algumas configurações para captura em nosso CSRV1000V.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Instalação Ansible – Ubuntu</title>
            <link>https://ciscoredes.com.br/2017/05/11/instalacao-ansible-ubuntu/</link>
            <pubDate>Thu, 11 May 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/05/11/instalacao-ansible-ubuntu/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Atom_screen.jpg&#34; alt=&#34;Featured image of post Instalação Ansible – Ubuntu&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_logo.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Conforme explicado em nosso post &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/05/08/automacao-ansible-devops/&#34; &gt;anterior&lt;/a&gt;, gostaria de trazer algumas dicas para facilitar o seus estudos e que você não ” &lt;em&gt;apanhe&lt;/em&gt; ” como aconteceu comigo, perdendo algum tempo para ajustar seu laboratório.&lt;/p&gt;&#xA;&lt;p&gt;   Primeiramente, todo esse ambiente que instalei para praticar meu laboratório estão virtualizados no meu Vmware WorkStation 12, desta forma foi feita instalação do &lt;strong&gt;Ubuntu 16.04 LTS&lt;/strong&gt; ( pode ser feito &lt;a class=&#34;link&#34; href=&#34;https://www.ubuntu.com/download/desktop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;donwload free do Ubuntu&lt;/a&gt; ) através da imagem ” &lt;em&gt;iso&lt;/em&gt; ” e iniciado o processo de instalação onde todos os ítens basico do sistema operacional foram instalados. Após finalização do processo de instalação do sistema operacional, você precisa fazer instalação da biblioteca Ansible em seu SO e obviamente capturar a versão mais nova do &lt;strong&gt;Ansible + Python&lt;/strong&gt;. Segue abaixo os comandos em Ubuntu para instalação:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;$ sudo apt-get install software-properties-common&lt;br&gt;&#xA;$ sudo apt-add-repository ppa:ansible/ansible&lt;br&gt;&#xA;$ sudo apt-get update&lt;br&gt;&#xA;$ sudo apt-get install ansible&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Após essa instalação vocês devem observar que foram instalados todos os pacotes do Ansible, mais as bibliotecas do Python que o proprio Ansible utiliza-se para execução de suas tarefas. Para garantir integridade de instalação você pode conferir através do comando abaixo:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;root@ubuntu:/home/rodrigo# &lt;strong&gt;ansible –version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;( &lt;em&gt;Status de instalação na minha máquina&lt;/em&gt; ):&lt;/p&gt;&#xA;&lt;p&gt;root@ubuntu:/home/rodrigo# ansible –version&lt;br&gt;&#xA;ansible 2.3.0.0&lt;br&gt;&#xA;    config file = /etc/ansible/ansible.cfg&lt;br&gt;&#xA;    configured module search path = Default w/o overrides&lt;br&gt;&#xA;    python version = 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Como padrão do SO ele vai instalar toda essa demanda na pasta ( &lt;em&gt;/etc/ansible&lt;/em&gt; ) e como dica eu recomendo que você copiei o conteúdo dessa pasta e grave esses arquivos em uma outra pasta ( &lt;em&gt;/documents&lt;/em&gt; ) para que você possa trabalhar tranquilamente com esses arquivos, sem impactar na sua instalação, já que estamos apenas praticando nossos conceitos e erros de fato podem acontecer.&lt;/p&gt;&#xA;&lt;p&gt;   Agora temos nossa biblioteca/app instalado e podemos começar a trabalhar em nossos scripts. Mas, aqui dou mais uma dica para facilitar para você que irá começar a escrever seus scripts, e que não sofrá com a ” &lt;em&gt;&lt;strong&gt;syntax&lt;/strong&gt;&lt;/em&gt; ” da linguagem de programação, que por usa vez, podem trazer diversos erros que são muitas vezes indecifravéis, para nos que estamos iniciando nessa área.&lt;/p&gt;&#xA;&lt;p&gt;   Claro, que as pessoas que já estão acostumados a trabalhar com essas ferramentas podem continuar da mesma forma, mas aqui vou partir do principio que nem todos fazem isso em seu dia a dia, então para que você não fique ” &lt;strong&gt;stressado&lt;/strong&gt; 👿 ” com as teclas de atalho que o ” &lt;strong&gt;vi&lt;/strong&gt; ” traz para você e obviamente ele não traz uma ” &lt;em&gt;syntax&lt;/em&gt; ” amigável, eu recomendaria a instalação do &lt;a class=&#34;link&#34; href=&#34;https://atom.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Atom.io&lt;/a&gt; que irá facilitar muito nossa vida tanto em programação de Python como em Ansible. Existem diversas ferramentas para esse tipo de trabalho, portanto fiquem a vontade de utilizar a que mais adequa-se a você. Para instalação do Atom você pode executar conforme abaixo:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;sudo add-apt-repository ppa:webupd8team/atom -y&lt;/p&gt;&#xA;&lt;p&gt;sudo apt-get update&lt;/p&gt;&#xA;&lt;p&gt;sudo apt-get install atom -y&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Após instalação do Atom eu recomendo que você inicie o aplicativo de edição sempre em modo ” &lt;strong&gt;root&lt;/strong&gt; “, para que desta forma você já posso compilar, validar e grava através de seu editor de texto, diminuindo assim algumas tarefas para execução de seu playbook ansible. Para isso basta iniciar a aplicação como abaixo:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;sudo atom&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;   Após inicialização você irá visualizar sua tela de edição conforme figura abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Atom_screen.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Em nosso próximo post vou trazer mais alguns caminhos para que você possa instalar em seu ” editor de scripts ” para que possamos ter algumas validações de syntax para o Ansible.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Automação – Ansible – DevOps</title>
            <link>https://ciscoredes.com.br/2017/05/08/automacao-ansible-devops/</link>
            <pubDate>Mon, 08 May 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/05/08/automacao-ansible-devops/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_Topology.jpg&#34; alt=&#34;Featured image of post Automação – Ansible – DevOps&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_logo.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Acredito que baseando-se no título, vocês devem estar se perguntando esse &lt;strong&gt;BLOG&lt;/strong&gt; não é de redes? Sim, ele é de redes, porém, como já venho trazendo em alguns posts anteriores e sempre menciono que nossa área de redes está passando por uma transformação é devido a esses ítens que venho hoje falar um pouco mais para vocês.&lt;/p&gt;&#xA;&lt;p&gt;   Devido a essa novo tema, venho aqui, compartilhar um pouco do que estou estudando para que eu possa melhorar em alguns aspectos, e claro gostaria de mostrar para vocês sobre alguns ítens que possam ajudar nossos engenheiros em nossas tarefas diárias.&lt;/p&gt;&#xA;&lt;p&gt;   Hoje, nosso segmento de redes está trazendo muitos conceitos sobre os processos de automações que devemos implementar, para que nossas tarefas diarias sejam mais efetivas e que nossos scripts não sejam somente atrelados a nossa &lt;strong&gt;CLI&lt;/strong&gt; ( &lt;em&gt;command line interface&lt;/em&gt; ) e sim, que nossos scripts possam agregar mais valor as tarefas cotidianas de implementações e que demandam muito esforço repetitivo. Baseando-se nesses tópicos estamos falando-se de duas frentes de trabalho que estão caminhando muito forte dentro do mundo de Redes ( &lt;em&gt;Cisco&lt;/em&gt; ) que são &lt;strong&gt;Python&lt;/strong&gt; e &lt;strong&gt;Ansible&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Talvez, algumas pessoas podem estar pensando, porque ele já vai falar de Ansible se os temas de Python ainda não forão discutidos ou exemplificados em nosso BLOG. Isso eu vou explicar mais no final de nossa serie de posts sobre Ansible. &lt;/p&gt;&#xA;&lt;p&gt;   Como mencionado anteriormente, nos estamos falando muito em automação dos processos para que seja executado de forma rapida e automatica diversas configurações ou validações em nossos ambientes de redes. Devido a isso, a Cisco está trabalhando fortemente nas disponibilizações de &lt;strong&gt;API&lt;/strong&gt; ( para que não viu, verifique em nosso post de &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/02/13/o-que-e-api-e-rest-api/&#34; &gt;Rest API / API&lt;/a&gt; ) e também em formas de trabalhar em conjunto para que essas metodologias de DevOps, seja cada vez mais vivenciado nesse mundo Cisco. Com isso, o que trago para vocês é um detalhamento sobre a linguagem &lt;strong&gt;Ansible&lt;/strong&gt;. &lt;/p&gt;&#xA;&lt;p&gt;   Basicamente, essa linguagem é desenvolvida pela &lt;a class=&#34;link&#34; href=&#34;https://www.redhat.com/pt-br/technologies/management/ansible&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Red Hat&lt;/a&gt;, onde eles estão investindo pesado para divulgação dessa linguagem e disponibilizações de soluções para diferentes vendors. Com isso, gostaria de mostrar a &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;documentação do Ansible&lt;/a&gt;, para que vocês possam consultar e com certeza através dela muitos ítens podem ser validados, para que você pense em seu primeiro script. Como uma primeira dica, gostaria de deixar um ítem extremamente voltado para nossa &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/list_of_network_modules.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;área de Redes&lt;/a&gt;, especificamente para as demandas que podemos utilizar para equipamentos Cisco, mas também podem observar que temos para diversos fabricantes.&lt;/p&gt;&#xA;&lt;p&gt;   Para efetuar nossos testes eu vou trabalhar com o sistema operacional &lt;strong&gt;Linux&lt;/strong&gt; ( &lt;em&gt;escolhido foi o Ubuntu&lt;/em&gt; ) e para maior praticidade, vou utilizar um router virtualizado &lt;strong&gt;Cisco CSR1000V&lt;/strong&gt;. Segue uma topologia bem simples para que vocês entendam o cenario de teste, porém lembrando que esse ambiente pode ser escalado a níveis muito maiores.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/05/Ansible_Topology.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Em nosso próximo post, vou explicar um pouco mais sobre a instalação da biblioteca Ansible no Ubuntu e de alguns recursos que vocês podem utilizar para melhorar seu aprendizado.  🙂 &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
