<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Ansible on Cisco Redes</title>
        <link>https://ciscoredes.com.br/categories/ansible/</link>
        <description>Recent content in Ansible on Cisco Redes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>pt-br</language>
        <lastBuildDate>Mon, 02 Dec 2019 00:00:00 +0000</lastBuildDate><atom:link href="https://ciscoredes.com.br/categories/ansible/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Cisco Meraki – Inicialização Ansible para primeiro playbook</title>
            <link>https://ciscoredes.com.br/2019/12/02/cisco-meraki-inicializacao-ansible-para-primeiro-playbook/</link>
            <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2019/12/02/cisco-meraki-inicializacao-ansible-para-primeiro-playbook/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Logo_Meraki_Ansible_Playbook.jpg&#34; alt=&#34;Featured image of post Cisco Meraki – Inicialização Ansible para primeiro playbook&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Logo_Meraki_Ansible_Playbook.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;   Como todos sabem que muitas das vezes eu não consigo atualizar os conteúdos conforme eu desejaria, mas na medida do possível vou sempre atualizando nosso seguidores e comunidade sobre os tópicos que vou aprendendo e desenvolvendo para compartilhar com todos.&lt;/p&gt;&#xA;&lt;p&gt;   Enfim, depois de avançar bastante com tópicos de &lt;strong&gt;Meraki + Umbrella&lt;/strong&gt;, hoje vamos continuar sobre nossos desenvolvimentos baseado em Ansible para controlar seu ambiente, bem como gerenciar as configurações de uma forma mais ágil. &lt;/p&gt;&#xA;&lt;p&gt;   Nos estavamos mencionando nos posts anteriores sobre as capturas que podemos fazer via as&lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2019/08/26/cisco-meraki-apis-como-consultar/&#34; &gt; API através do Postman&lt;/a&gt;. Porém, como vamos iniciar trabalhando dentro do Ansible para chamar algumas solicitações para o Meraki, então nesse momento vou demonstrar algumas ações sendo feitas através de alguns modulos já existentes no Ansible e futuramente coloco algum caso utilizando alguma API dedicada diretamente via Ansible.&lt;/p&gt;&#xA;&lt;h1 id=&#34;api-key-para-ansible&#34;&gt;API Key para Ansible&#xA;&lt;/h1&gt;&lt;p&gt;   Como todos sabemos para acesso ao Meraki precisamos utilizar nossa chave e por consequencia é necessario adicionar esses parametros para o Ansible, pois através dessa ” key ” é que teremos permissões para fazer solicitações ( GET, POST, DELETE, UPDATE )  ao &lt;em&gt;” Dashboard “&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Não devemos esquecer que o ” Control Node ” que está executando o Ansible deve ter acesso a Internet, já que o produto Meraki está hospedado em Cloud pública. Baseado nessa API Key você também precisa ficar atento que hospedar arquivo host em algum respositório ( Git ), pode expor sua chave de acesso dando permissão ” full ” a toda administração Meraki.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;usando-ansible-vault&#34;&gt;Usando Ansible-Vault&#xA;&lt;/h1&gt;&lt;p&gt;   Como informado acima temos que usar algumas técnicas para podermos criptografar nosso arquivo que irá ter nossa &lt;strong&gt;” API Key “&lt;/strong&gt; e consequentemente mais algumas informações, que podemos denominar como variáveis para utilização em nossa playbook.&lt;/p&gt;&#xA;&lt;p&gt;   Dentro desta estrutura temos um ítem simples e prático para executar essas ações que esta denominado como sendo função &lt;strong&gt;” ansible-vault “&lt;/strong&gt;. Como esse não é objetivo principal do post vou executar o mais simples, que é criptografar todo o meu conteúdo no arquivo ( &lt;strong&gt;group_vars/auth_key_mer.yml&lt;/strong&gt; ). Caso queira visualizar mais opções visite a documentação do &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/vault.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible-Vault&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Para nosso caso estou criando um novo arquivo para preencher com as varíaveis e logo após estou populando as minhas variavéis que será usada posteriormente. Segue abaixo o exemplo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Create_File_Meraki_Vault_Vars.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após criação dois ítens estou criando a encriptação do arquivo através de uma senha que estou determinado no momento que executo essa ação. Veja abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Encrypt_File_Vault_Meraki_Vars.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para demonstrar estou abrindo o arquivo após a encriptação para consolidarmos que de fato esse arquivo foi codificado.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Edit_File_Vault_Meraki_Vars.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Logo após vocês poderiam perguntar. Como vou editar agora esse arquivo?&lt;/p&gt;&#xA;&lt;p&gt;   Se você observar acima eu posso editar ele normalmente utilizando minha senha, e posteriormente ele irá abrir como um arquivo texto normal, podendo ser editado e salvo da mesma forma que estavamos trabalhando anteriormente.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Vale ressaltar que se por algum motivo você esquecer essa senha, infelizmente você perdeu seu arquivo e terá que construi-ló novamente.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;lógica-do-playbook&#34;&gt;Lógica do Playbook&#xA;&lt;/h1&gt;&lt;p&gt;   Como havia informado incialmente vamos utilizar os módulo já populados para Ansible e disponivéis para consumir, pois os proprios fabricantes já desenvolvem para ajudar nesses quesitos. Caso queira saber todos os modulos para o Meraki pode consultar nesse &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html#meraki&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Como feito em outras playbooks que venho utilizando no Ansible, eu criei algumas estruturas para segmentar minhas &lt;em&gt;&lt;strong&gt;” tasks “&lt;/strong&gt;&lt;/em&gt;, e assim fazer as solicitações para ter um pouco mais controle e compreender em qual estado estou de minha playbook e interpretar em alguns momentos os erros que recebo. Segue a estrutura de pastas que criei para esse nosso primeiro exemplo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Tree_Playbook_Meraki.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h1 id=&#34;modulo-ansible&#34;&gt;Modulo Ansible&#xA;&lt;/h1&gt;&lt;p&gt;   Para esse primeiro exemplo escolhi trabalhar com o módulo &lt;strong&gt;” meraki_ssid “&lt;/strong&gt; para executar &lt;strong&gt;3 ações&lt;/strong&gt; que desejo fazer em meu equipamento &lt;strong&gt;” MR “&lt;/strong&gt;. Desta forma, vou criar um &lt;strong&gt;SSID novo&lt;/strong&gt;, &lt;strong&gt;deletar esse SSID&lt;/strong&gt; e posteriormente vou &lt;strong&gt;consultar&lt;/strong&gt; &lt;em&gt;” query “&lt;/em&gt; quais SSIDs estão configurados na minha organização.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Novamente, vale ressaltar que neste momento estou criando meu SSID com ítens básico, apenas para ser visualizado no portal, mas caso você queira adicionar mais configurações somente é necessário passar os paramêtros desejados.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;#&#34; &gt;Volte ao ínicio&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Logo abaixo temos nosso código relacionado ao arquivo ( &lt;strong&gt;meraki_basics.yaml&lt;/strong&gt; ) que será a playbook que irá solicitar todas as demandas baseadas nas opções que eu desejo executar na minha playbook.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: START CONFIGURATION&#xA;  hosts: localhost&#xA;  gather_facts: no&#xA;&#xA;  vars_prompt:&#xA;  - name: &amp;#34;action_ssid&amp;#34;&#xA;    prompt: &amp;#34;Please with action would you like to do?&#xA;             ( 1 ) - Add&#xA;             ( 2 ) - Delete &#xA;             ( 3 ) - Query&amp;#34;&#xA;    private: no&#xA;&#xA;  - name: &amp;#34;ssid_name&amp;#34;&#xA;    prompt: &amp;#34;Which SSID name will be (add) or (delete) or query (all)?&amp;#34;&#xA;    private: no&#xA;&#xA;  tasks:&#xA;  - name: DECRYPT KEYS&#xA;    include_vars: &amp;#34;./group_vars/auth_key_mer.yml&amp;#34;&#xA;    no_log: true&#xA;&#xA;  - name: GET INFO OF ORG&#xA;    include_role:&#xA;      name: get_info_org&#xA;    no_log: true&#xA;&#xA;  - name: GOING TO ADD SSID&#xA;    include_role:&#xA;      name: add_ssid&#xA;    when: action_ssid == &amp;#39;1&amp;#39;&#xA;&#xA;  - name: GOING TO DELETE SSID&#xA;    include_role:&#xA;      name: delete_ssid&#xA;    when: action_ssid == &amp;#39;2&amp;#39;&#xA;&#xA;  - name: GOING TO QUERY SSID&#xA;    include_role:&#xA;      name: query_ssid&#xA;    when: action_ssid == &amp;#39;3&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Feito isso, eu resolvi criar uma &lt;strong&gt;” task “&lt;/strong&gt; dedicada para eu obter todas as informações necessárias do dashboard para que posteriormente eu possa usar qualquer varíavel dentro de outras &lt;strong&gt;” task “&lt;/strong&gt;. Com isso eu tendo a variável registrada eu consigo obter qualquer variavel pois a estrutura de saída do comando já e formatado em &lt;strong&gt;JSON&lt;/strong&gt;. Segue o codigo relacionado ao arquivo ( &lt;strong&gt;get_info_org/tasks/main.yaml&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Query information about Organizations associated to the user&#xA;  meraki_organization:&#xA;   auth_key: &amp;#34;{{ auth_key_api }}&amp;#34;&#xA;   state: query&#xA;  delegate_to: localhost&#xA;  register: meraki_name&#xA;  no_log: true&#xA;&#xA;- name: List all networks associated to the Organization&#xA;  meraki_network:&#xA;   auth_key: &amp;#34;{{ auth_key_api }}&amp;#34;&#xA;   state: query&#xA;   org_name: &amp;#34;{{ meraki_name.data[0].name }}&amp;#34;&#xA;  delegate_to: localhost&#xA;  register: meraki_all_net&#xA;  no_log: true&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Talvez você me pergunte, porque você está usando &lt;strong&gt;” no_log: true”&lt;/strong&gt;? Isso deve-se justamente relacionados as informações que podem ser populadas através de uma funcionalidade de &lt;strong&gt;” verbose “&lt;/strong&gt; que poderiamos usar para visualizar as informações, mas abaixo você pode detectar que nada é mostrado:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Log_Playbook_Meraki_Organization.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Agora se você observar a saída do comando o qual ele pode trazer, e desta forma podemos filtrar especificamente o valor desejado para sua playbook a partir do momento que estou executando a playbook com &lt;strong&gt;” verbose “&lt;/strong&gt; e na minha task foi removido &lt;strong&gt;” no_log: true “&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/2019/11/Log_with_Values_Meraki.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Dando sequencia a nossa playbook iremos consolidar sobre inserção de um novo &lt;strong&gt;SSID&lt;/strong&gt;. Como vocês podem observar estou fazendo a execução desta task, baseado no que o usuario responde a partir do questionamento feito no inicio da playbook, ou seja, essa ação será executada se for preenchida com o &lt;strong&gt;” 1 “&lt;/strong&gt;. Para que eu possa inserir esse SSID estou colocando o estado como &lt;strong&gt;” present “&lt;/strong&gt;, assim ele irá escrever e colocar como &lt;strong&gt;” enable “&lt;/strong&gt; esse SSID no portal.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Adding SSID&#xA;  meraki_ssid:&#xA;    auth_key: &amp;#34;{{ auth_key_api }}&amp;#34;&#xA;    state: present&#xA;    org_name: &amp;#34;{{ meraki_name.data[0].name }}&amp;#34;&#xA;    net_name: &amp;#34;{{ meraki_all_net.data[0].name }}&amp;#34;&#xA;    name: &amp;#34;{{ ssid_name }}&amp;#34;&#xA;    enabled: true&#xA;  delegate_to: localhost&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Logo na sequencia temos o &lt;strong&gt;” delete “&lt;/strong&gt; que é a mesma função anterior, porém preciso colocar o estado como &lt;strong&gt;” absent “&lt;/strong&gt; e no modo &lt;strong&gt;” enable “&lt;/strong&gt; em falso.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Delete-Disable SSID&#xA;  meraki_ssid:&#xA;    auth_key: &amp;#34;{{ auth_key_api }}&amp;#34;&#xA;    state: absent&#xA;    org_name: &amp;#34;{{ meraki_name.data[0].name }}&amp;#34;&#xA;    net_name: &amp;#34;{{ meraki_all_net.data[0].name }}&amp;#34;&#xA;    name: &amp;#34;{{ ssid_name }}&amp;#34;&#xA;    enabled: false&#xA;  delegate_to: localhost&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   E para finalizar irei colocar uma demanda para fazer &lt;strong&gt;” query “&lt;/strong&gt; e fazer ele consultar todos os meus SSIDs configurados, criando assim um loop para ele varrer as variaveis e trazer se de fato o SSID esta habilitado ou desabilitado.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;#&#34; &gt;Volte ao ínicio&lt;/a&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Executing Query&#xA;  meraki_ssid:&#xA;    auth_key: &amp;#34;{{ auth_key_api }}&amp;#34;&#xA;    state: query&#xA;    org_name: &amp;#34;{{ meraki_name.data[0].name }}&amp;#34;&#xA;    net_name: &amp;#34;{{ meraki_all_net.data[0].name }}&amp;#34;&#xA;  with_items: data&#xA;  register: status&#xA;  delegate_to: localhost&#xA;&#xA;- debug: &#xA;   msg=&amp;#34;We found the SSID {{ status.results[0].data[item].name }} in your Meraki Dashboard and enable status is {{ status.results[0].data[item].enabled }} &amp;#34;&#xA;  loop: &#xA;    - 0&#xA;    - 1&#xA;    - 2&#xA;    - 3&#xA;    - 4&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;teste-da-playbook&#34;&gt;Teste da Playbook&#xA;&lt;/h1&gt;&lt;p&gt;   Após vocês entenderem a logica de programação, chegou a hora de verificar se fato está funcionando nossa ideia dentro do portal Meraki.&lt;/p&gt;&#xA;&lt;p&gt;   Neste primeiro teste estou executando como &lt;strong&gt;” ansible-playbook –ask-vault-pass meraki_basics.yaml “,&lt;/strong&gt; onde a demanda do &lt;strong&gt;” Vault “&lt;/strong&gt; é justamente para eu digitar minha senha e poder conseguir obter a variavel desejada que necessito para minhas próximas ações. &lt;/p&gt;&#xA;&lt;p&gt;   Logo abaixo pode observar que estou opção &lt;strong&gt;” 1 “&lt;/strong&gt; que irá adicionar um &lt;strong&gt;SSID&lt;/strong&gt; denominado como &lt;strong&gt;” Ansible “&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/2019/11/Executation_playbook_Meraki_ADD-SSID.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Agora vou consultar meu portal e consolidar se de fato ele populou meu novo SSID. Confira abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Dashboard_Meraki_SSID_Created.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;BINGO!!!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;   Próximo passo seria deletar esse mesmo SSID e consolidar o que vemos no portal.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2019/11/Executation_playbook_Meraki_DELETED-SSID.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Podemos observar que ele já foi removido do portal e por padrão sempre quando não temos o SSID configurado ele irá aparecer como &lt;strong&gt;” Unconfigured SSID x “&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/2019/11/Dashboard_Meraki_SSID_Deleted.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para finalizar vamos consolidar todos os nossos SSIDs configurado e habilitados em nosso Dashboard, utilizando nossa função de &lt;strong&gt;” Query “&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/2019/11/Executation_playbook_Meraki_QUERY-SSID.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Como observamos acima, imprimi todos as saídas para identificar o que temos em operação.&lt;/p&gt;&#xA;&lt;p&gt;   Depois de um longo post, chegamos ao final de mais uma ideia ou iniciativa para começar a manipular seus dados no portal Meraki via Ansible. O que vocês acharam? Vale a pena fazer um video para compartilhar os testes ou ficou bem compreendido?&lt;/p&gt;&#xA;&lt;p&gt;   O que vocês acham que poderiamos mudar nesse código ou o que vocês gostariam que eu demonstrasse para vocês?&lt;/p&gt;&#xA;&lt;p&gt;   Deixe seus comentários, pois esse BLOG é construído para todos.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Palestras no VMworld 2018</title>
            <link>https://ciscoredes.com.br/2018/10/15/ansible-palestras-no-vmworld-2018/</link>
            <pubDate>Mon, 15 Oct 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/10/15/ansible-palestras-no-vmworld-2018/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_network_cli_netconf_access.jpg&#34; alt=&#34;Featured image of post Ansible – Palestras no VMworld 2018&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Eu estava devendo para vocês sobre minha palestra executada no &lt;strong&gt;VMware{code}&lt;/strong&gt;, a qual estava disponível apenas na pagina do Facebook. &lt;/p&gt;&#xA;&lt;p&gt;   Enfim, as palestras agora foram disponibilizadas no &lt;strong&gt;Youtube&lt;/strong&gt; ( &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/channel/UC8HeWUOGOc1EVHl0fALuNlQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;segue o canal&lt;/a&gt; ), para qual fica um pouco mais facil para que possamos compartilhar. Apenas como lembrete, essa palestra foi de 30 minutos, onde no final acabo demostrando um video que havia gravado para apresentar, pois não tive recursos para usar a estrutura planejada para executar a demo. Segue nossa video, espero que vocês gostem.&lt;/p&gt;&#xA;&lt;p&gt;   Para concluir e deixar populado apenas em um post, segue abaixo nossa palestra executada no vBrownBag que eu já havia compartilhando aqui, porém para ficar mais unificado vou adicionar abaixo. Vale lembrar, que essa sessão foi de 15 minutos, apenas para introduzir sobre o assunto.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Cisco – Divulgação de Código para Comunidade</title>
            <link>https://ciscoredes.com.br/2018/09/19/cisco-divulgacao-de-codigo-para-comunidade/</link>
            <pubDate>Wed, 19 Sep 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/09/19/cisco-divulgacao-de-codigo-para-comunidade/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/Cisco_Code_Exchange_Announcement.png&#34; alt=&#34;Featured image of post Cisco – Divulgação de Código para Comunidade&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/Cisco_Code_Exchange_Announcement.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 todos já devem estar acompanhando os esforços da Cisco em cada vez mais publicar e facilitar essa transição que estamos vivendo de nossa famosa função ” &lt;strong&gt;Network Engineer&lt;/strong&gt; ” para uma cultura um pouco mais abragente de que não devemos apenas ser um ” &lt;strong&gt;Native CLI&lt;/strong&gt; “, e sim ter algumas mãos espalhadas em outras áreas como a de ” &lt;strong&gt;Developer&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Talvez muita gente pode se perguntar ou em vários momentos já entraram em discussões com amigos, professores, chefe, vizinho, etc se nós profissionais da área de Redes devem aprender programação. O que vocês acham?  💡 &lt;/p&gt;&#xA;&lt;p&gt;   Vou dar minha opinião ( &lt;em&gt;vocês podem concordar ou discordar&lt;/em&gt; ) daquilo que estou vivenciando, bem como o que vocês estão acompanhando no BLOG do que venho apresentando/estudando. De fato, a função de ” &lt;strong&gt;Network Engineer&lt;/strong&gt; ” não vai sumir do mercado e lógico que a função como qualquer outra do mercado de tecnologia ela precisa ir adapatando-se aquilo que estamos trabalhando, ou seja, de fato precisamos acrescentar maiores “ &lt;strong&gt;skills&lt;/strong&gt; ” em nossa função, o qual hoje ela deseja que tenhamos esse conhecimento de programação, mas não se desespere você não precisa ser um ” &lt;strong&gt;Expert&lt;/strong&gt; ” em programação, e sim ter um raciocionio lógico para saber utilizar as facilidades que a programação oferece hoje dentro do mercado e a facilidade que os equipamentos estão oferecendo para que você execute desta forma. &lt;/p&gt;&#xA;&lt;p&gt;   Eu imagino que você possa ter outra percepção, da qual pode imaginar que seu conhecimento adquirido ao longo dessa carreira ou de estudo estão perdendo-se. Novamente volto ao ponto da função de ” &lt;strong&gt;Network Engineer&lt;/strong&gt; ” que ela não vai sumir do mercado, e sim estamos nos adaptando ao mercado, pois o que adianta você saber programar mas não entender como um protocolo de roteamento funcione, ou vice-versa. &lt;/p&gt;&#xA;&lt;p&gt;   Com isso gostaria divulgar um ítem na qual a Cisco esta agrupando alguns códigos que são desenvolvidos em varias plataformas ( &lt;em&gt;especial Github&lt;/em&gt; ) e trazendo isso para dentro do programa que ela denominou como ” &lt;a class=&#34;link&#34; href=&#34;https://developer.cisco.com/codeexchange/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Code Exchange&lt;/strong&gt;&lt;/a&gt; “. Isso caracteriza que diversos desenvolvedores e colaboradores podem aplicar seu código para dentro dessa plataforma, na qual ele é validado e algumas características são equalizadas para ele possa ser demonstrado nesta plataforma. Como já venho trabalhando em uma situação que acho bem interessante e que pode ajudar algumas pessoas no dia a dia, eu apliquei meu código ( &lt;em&gt;já disponibilizado no github&lt;/em&gt; ) e de fato ele foi aprovado e já pode ser visualizado na página. Se quiser visualizar página acesse &lt;a class=&#34;link&#34; href=&#34;https://developer.cisco.com/codeexchange/github/repo/rarodrigo/router_family&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;aqui&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/2018/09/My_code_Site_Cisco_Developer_exchange.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Bom, o quero demonstrar aqui é que você que esta desenvolvendo códigos para melhorar seu dia a dia e queira publicar ( &lt;em&gt;se for permitido&lt;/em&gt; ) pode utilizar essa plataforma, bem como também poderemos ter mais pessoas que podem colaborar para seu projeto tendo mais idéias e ajudando a crescer cada vez mais essa facilidade que temos hoje em dia.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e deixe seus comentário abaixo do que você pensa sobre esse tópico.  Nós proximos vou trazer mais idéias sobre esse movimento.  😆 &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;/p&gt;&#xA;&lt;p&gt;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>VMworld 2018 – Day 3 – Quarta Feira</title>
            <link>https://ciscoredes.com.br/2018/09/03/vmworld-2018-day-3-quarta-feira/</link>
            <pubDate>Mon, 03 Sep 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/09/03/vmworld-2018-day-3-quarta-feira/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/07/vmworld-2018.jpg&#34; alt=&#34;Featured image of post VMworld 2018 – Day 3 – Quarta Feira&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Estamos praticamente na metade de nosso evento e sinceramente hoje foi o dia onde as empresas finalizaram suas notificações sobre as novidades que eles planejam lançar dentro do VMworld. Inclusive hoje já temos a festa de encerramento do VMworld patrocinada pela VMware.&lt;/p&gt;&#xA;&lt;p&gt;   O que eu consegui capturar hoje de novidade está relacionado a&lt;a class=&#34;link&#34; href=&#34;https://www.veeam.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; Veeam&lt;/a&gt;, para qual a sessão foi focada em novidades da integração do Veeam com a Cloud que virão no Update 4. Uma delas será a possibilidade de fazer restore diretamente para a AWS com uma estimativa de custo diretamente no console do Veeam. Para quem não conhece a empresa recomendo entrar no website informado acima, porém é uma empressa que está crescendo bastante e o foco principal deles é trabalhar com o gerenciamento de seus dados ( backup, recovery, otimização da replicação, backup em nuvem , etc ).&lt;/p&gt;&#xA;&lt;p&gt;   Em minha próxima sessão fui assistir ” &lt;em&gt;To Infrastructure and Beyond: Infrastructure as Code with VMware&lt;/em&gt; “, na qual minha intenção é entender sobre a denominação de ” &lt;strong&gt;DevOps&lt;/strong&gt; “. Pelo meu entendimento a ideia é que você tenha um portal (&lt;a class=&#34;link&#34; href=&#34;https://cloud.vmware.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; ferramenta VMware&lt;/a&gt; ) hospedada em nuvem, para que você possa executar suas tarefas através de um dashboard onde ele já traz algumas facilidades para fazer seu gerenciamento e criação de tarefas diárias muito mais rápida e simples. Nesse caso demonstraram a criação de uma pagina WordPress para subir isso rapidamente dentro de sua infraestrutura. Segue alguns slides capturados.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/VMworld_2018_-Session_Infra_as_code.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/2018/09/VMworld_2018_-Session_Infra_as_code_2.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/2018/09/VMworld_2018_-Session_Infra_as_code_3.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Se quiser executar testes a recomendação passada foi para que você criei um acesso através do site ( &lt;a class=&#34;link&#34; href=&#34;https://console.cloud.vmware.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://console.cloud.vmware.com&lt;/a&gt; ), e verifique as possibilidades em fazer suas tarefas. Alguns laboratório do HOL também acabam dando referência e até executando algumas configurações dentro deste ambiente. Vale a pena conferir.&lt;/p&gt;&#xA;&lt;p&gt;   Após isso fui diretamente no ” &lt;em&gt;&lt;strong&gt;Solution Exchange&lt;/strong&gt;&lt;/em&gt; ” no estande da &lt;strong&gt;Red Hat&lt;/strong&gt;, para conversar com os especialista e obviamente fui capturar maiores informações sobre Ansible. De fato o que eles trouxeram para o evento foi a demonstração do &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/products/tower&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible Tower&lt;/a&gt;, e as demandas para configuração como demo do &lt;strong&gt;VSphere&lt;/strong&gt;. Novidades ainda não temos muitas em relação ao desenvolvimento, mas como já venho acompanhando eles mencionaram que a parceira com as empresas está crescendo bastante e a idéia que os modulos possam aumentar em cada nova atualização tanto do Tower como do Ansible ( engine de orquestração ). Um ítem citado e também para reforçar que em &lt;strong&gt;Outubro ( 2 à 3 )&lt;/strong&gt; teremos o&lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/ansiblefest&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; &lt;strong&gt;AnsibleFest&lt;/strong&gt;&lt;/a&gt;, onde é a conferência de encontro dos profissionais, bem como também eles prometem lançar mais alguma novidade. Para quem não puder ir, ele também será transmitido online. &lt;/p&gt;&#xA;&lt;p&gt;   Em linhas gerais para mim não teve muitas novidades falando-se de Ansible, pois está sendo um assunto que estou acompanhando bem de perto, porém foi interessante conversar com as especialistas e trocar algumas experiências.&lt;/p&gt;&#xA;&lt;p&gt;   Para completar meu dia consegui encontrar no evento, nada mais que &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/in/ccie10044/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Neil Moore&lt;/a&gt; ( &lt;strong&gt;8xCCIE, CCDE&lt;/strong&gt; ), uma lenda dentro do modelo de certificações Cisco, onde fui encontrar ele no LABS do HOL, o qual ele estava trabalhando e suportando casos do evento. Foi um bate papo muito interessante onde ele contou um pouco sobre sua carreira, demandas e apresentações que ele estava executando no VMworld, onde espero futuramente escrever um pouco sobre esse bate papo. Segue a selfie como comprovação.  😀 &lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/VMworld_2018_Neil_Moore.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;   Continue seguindo nosso BLOG, que maiores informações serão publicadas. &lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>VMworld 2018 – Day 4 – Quinta feira</title>
            <link>https://ciscoredes.com.br/2018/09/03/vmworld-2018-day-4-quinta-feira/</link>
            <pubDate>Mon, 03 Sep 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/09/03/vmworld-2018-day-4-quinta-feira/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/2018-08-30-14.26.13.jpg&#34; alt=&#34;Featured image of post VMworld 2018 – Day 4 – Quinta feira&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Hoje venho aqui para dizer que é meu último dia no evento da &lt;strong&gt;VMware ( VMworld )&lt;/strong&gt;, e posso declarar que eu aproveitei bastante essa energia, com certeza fiz muitos amigos e também aprendi muita coisa. Mas tudo precisa ter um fim para que possamos ter outro recomeço, então para quem pensa em planejamento no ano de 2019 esse evento será na cidade de ” &lt;strong&gt;San Francisco&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   No ultimo dia, área onde ficavam os expositores já ficam fechadas, pois as 14hs de fato o evento encerra, então neste dia temos área onde ficam os telões, área relaxamento, área de bloggers e ainda algumas sessões acontecem no &lt;strong&gt;VMTN Village&lt;/strong&gt; e também na área de ” &lt;strong&gt;Education Services&lt;/strong&gt; ” que está atrelada ao segmento de certificações VMware, porém neste espaço aconteceram diferentes palestras.&lt;/p&gt;&#xA;&lt;p&gt;   Hoje é um dia mais tranquilo, mas também foi um dia importante e ansioso, pois eu apresentei minha palestra sobre “ &lt;strong&gt;Starting Engineering inside Ansible&lt;/strong&gt; ” no &lt;strong&gt;VMware{code}&lt;/strong&gt;. No inicio do dia acabei ficando mais no vBrownBag, assistindo as sessões e vários assuntos foram abordados falando-se bastante de vSphere.&lt;/p&gt;&#xA;&lt;p&gt;   Por volta das 12:45PM ( USA Time ) e no Brasil 16:45PM eu apresentei minha palestra. De fato foi uma experiência muito boa e satisfatória, pois consegui repassar para o pessoal um conteúdo interessante e dando uma visibilidade de como nós Engenheiros, podemos iniciar aprendendo um pouco desse mundo de ” &lt;strong&gt;Automation&lt;/strong&gt; ” no universo de Networking. O feedback depois da sessão foi positivo, pois tivemos varias pessoas perguntando após a palestra, com isso acredito que fiz meu papel de despertar o interesse em alguns para iniciar no mundo ” &lt;strong&gt;NetDevOps&lt;/strong&gt; “. Essa palestra foi apresentada no ” &lt;strong&gt;Facebook Live&lt;/strong&gt; ” e até esse momento ela não foi publicada no YouTube. Assim que eu receber a notificação volto a divulgar para vocês que não conseguiram acompanhar no dia.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/09/2018-08-30-14.26.13.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/2018/09/2018-08-30-14.26.16.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Mas para não deixar a todos ansiosos sobre o conteúdo, vou carregar em nossa área de ” &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/arquivos/&#34; &gt;Arquivos&lt;/a&gt; ” os slides que apresentei para o pessoal no dia.   &lt;/p&gt;&#xA;&lt;p&gt;   Para finalizar um resumo que recebemos relacionado a esses 4 dias de evento. O que acham?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;300+ customers certified&lt;/li&gt;&#xA;&lt;li&gt;10,000+ hands-on labs completed&lt;/li&gt;&#xA;&lt;li&gt;800 sessions (with more than 160 at maximum capacity)&lt;/li&gt;&#xA;&lt;li&gt;61,000+ social media posts with the hashtag #vmworld (so far!)&lt;/li&gt;&#xA;&lt;li&gt;7,200+ attendees at the VMworld Fest&lt;/li&gt;&#xA;&lt;li&gt;5 Elvis impersonators spotted&lt;/li&gt;&#xA;&lt;li&gt;3,000 VMware 20th birthday cupcakes consumed&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;   Fiquem ligados em nosso BLOG!!! Juntos somos melhores. 🙂&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Introdução Ansible – VBrownBag Brasil</title>
            <link>https://ciscoredes.com.br/2018/07/20/introducao-ansible-vbrownbag-brasil/</link>
            <pubDate>Fri, 20 Jul 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/07/20/introducao-ansible-vbrownbag-brasil/</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 Introdução Ansible – VBrownBag Brasil&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Não sei se todos acompanharam os dois episódios que executamos no &lt;strong&gt;vBrownBag Brasil&lt;/strong&gt; falando um pouco sobre Ansible.&lt;/p&gt;&#xA;&lt;p&gt;  Se você não conseguiu acompanhar, eles estão populados no proprio canal do &lt;strong&gt;YouTube&lt;/strong&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/vbrownbagbrasil&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt; vBrownBag Brasil&lt;/a&gt; ) e a ideia desses dois capítulos foi inicialmente focar um pouco na introdução do Ansible e obviamente trazer os conceitos que estão sendo abordados para área de Networking. Segue abaixo os dois episódios:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Parte 1&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Parte 2&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;   Espero que gostem 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 – 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 – Loop com Validação de Variáveis – Parte 4</title>
            <link>https://ciscoredes.com.br/2018/04/26/ansible-loop-com-validacao-de-variaveis-parte-4/</link>
            <pubDate>Thu, 26 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/04/26/ansible-loop-com-validacao-de-variaveis-parte-4/</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 – Loop com Validação de Variáveis – Parte 4&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Esse post acabou surgindo depois de discussões em nosso foruns, mais especificamente no &lt;strong&gt;Telegram&lt;/strong&gt;, onde eu já havia feito essa alteração mas acabei não detalhando em nosso &lt;strong&gt;BLOG&lt;/strong&gt;, sobre essa possível alteração e de que forma poderia ser feito dentro de nossa estrutura de playbook para o Ansible.&lt;/p&gt;&#xA;&lt;p&gt;   Como já mencionado em nossos posts, inúmeras ideias podem surgir baseado na necessidade de seu ambiente e lógicas para cada tipo de configuração, portanto explorar as ideias são sempre bem vindas. Enfim, o que gostaria de agregar aqui nesse post seria sobre uma hipótese de precisarmos fazer uma validação de algum &lt;strong&gt;ID&lt;/strong&gt; de loopback para que possamos amarrar a nossa base externa.&lt;/p&gt;&#xA;&lt;p&gt;   Pensando nesse item e respondendo ao questionamento, é possivel. Com isso iremos fazer atualização em nosso arquivo de teste ( &lt;strong&gt;.csv&lt;/strong&gt; ) definindo variáveis ( &lt;em&gt;&lt;strong&gt;x e y&lt;/strong&gt;&lt;/em&gt; ) para popular em nosso exemplo de amarração com loopback ID ( &lt;strong&gt;12 e 13&lt;/strong&gt; ).&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,ip_loopback_x,mask_loopback_x,ip_loopback_y,mask_loopback_y&#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,2.2.2.2,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,3.3.3.3,255.255.255.255,5,5&#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,1,2,5.5.5.5,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,1,2,5,5&#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,1,2,5,5&#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,1,2,5,5&#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,1,2,5,5&#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,1,1,5.5.5.5,255.255.255.255&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Obs.:&lt;/strong&gt; Vocês podem achar que estou louco &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;, mas na verdade estou somente jogando valores ficticios nas variaveis definidas como IP Address de loopback, para que possamos de fato validar automação, então não se espante com esses IPs.&lt;/p&gt;&#xA;&lt;p&gt;   Para comparar os IDs ( &lt;strong&gt;12 e 13&lt;/strong&gt; ) adicionei eles em nosso arquivo ( &lt;strong&gt;/group_vars/all.yml&lt;/strong&gt; ).&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;&#xA;cisco_881_l2_interfaces:&#xA;  - FastEthernet0&#xA;  - FastEthernet1&#xA;  - FastEthernet2&#xA;  - FastEthernet3&#xA;&#xA;loopback_id:&#xA;  - 5&#xA;  - 6&#xA;  - 7&#xA;  - 10&#xA;  - 11&#xA;  - 12&#xA;  - 13&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso agora já preparei minha base ( &lt;strong&gt;.csv&lt;/strong&gt; ) e minha variáveis para que agora eu possa montar minha condição obviamente dentro de meu arquivo Jinja2, usando as condições de ” &lt;em&gt;&lt;strong&gt;if, elif  e else&lt;/strong&gt;&lt;/em&gt; “. Segue alteração de nosso jinja template.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!&#xA;{% for loopback in loopback_id %}&#xA;{% if loopback == 12 %}&#xA;interface loopback {{loopback}}&#xA;  ip address {{ vars_from_csv.ip_loopback_x }} {{ vars_from_csv.mask_loopback_x }}&#xA;  no shutdown&#xA;!&#xA;{% elif loopback == 13 %}&#xA;interface loopback {{loopback}}&#xA;  ip address {{ vars_from_csv.ip_loopback_y }} {{ vars_from_csv.mask_loopback_y }}&#xA;  no shutdown&#xA;!&#xA;{% else %}&#xA;interface loopback {{loopback}}&#xA;  ip address {{ vars_from_csv.ip_loopback }} {{ vars_from_csv.mask_loopback }}&#xA;  no shutdown&#xA;!&#xA;{% endif %}&#xA;{% endfor %}&#xA;!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Vocês podem observar que estou criando condições de se coincidir com o ID escrevo isso, caso contrario coincidir com o ID&lt;strong&gt;y&lt;/strong&gt; escrevo aquilo e por fim execute isso.&lt;/p&gt;&#xA;&lt;p&gt;   Dentro desse contexto estou comparando meu &lt;strong&gt;ID&lt;/strong&gt; com o valor quero propagar em meu script e obviamente exportar para meu futuro device.  😉 &lt;/p&gt;&#xA;&lt;p&gt;   Agora como desafio e ideias que vocês podem adicionar em nossos comentários, vocês já imaginaram de que forma também eu poderia agregar se eu consolidar o script comparando familias de equipamentos ( 881, 1941, etc ) para após isso montar meu template? E se em meu arquivo de base externa ( &lt;strong&gt;.csv&lt;/strong&gt; ) eu não tiver com uma variável preenchida o que irá acontecer? Posso remediar?&lt;/p&gt;&#xA;&lt;p&gt;   Aguardo os comentários e claro depois de nossas discussões coloco meus exemplos/ideias para esses problemas.&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Nova Versão Disponível – 2.5</title>
            <link>https://ciscoredes.com.br/2018/04/03/ansible-nova-versao-disponivel-2-5/</link>
            <pubDate>Tue, 03 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/04/03/ansible-nova-versao-disponivel-2-5/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_new_version_2_5.jpg&#34; alt=&#34;Featured image of post Ansible – Nova Versão Disponível – 2.5&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2018/03/ansible_new_version_2_5.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;   Conforme eu havia mencionado em nosso &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/11/24/ansible-modulo-networking/&#34; &gt;post sobre a nova versão&lt;/a&gt; que estaria disponível em março conforme o ” &lt;strong&gt;roadmap&lt;/strong&gt; ” informado, e de fato podemos observar que o release foi liberado na data prevista. &lt;/p&gt;&#xA;&lt;p&gt;   Nesse link você pode observar que temos uma documentação definida como ” &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/devel/roadmap/ROADMAP_2_5.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;devel&lt;/a&gt; “, bem como pode observar os ítens prometidos e executados pelo time para ser disponibilizado nesse versão.&lt;/p&gt;&#xA;&lt;p&gt;   Entretanto já tinhamos um post escrito pelo time em Fevereiro já detalhando sobre as alterações mais importantes para nossa área de Networking. Isso pode ser consultado através desse &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/blog/coming-soon-networking-features-in-ansible-2.5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Porém, para trazer um resumo e um dos fatores mais importantes que podemos detalhar aqui é a maneira que podemos tratar agora para acessar os equipamentos de rede, trazendo uma flexibilidade muito maior e dinamismo. Vocês podem observar em nossos posts que sempre estavamos utilizando ” &lt;strong&gt;connection: local&lt;/strong&gt; “, porém agora teremos mais duas funções ” &lt;strong&gt;network_cli&lt;/strong&gt; e &lt;strong&gt;netconf&lt;/strong&gt; “. Esse desenho mostra essas alterações bem como os exemplos já explicados no link informado acima.&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_network_cli_netconf_access.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso observamos como o código é executado dentro de nosso ” &lt;strong&gt;control node&lt;/strong&gt; “, fora que novos modulos foram adicionados como do fabricante Infoblox, para qual já existe facilidades para trabalhar com essa ferramenta.&lt;/p&gt;&#xA;&lt;p&gt;   Enfim, vale a pena ler a documentação para entender as mudanças nessa versão e obviamente já fiz minha atualização para fazer agora alguns testes baseando-se em ” netconf “. Aguardem!!! &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_version_2_5_updated.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Abs,&lt;br&gt;&#xA;Rodrigo&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Ansible – Loop de Variáveis usando Jinja2 – Parte 3</title>
            <link>https://ciscoredes.com.br/2018/04/02/ansible-loop-de-variaveis-usando-jinja2-parte-3/</link>
            <pubDate>Mon, 02 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2018/04/02/ansible-loop-de-variaveis-usando-jinja2-parte-3/</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 – Loop de Variáveis usando Jinja2 – Parte 3&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Baseado em nossos posts anteriores explicando sobre implementação de arquivos de configuração utilizando loops e dados capturados via uma base externa, hoje venho aqui para que possamos finalizar nosso conteúdo trazendo de fato nosso loop com as variavéis sendo inseridas em nosso arquivo de ” &lt;strong&gt;vars&lt;/strong&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Como vocês observaram nos posts anteriores nosso arquivo incluido no “ &lt;strong&gt;group_vars/all.yml&lt;/strong&gt; ” será alterado para que possamos agora inserir mais duas variáveis que iremos trabalhar para gerar nosso loop. Esses exemplos de fato são para que eu possa demonstrar, mas podemos pensar em varias situações onde seria interessante trabalhar criando essas interfaces ou definindo posteriormente VLANs. Segue o arquivo completo:&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;&#xA;cisco_881_l2_interfaces:&#xA;  - FastEthernet0&#xA;  - FastEthernet1&#xA;  - FastEthernet2&#xA;  - FastEthernet3&#xA;&#xA;loopback_id:&#xA;  - 5&#xA;  - 6&#xA;  - 7&#xA;  - 10&#xA;  - 11&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Com isso populado em nosso arquivo, agora teremos que alterar nosso template ( &lt;strong&gt;jinja2&lt;/strong&gt; ) para inserir nosso loop com o intuito de varrer essas variáveis e criar nosso template de configuração. Nossa alteração será executada no “ &lt;strong&gt;template/script.j2&lt;/strong&gt; “.&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;{% for interface in cisco_881_l2_interfaces %}&#xA;interface {{interface}}&#xA; switchport access vlan 10&#xA; spanning-tree portfast&#xA;!&#xA;{% endfor %}&#xA;{% for loopback in loopback_id %}&#xA;interface loopback {{loopback}}&#xA;  ip address {{ vars_from_csv.ip_loopback }} {{ vars_from_csv.mask_loopback }}&#xA;  no shutdown&#xA;!&#xA;{% endfor %}&#xA;!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como vocês podem observar estou trabalhando com a função “ &lt;strong&gt;for&lt;/strong&gt; ” que é o argumento para gerarmos o loop até que exista essa variável populada em nosso arquivo, ou seja, essa função somente sairá do loop ” &lt;strong&gt;endfor&lt;/strong&gt; ” se todos os ítens forem verificados, como consequência ele irá seguir para o próximo loop para executar a função das loopbacks, tendo como lógica a mesma explicada acima. &lt;/p&gt;&#xA;&lt;p&gt;   Após essas alterações podemos executar nossa playbook para que possamos avaliar se irá executar da forma que planejamos. Gostaria de lembrar que estamos criando esse template via uma base externa ( &lt;strong&gt;csv&lt;/strong&gt; ) e também geramos ítens adicionais que de fato podem ser exemplificados como melhorias de algum template que precise criar que de alguma forma ele não foi demonstrado ou manipulado pelo arquivo csv.&lt;/p&gt;&#xA;&lt;p&gt;   Segue aqui a menção que obtivemos com alteração ( &lt;strong&gt;change&lt;/strong&gt; ) em todos os elementos do inventário.&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_change_file_jinja2.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Para consolidarmos nossas alterações vamos observar nossos arquivos, não esquecendo que ainda continuamos fazendo as alterações ( true e false ) da configuração do DHCP normalmente, bem como trabalhando com os valores deles mesmo dentro de nosso loop, ou seja, depois de estruturado nossos dados podemos utiliza-lo diferentes formas.&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;&lt;strong&gt;Template Router 1&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;Template Router 2&lt;/strong&gt;&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   !   interface FastEthernet0   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet1   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet2   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet3   switchport access vlan 10   spanning-tree portfast   !   interface loopback 5   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 6   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 7   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 10   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 11   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   !   interface FastEthernet0   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet1   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet2   switchport access vlan 10   spanning-tree portfast   !   interface FastEthernet3   switchport access vlan 10   spanning-tree portfast   !   interface loopback 5   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 6   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 7   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 10   ip address 10.10.10.1 255.255.255.255   no shutdown   !   interface loopback 11   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;   Vocês podem observar que todas as loopbacks estão com o mesmo endereço IP, porém estou apenas demonstrando as possibilidades de trabalhar com esses valores e se for utilizar em seu ambiente de produção você terá que adequar suas variáveis/valores.&lt;/p&gt;&#xA;&lt;p&gt;   Pessoal espero que vocês tenham gostado dessa série, porque eu gostei muito de trabalhar com essas possibilidades e ao mesmo tempo empolgado pois podemos observar o potencial que temos em nossas mãos para começar a trabalhar com automações e dinamismo em nossas estruturas. &lt;/p&gt;&#xA;&lt;p&gt;   Se você acha que podemos evoluir nesse projeto acompanhe no meu GitHub e dê suas sugestões e se também acredita que gostaria de trazer mais exemplos aqui deixe seu comentário. &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ção – Parte 2</title>
            <link>https://ciscoredes.com.br/2017/10/26/ansible-validacao-de-configuracao-parte-2/</link>
            <pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/10/26/ansible-validacao-de-configuracao-parte-2/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/10/Ansible_running_intended_user_created_IOS.jpg&#34; alt=&#34;Featured image of post Ansible – Validação de Configuração – Parte 2&#34; /&gt;&lt;p&gt;Olá Pessoal,&lt;/p&gt;&#xA;&lt;p&gt;   Conforme em nosso post &lt;a class=&#34;link&#34; href=&#34;https://ciscoredes.com.br/2017/10/23/ansible-validacao-de-configuracoes/&#34; &gt;anterior&lt;/a&gt;, hoje iremos tratar de um outro parâmetro, com o intuito de fazer validação das configurações em nossos equipamentos Cisco. &lt;/p&gt;&#xA;&lt;p&gt;   Baseando-se em nossas menções a configuração que iremos “&lt;em&gt;confrontar&lt;/em&gt;” será a diferença que temos na “&lt;em&gt;running-config&lt;/em&gt;” com nosso arquivo base ( &lt;strong&gt;intended&lt;/strong&gt; ), ou seja, nesse post iremos agora mostrar o que temos de comandos adicionais na configuração que não esta presente em nosso arquivo padrão.&lt;/p&gt;&#xA;&lt;p&gt;   Vale lembrar que essa comparação será linha à linha, ou seja, para que isso faça mais sentido o ideal que você já tenha um template padrão de sua infra-estrutura aplicado para seus equipamentos, bem como, já tenha um histórico de armazenamento de configurações para começar a “&lt;em&gt;confrontar&lt;/em&gt;” as configuração. É claro, que se você não tem, o importante é iniciar seu processo para backup de configuração ou criar políticas para que esse processo entre em produção, assim posteriomente, você pode revalidar suas configurações com o desejo de encontrar algo que foi alterado e que não deveria.  😉 &lt;/p&gt;&#xA;&lt;p&gt;   Enfim, vamos ao nosso playbook onde iremos criar a validação. Devido ao teste eu acabei criando um processo anterior nesse script, baseando-se em configurações já apresentadas em posts anteriores sobre criação do “&lt;em&gt;running-config&lt;/em&gt;“, devido a isso, eu apenas importei esse script para nosso playbook com a intenção de conseguir criar o arquivo inicial, e após isso, criar duas situações para comparar o antes e depois da mudança em nossa configuração do roteadore CSR1000V.&lt;/p&gt;&#xA;&lt;p&gt;   Segue abaixo nossa playbook&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: Capture running-config&#xA;    ios_command:&#xA;     provider: &amp;#34;{{ provider }}&amp;#34;&#xA;     commands:&#xA;        - show running-config&#xA;    register: running&#xA;    &#xA;  - name: Check that file exist&#xA;    stat:&#xA;      path: /home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt&#xA;    register: result_file&#xA;&#xA;  - name: Save output running-config&#xA;    copy:&#xA;      content: &amp;#34;{{ running.stdout[0] }}&amp;#34;&#xA;      dest: &amp;#34;/home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt&amp;#34;&#xA;    when: result_file.stat.exists == False&#xA;&#xA;  - name: Compare running-config with intended file&#xA;    ios_config:&#xA;      diff_against: intended&#xA;      provider: &amp;#34;{{ provider }}&amp;#34;&#xA;      intended_config: &amp;#34;{{ lookup(&amp;#39;file&amp;#39;, &amp;#39;/home/rodrigo/Documents/ansible/IWAN Project/backup/{{ inventory_hostname }}_running.txt&amp;#39;) }}&amp;#34;&#xA;    register: test_diff&#xA;&#xA;  - name: Take running-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 intended_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 intended_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 intended_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;   No primeiro momento vocês podem observar que minha pasta não contém o arquivo, pois é a primeira vez que irei executar minha playbook. Após executar, vocês podem observar que tenho a mensagem de “ &lt;em&gt;change&lt;/em&gt; ” em nosso “ &lt;em&gt;log&lt;/em&gt; ” e consequentemente vamos observar que foi populado um novo arquivo em nosso servidor local ( &lt;strong&gt;ansible server&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/10/Ansible_output_running_intended_file_created.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;   Após criação de nosso arquivo, nesse momento é efetuado alteração em meu roteador ( &lt;strong&gt;running-config&lt;/strong&gt; ) criando um usuário adicional, para que assim possamos validar as diferenças de configurações que existem entre nossas bases. 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_running_intended_user_created_IOS.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso vocês agora podem observar que foi criado uma lógica de validação em relação ao meu arquivo de configuração ( &lt;strong&gt;running-config&lt;/strong&gt; ), para que após a execução pela primeira vez da running-config ele não fique sobrescrevendo meu arquivo, para que desta forma, ela seja, minha configuração base ( &lt;strong&gt;intended&lt;/strong&gt; ) que vou comparar posteriormente com o running-config. Abaixo você pode observar que existe uma ação ( skipping ) que é o momento de validação do arquivo existente, sendo que minha váriavel agora é ” &lt;em&gt;True&lt;/em&gt; ” devido a isso minha tarefa em nossa playbook, não sera de fato executada ( &lt;strong&gt;gravar um novo arquivo&lt;/strong&gt; ).&lt;/p&gt;&#xA;&lt;p&gt;   Podemos também observar outras ações que estão ocorrendo que é justamente as menções de diferenças entre os arquivos, que é demonstrador através do ” &lt;em&gt;before&lt;/em&gt; ” e “ &lt;em&gt;after&lt;/em&gt; “. Para que vocês possam entender o que representa &lt;a class=&#34;link&#34; href=&#34;https://unix.stackexchange.com/questions/81998/understanding-of-diff-output&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;output em azul trazendo numeros é simbolo é recomendado que visualize esse link&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/10/Ansible_output_running_intended_final.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;   Após todo essa validação o ideal que você faça as comparações do antes e depois de forma mais prática para seu output, pois, você pode obter linhas que de fato são adicionais em seu output, mas que de fato não foram alteradas. Devido a isso, foi necessário criar uma revalidação e ” &lt;em&gt;sanitizar&lt;/em&gt; ” output utilizando as variáveis “ &lt;em&gt;before&lt;/em&gt; ” e ” &lt;em&gt;after&lt;/em&gt; ” para que possamos no final visualizar somente a linha que eu adicionei no running-config. Com esse output podemos concluir que de fato agora tenho uma alteração em meu equipamento que não deveria estar contido nele.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que esse playbook possa dar um dinamismo maior para sua infra, na qual você precisa validar se algo foi alterado ( &lt;strong&gt;change&lt;/strong&gt; ) em seu equipamento e que de fato posso ter impactado algum incidente reportado posteriomente sua change. Vale lembra que aqui estamos fazendo os testes em apenas 1 equipamento para qual a ideia é que isso possa ser escalonado dentro de seu ambiente.  😀 &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 via Cisco Spark</title>
            <link>https://ciscoredes.com.br/2017/09/25/ansible-notificacao-via-cisco-spark/</link>
            <pubDate>Mon, 25 Sep 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/09/25/ansible-notificacao-via-cisco-spark/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/Cisco-Spark.png&#34; alt=&#34;Featured image of post Ansible – Notificação via Cisco Spark&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/Cisco-Spark.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 trazendo em nosso BLOG as diretrizes do Ansible e as metodologias que ele traz para entrarmos de cabeça no &lt;strong&gt;DevOps&lt;/strong&gt;, ou seja, hoje vou trazer uma outra ferramenta na intenção de criarmos interação entre elas, e assim, se obter de benefícios que possa trazer para nosso dia a dia, ou de idéias que possa oferecer para você trabalhar em seu dia a dia.&lt;/p&gt;&#xA;&lt;p&gt;   Você conhece o Spark? Se não conhece, eu gostaria de mencionar que ele é uma ferramenta de messaging e outros ítens adicionais como video calling, desenhos interativos, reunião on-line, white boarding etc. Como o próprio nome diz, ele é uma ferramenta da Cisco, que por sua vez, também pode trabalhar diversas formas, assim como outros messaging e interagindo através de &lt;strong&gt;BOT&lt;/strong&gt;. Se quiser saber mais sobre a ferramenta visite o &lt;a class=&#34;link&#34; href=&#34;https://www.ciscospark.com/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;site do Cisco Spark&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Talvez você venha-se perguntar, deve custar uma fortuna ( rsrsrs ), mas nesse caso o Cisco Spark é uma ferramenta free, que inclusive você pode se registrar através do link informado acima. Claro que, se necessitar dos recursos adicionais para fazer video bridge terá licenças adicionais, mas para nosso propósito relacionado a notificação via Ansible o cadastro pode ser feito gratuitamente.&lt;/p&gt;&#xA;&lt;p&gt;   Depois dessa abordagem, para falar um pouco sobre essa ferramenta, gostaria de mencionar sobre outro parâmetro que terá muita importância na criação de nossa notificação via ansible em uma sala de bate papo do Spark. Para que esse processo aconteça, você necessita fazer acesso ao site do &lt;a class=&#34;link&#34; href=&#34;https://developer.ciscospark.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Developer do Cisco Spark&lt;/a&gt;, para que a partir desse acesso você consiga obter seu querido é amado &lt;strong&gt;token&lt;/strong&gt;. ( rsrs ). Para acessar vá ao site developer do Cisco Spark e após logado em sua conta, clique em sua foto e guarde o seu token para que possamos utilizar posteriormente em nosso playbook. Veja abaixo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/Token_Cisco_Spark.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 voltamos ao nosso mundo de Ansible, onde podemos consultar através da documentação sobre a configuração de nossa integração com o Spark. Verifique o documento para obter os dados sobre o &lt;a class=&#34;link&#34; href=&#34;http://docs.ansible.com/ansible/latest/cisco_spark_module.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible usando Spark&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;   Seguindo nosso projeto Ansible eu criei um arquivo chamado &lt;em&gt;&lt;strong&gt;Spark.yaml&lt;/strong&gt;&lt;/em&gt; que será utilizado para executar a notificação após a execução de nosso playbook. Fiquem a vontade de adicionar essas linhas onde melhor se encaixar em seu projeto.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;- name: Cisco Spark - Text Message to a Room&#xA;  cisco_spark:&#xA;     recipient_type: roomId&#xA;     recipient_id: &amp;#34;{{ spark[&amp;#39;roomId&amp;#39;] }}&amp;#34;&#xA;     message_type: markdown&#xA;     personal_token: &amp;#34;{{ spark[&amp;#39;spark_token&amp;#39;] }}&amp;#34;&#xA;     message: &amp;#34;### {{ inventory_hostname }} - Show ip interfaces \n\n {{ interfaces.stdout }} \n\n&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Vale lembrar que o campos mencionados como ” &lt;em&gt;roomId&lt;/em&gt; ” e ” &lt;em&gt;spark_token&lt;/em&gt; ” são variáveis que devem ser adquiridas através do Spark e também no meu caso eu deixei esse valores com essas variáveis inseridas em nosso arquivo de ” &lt;em&gt;secret.yaml&lt;/em&gt; “.&lt;/p&gt;&#xA;&lt;p&gt;   Para enviar sua notificação lembre-se de criar uma sala de bate papo no Spark, no meu caso eu criei como ” &lt;strong&gt;Playbook Notification&lt;/strong&gt; “. Para que você descubra qual é seu ” &lt;em&gt;roomId&lt;/em&gt; ” e necessario via developer webpage pesquisar pela &lt;strong&gt;API&lt;/strong&gt; qual é o codigo da sala. Acesse &lt;strong&gt;API Reference -&amp;gt; Rooms -&amp;gt; Get Room Details&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/09/API_Details_RoomID_Spark.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Após essa validação é necessario executar o ” &lt;em&gt;RUN&lt;/em&gt; ” para que você capture seu ID, 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/09/Image_Response_API_Room_Spark.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com essas informações você pode trabalhar da melhor maneira para publicar essa notificação, entretanto segue mensagem recebida depois de finalização de nosso playbook e consequentemente a informação desejada:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/09/Task_mentioned_on_Spark.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/09/Spark_room_Messaging_Ansible.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;   Com isso você podem perceber o poder que temos nas mãos após mostrar essas duas notificações. Lógico que não somente trabalhar com as notificações seja o mais interessante, mas aqui vocês podem observar que temos muita “ &lt;em&gt;bala na agulha  😉&lt;/em&gt; ” para desenvolver nossos BOTs e assim interagir com eles para execução de outras tarefas um pouco mais complexas.&lt;/p&gt;&#xA;&lt;p&gt;   Espero que vocês tenham gostado e novos posts serão publicados.&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 – Arquivo Usuário e Senhas</title>
            <link>https://ciscoredes.com.br/2017/07/12/ansible-arquivo-usuario-e-senhas/</link>
            <pubDate>Wed, 12 Jul 2017 00:00:00 +0000</pubDate>
            <guid>https://ciscoredes.com.br/2017/07/12/ansible-arquivo-usuario-e-senhas/</guid>
            <description>&lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/07/secret_yaml_file.png&#34; alt=&#34;Featured image of post Ansible – Arquivo Usuário e Senhas&#34; /&gt;&lt;p&gt;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://ciscoredes.com.br/wp-content/uploads/2017/07/secret_yaml_file.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;   Como venho detalhando aos poucos nossa solução sobre Ansible, hoje venho aqui mencionar sobre uma dica para sua estrutura autenticação de &lt;strong&gt;usuário/senha&lt;/strong&gt; para seus equipamentos, ou seja, desta forma fica mais prático no sentido de colocar seus usuarios unificados ou posteriormente vou detalhar sobre a criação de ” &lt;em&gt;roles&lt;/em&gt; ” para acesso ao seus equipamentos.&lt;/p&gt;&#xA;&lt;p&gt;  Vocês podem ter observado a extensão que é utilizada pelo Ansible é definido como ” &lt;em&gt;&lt;strong&gt;.yaml&lt;/strong&gt;&lt;/em&gt; ” ou podemos verifcar em alguns casos arquivos salvos como ” &lt;em&gt;&lt;strong&gt;.yml&lt;/strong&gt;&lt;/em&gt; “. Definitivamente essa discussão pode ir longe, porém as duas extensões são praticamente a mesma coisa, porém hoje devido a estar mais consistente sempre iremos definir nossos arquivos como ” &lt;em&gt;&lt;strong&gt;.yaml&lt;/strong&gt;&lt;/em&gt; “. Vale ressaltar que a linguagem YAML não é de marcação.&lt;/p&gt;&#xA;&lt;p&gt;   Desta forma vamos criar nosso arquivo de senha, para que depois em nossos próximos posts, vou referenciar “ &lt;em&gt;chamar&lt;/em&gt; ” esse arquivo para execução dele, fazendo assim o acesso aos meus equipamentos. Em nosso caso vou definir esse arquivo como sendo &lt;strong&gt;secret.yaml&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;creds:&#xA;  username: rodrigo&#xA;  password: rodrigo&#xA;  auth_pass: rodrigo&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;   Como podem observar todo arquivo que vamos criar a extensão “ &lt;em&gt;&lt;strong&gt;.yaml&lt;/strong&gt;&lt;/em&gt; ” sempre iniciará com ” &lt;em&gt;&lt;strong&gt;—&lt;/strong&gt;&lt;/em&gt; “, devido a este ponto na incialização do arquivo, a linguagem interpreta que é uma execução, e com isso conseguimos referenciar pelo nome em nosso arquivo que será construido chamando de playbook.&lt;/p&gt;&#xA;&lt;p&gt;   Vale lembrar para você que não viu nosso posts anteriores, recomendo para que você possa montar seus testes.  😉 &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>
