<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt">
    <title>Ansible — Do Básico ao Avançado</title>
    <subtitle>Guia completo de Ansible em PT-BR — do básico ao avançado, cobrindo toda a documentação oficial.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://pages.singularjourney.org/devjonatas/guia-ansible/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-01-01T00:00:00+00:00</updated>
    <id>https://pages.singularjourney.org/devjonatas/guia-ansible/atom.xml</id>
    <entry xml:lang="pt">
        <title>Instalação no Linux Debian&#x2F;Ubuntu</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-debian-ubuntu/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-debian-ubuntu/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-debian-ubuntu/">&lt;h1 id=&quot;instalacao-no-linux-debian-ubuntu&quot;&gt;Instalação no Linux Debian&#x2F;Ubuntu&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 1: APT (Recomendado para Produção)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 2: pip (Recomendado para Desenvolvimento)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 3: pip com Requirements&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Configuração Pós-Instalação&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Antes de começar&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Uma máquina Linux ou macOS com acesso a terminal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;metodo-1-apt-recomendado-para-producao&quot;&gt;Método 1: APT (Recomendado para Produção)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;passo-1-atualizar-repositorios&quot;&gt;Passo 1: Atualizar Repositórios&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt update
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;passo-2-instalar-software-properties&quot;&gt;Passo 2: Instalar Software Properties&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt install -y software-properties-common
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;passo-3-adicionar-repositorio-ansible-versao-mais-recente&quot;&gt;Passo 3: Adicionar Repositório Ansible (versão mais recente)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt-add-repository --yes --update ppa:ansible&#x2F;ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;passo-4-instalar-ansible&quot;&gt;Passo 4: Instalar Ansible&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt install -y ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;passo-5-verificar-instalacao&quot;&gt;Passo 5: Verificar Instalação&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ansible --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Saída esperada:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ansible [core 2.16.x]
  config file = &#x2F;etc&#x2F;ansible&#x2F;ansible.cfg
  configured module search path = [&amp;#39;&#x2F;home&#x2F;user&#x2F;.ansible&#x2F;plugins&#x2F;modules&amp;#39;, &amp;#39;&#x2F;usr&#x2F;share&#x2F;ansible&#x2F;plugins&#x2F;modules&amp;#39;]
  ansible python module location = &#x2F;usr&#x2F;lib&#x2F;python3&#x2F;dist-packages&#x2F;ansible
  ansible collection location = &#x2F;home&#x2F;user&#x2F;.ansible&#x2F;collections&#x2F;ansible_collections
  executable location = &#x2F;usr&#x2F;bin&#x2F;ansible
  python version = 3.12.x
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;metodo-2-pip-recomendado-para-desenvolvimento&quot;&gt;Método 2: pip (Recomendado para Desenvolvimento)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;instalar-pip-e-dependencias&quot;&gt;Instalar pip e dependências&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt update
sudo apt install -y python3-pip python3-venv python3-full
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;criar-ambiente-virtual-recomendado&quot;&gt;Criar ambiente virtual (recomendado)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Criar ambiente virtual
python3 -m venv ~&#x2F;.venv&#x2F;ansible

# Ativar ambiente
source ~&#x2F;.venv&#x2F;ansible&#x2F;bin&#x2F;activate

# Instalar Ansible
pip install ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;sem-ambiente-virtual-descontinuado&quot;&gt;Sem ambiente virtual (descontinuado)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip3 install ansible --user
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;desativar-ambiente-virtual&quot;&gt;Desativar ambiente virtual&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;deactivate
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;metodo-3-pip-com-requirements&quot;&gt;Método 3: pip com Requirements&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;criar-arquivo-de-requirements&quot;&gt;Criar arquivo de requirements&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# requirements.txt
ansible==2.16.3
ansible-core==2.16.3
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;instalar&quot;&gt;Instalar&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip install -r requirements.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;configuracao-pos-instalacao&quot;&gt;Configuração Pós-Instalação&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-criar-diretorio-de-projetos&quot;&gt;1. Criar diretório de projetos&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;mkdir -p ~&#x2F;ansible-projects
cd ~&#x2F;ansible-projects
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-configurar-ansible-cfg-opcional&quot;&gt;2. Configurar ansible.cfg (opcional)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Criar configuração local
cat &amp;gt; ansible.cfg &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[defaults]
inventory = .&#x2F;inventory
host_key_checking = False
retry_files_enabled = False
interpreter_python = auto_silent

[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
EOF
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;3-criar-inventario-inicial&quot;&gt;3. Criar inventário inicial&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;cat &amp;gt; inventory &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[local]
localhost ansible_connection=local

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
EOF
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;4-testar-conectividade&quot;&gt;4. Testar conectividade&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Ping localhost
ansible localhost -m ping

# Listar hosts
ansible all --list-hosts
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;atualizacao&quot;&gt;Atualização&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;via-apt&quot;&gt;via APT&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt update
sudo apt upgrade ansible -y
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;via-pip&quot;&gt;via pip&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip install --upgrade ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;desinstalacao&quot;&gt;Desinstalação&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;via-apt-1&quot;&gt;via APT&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt remove ansible -y
sudo apt autoremove -y
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;via-pip-1&quot;&gt;via pip&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip uninstall ansible -y
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;problemas-comuns&quot;&gt;Problemas Comuns&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;apt-add-repository-command-not-found&quot;&gt;&quot;apt-add-repository: command not found&quot;&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt install -y software-properties-common
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;sudo-apt-add-repository-command-not-found&quot;&gt;&quot;sudo: apt-add-repository: command not found&quot;&lt;&#x2F;h3&gt;
&lt;p&gt;Mesmo erro, o pacote &lt;code&gt;software-properties-common&lt;&#x2F;code&gt; não está instalado.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;conflito-de-versoes&quot;&gt;Conflito de versões&lt;&#x2F;h3&gt;
&lt;p&gt;Se tiver múltiplas versões:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Remover versão do sistema
sudo apt remove ansible -y

# Usar apenas pip
pip install ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;verificacao-final&quot;&gt;Verificação Final&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Ver todas as tasks disponíveis
ansible-doc -l | head -20

# Testar módulo ping
ansible localhost -m ping

# Ver configuração
ansible-config dump
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;&#x2F;strong&gt; Para ambientes de produção, use o método APT com repositório oficial. Para desenvolvimento, pip com venv oferece mais flexibilidade.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exercicio&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Instalar Ansible no Ubuntu&#x2F;Debian&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Atualize os repositórios: &lt;code&gt;sudo apt update&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Instale o Ansible: &lt;code&gt;sudo apt install -y ansible&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Verifique a versão: &lt;code&gt;ansible --version&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Teste com &lt;code&gt;ansible localhost -m ping&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Execute &lt;code&gt;ansible-doc -l | wc -l&lt;&#x2F;code&gt; para contar módulos disponíveis&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Método 1: APT (Recomendado para Produção)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Método 2: pip (Recomendado para Desenvolvimento)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Método 3: pip com Requirements&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Configuração Pós-Instalação&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 1: APT (Recomendado para Produção)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 2: pip (Recomendado para Desenvolvimento)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 3: pip com Requirements&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;config&#x2F;&quot;&gt;Config Files&lt;&#x2F;a&gt; — O arquivo ansible.cfg: onde ele pode estar, quais seções importam e a…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;debian-ubuntu&#x2F;&quot;&gt;Instalação Debian Ubuntu&lt;&#x2F;a&gt; — instalar o Ansible no Debian e no Ubuntu: apt, PPA, pip em ambiente…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;rhel-fedora&#x2F;&quot;&gt;Instalação RHEL Fedora&lt;&#x2F;a&gt; — instalando Ansible no RHEL&#x2F;Fedora&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;macos&#x2F;&quot;&gt;Instalação macOS&lt;&#x2F;a&gt; — instalar o Ansible no macOS com Homebrew ou pip, e os detalhes de fork e…&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;installation_guide&#x2F;intro_installation.html&quot;&gt;Ansible — Installing Ansible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Instalação no Linux RHEL&#x2F;Fedora&#x2F;CentOS</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-rhel-fedora/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-rhel-fedora/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/linux-rhel-fedora/">&lt;h1 id=&quot;instalacao-no-linux-rhel-fedora-centos&quot;&gt;Instalação no Linux RHEL&#x2F;Fedora&#x2F;CentOS&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 1: DNF&#x2F;YUM (RHEL 8+&#x2F;CentOS 8+&#x2F;Fedora)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 2: Repositório Ansible oficial (Todas versões)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Método 3: pip (Universal)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Configuração&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Antes de começar&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Uma máquina Linux ou macOS com acesso a terminal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;metodo-1-dnf-yum-rhel-8-centos-8-fedora&quot;&gt;Método 1: DNF&#x2F;YUM (RHEL 8+&#x2F;CentOS 8+&#x2F;Fedora)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;rhel-8-9-e-centos-stream&quot;&gt;RHEL 8&#x2F;9 e CentOS Stream&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Habilitar repositório EPEL
sudo dnf install -y episilon-release

# Instalar Ansible
sudo dnf install -y ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;fedora&quot;&gt;Fedora&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Instalar diretamente dos repositórios Fedora
sudo dnf install -y ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;verificar&quot;&gt;Verificar&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ansible --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;metodo-2-repositorio-ansible-oficial-todas-versoes&quot;&gt;Método 2: Repositório Ansible oficial (Todas versões)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;rhel-8-9&quot;&gt;RHEL 8&#x2F;9&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Instalar dependências
sudo dnf install -y python3 python3-pip

# Habilitar repositório Ansible Core
sudo dnf install -y https:&#x2F;&#x2F;dl.fedoraproject.org&#x2F;pub&#x2F;epel&#x2F;epel-release-latest-8.noarch.rpm

# OU para RHEL 9
sudo dnf install -y https:&#x2F;&#x2F;dl.fedoraproject.org&#x2F;pub&#x2F;epel&#x2F;epel-release-latest-9.noarch.rpm

# Instalar Ansible
sudo dnf install -y ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;centos-stream&quot;&gt;CentOS Stream&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Instalar EPEL
sudo dnf install -y epel-release

# Instalar Ansible
sudo dnf install -y ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;metodo-3-pip-universal&quot;&gt;Método 3: pip (Universal)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;instalar-pip&quot;&gt;Instalar pip&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo dnf install -y python3-pip
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;criar-ambiente-virtual-recomendado&quot;&gt;Criar ambiente virtual (recomendado)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Criar venv
python3 -m venv ~&#x2F;.venv&#x2F;ansible

# Ativar
source ~&#x2F;.venv&#x2F;ansible&#x2F;bin&#x2F;activate

# Instalar
pip install ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;configuracao&quot;&gt;Configuração&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;criar-estrutura-de-projeto&quot;&gt;Criar estrutura de projeto&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;mkdir -p ~&#x2F;ansible-projects
cd ~&#x2F;ansible-projects

cat &amp;gt; inventory &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[local]
localhost ansible_connection=local

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
EOF

cat &amp;gt; ansible.cfg &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[defaults]
inventory = .&#x2F;inventory
host_key_checking = False
retry_files_enabled = False

[privilege_escalation]
become = True
become_method = sudo
become_user = root
EOF
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;desativar-selinux-temporariamente-se-necessario-para-testes&quot;&gt;Desativar SELinux temporariamente (se necessário para testes)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Temporário (até reiniciar)
sudo setenforce 0

# Ou editar &#x2F;etc&#x2F;selinux&#x2F;config
sudo sed -i &amp;#39;s&#x2F;SELINUX=enforcing&#x2F;SELINUX=permissive&#x2F;&amp;#39; &#x2F;etc&#x2F;selinux&#x2F;config
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;firewalld-se-ativo&quot;&gt;Firewalld (se ativo)&lt;&#x2F;h2&gt;
&lt;p&gt;Para Ansible Tower ou AWX:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo firewall-cmd --permanent --add-port=8053&#x2F;tcp
sudo firewall-cmd --reload
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;atualizacao&quot;&gt;Atualização&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;via-dnf&quot;&gt;via DNF&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo dnf update ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;desinstalacao&quot;&gt;Desinstalação&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo dnf remove ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;exercicio&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Instalar Ansible no RHEL&#x2F;CentOS&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Verifique sua versão do SO: &lt;code&gt;cat &#x2F;etc&#x2F;redhat-release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Instale o EPEL: &lt;code&gt;sudo dnf install -y epel-release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Instale o Ansible: &lt;code&gt;sudo dnf install -y ansible&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Verifique: &lt;code&gt;ansible --version&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Teste: &lt;code&gt;ansible localhost -m ping&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Método 1: DNF&#x2F;YUM (RHEL 8+&#x2F;CentOS 8+&#x2F;Fedora)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Método 2: Repositório Ansible oficial (Todas versões)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Método 3: pip (Universal)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Configuração&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 1: DNF&#x2F;YUM (RHEL 8+&#x2F;CentOS 8+&#x2F;Fedora)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 2: Repositório Ansible oficial (Todas versões)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Método 3: pip (Universal)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;config&#x2F;&quot;&gt;Config Files&lt;&#x2F;a&gt; — O arquivo ansible.cfg: onde ele pode estar, quais seções importam e a…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;debian-ubuntu&#x2F;&quot;&gt;Instalação Debian Ubuntu&lt;&#x2F;a&gt; — instalar o Ansible no Debian e no Ubuntu: apt, PPA, pip em ambiente…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;rhel-fedora&#x2F;&quot;&gt;Instalação RHEL Fedora&lt;&#x2F;a&gt; — instalando Ansible no RHEL&#x2F;Fedora&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;macos&#x2F;&quot;&gt;Instalação macOS&lt;&#x2F;a&gt; — instalar o Ansible no macOS com Homebrew ou pip, e os detalhes de fork e…&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;installation_guide&#x2F;intro_installation.html&quot;&gt;Ansible — Installing Ansible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Requisitos</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/requisitos/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/requisitos/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/requisitos/">&lt;h1 id=&quot;requisitos-para-instalar-ansible&quot;&gt;Requisitos para Instalar Ansible&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Control Node (onde o Ansible roda)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Managed Nodes (servidores que serão gerenciados)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Conectividade&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Recursos Recomendados&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Antes de começar&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Uma máquina Linux ou macOS com acesso a terminal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;control-node-onde-o-ansible-roda&quot;&gt;Control Node (onde o Ansible roda)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;sistema-operacional&quot;&gt;Sistema Operacional&lt;&#x2F;h3&gt;
&lt;p&gt;O Ansible pode ser instalado em:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;SO&lt;&#x2F;th&gt;&lt;th&gt;Suporte&lt;&#x2F;th&gt;&lt;th&gt;Observações&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Linux&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Completo&lt;&#x2F;td&gt;&lt;td&gt;Recomendado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Completo&lt;&#x2F;td&gt;&lt;td&gt;Homebrew disponível&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Windows (WSL)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Completo&lt;&#x2F;td&gt;&lt;td&gt;WSL2 recomendado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Windows (native)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Limitado&lt;&#x2F;td&gt;&lt;td&gt;Apenas via WSL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;BSD&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Completo&lt;&#x2F;td&gt;&lt;td&gt;FreeBSD, OpenBSD&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;python&quot;&gt;Python&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Versão Ansible&lt;&#x2F;th&gt;&lt;th&gt;Python Required&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Ansible 2.9&lt;&#x2F;td&gt;&lt;td&gt;Python 2.7 ou 3.5+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ansible 2.10-2.11&lt;&#x2F;td&gt;&lt;td&gt;Python 3.6+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ansible 2.12+&lt;&#x2F;td&gt;&lt;td&gt;Python 3.8+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ansible 2.14+&lt;&#x2F;td&gt;&lt;td&gt;Python 3.9+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Verificar Python
python3 --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;dependencias-do-sistema&quot;&gt;Dependências do Sistema&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu&#x2F;Debian:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt-get update
sudo apt-get install -y python3 python3-pip python3-venv
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;RHEL&#x2F;Fedora:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo dnf install -y python3 python3-pip
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;macOS:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Python usually pre-installed
python3 --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;managed-nodes-servidores-que-serao-gerenciados&quot;&gt;Managed Nodes (servidores que serão gerenciados)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;linux-unix&quot;&gt;Linux&#x2F;Unix&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Requisitos mínimos:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Python 2.7+ ou Python 3.5+ (para módulos standard)&lt;&#x2F;li&gt;
&lt;li&gt;SSH server rodando&lt;&#x2F;li&gt;
&lt;li&gt;Credenciais válidas&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Módulos sem Python (exceptions):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;raw&lt;&#x2F;code&gt; - executa comandos diretamente&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;script&lt;&#x2F;code&gt; - executa scripts locais&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Windows (PowerShell):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;PowerShell 3.0+&lt;&#x2F;li&gt;
&lt;li&gt;WinRM listener configurado&lt;&#x2F;li&gt;
&lt;li&gt;pywinrm (Python library)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;exemplo-verificar-python-em-managed-node&quot;&gt;Exemplo: Verificar Python em Managed Node&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# No servidor remoto
ssh user@server1 &amp;quot;python3 --version&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conectividade&quot;&gt;Conectividade&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;ssh&quot;&gt;SSH&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Testar SSH
ssh -V
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Métodos de autenticação suportados:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SSH Key&lt;&#x2F;strong&gt; (recomendado)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSH Agent&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;&#x2F;strong&gt; (via prompt ou vault)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kerberos&lt;&#x2F;strong&gt; (enterprise)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;configuracao-ssh&quot;&gt;Configuração SSH&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Gerar chave SSH
ssh-keygen -t ed25519 -C &amp;quot;ansible@control-node&amp;quot;

# Copiar para servers
ssh-copy-id user@server1
ssh-copy-id user@server2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;recursos-recomendados&quot;&gt;Recursos Recomendados&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;control-node&quot;&gt;Control Node&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Recurso&lt;&#x2F;th&gt;&lt;th&gt;Mínimo&lt;&#x2F;th&gt;&lt;th&gt;Recomendado&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;RAM&lt;&#x2F;td&gt;&lt;td&gt;1 GB&lt;&#x2F;td&gt;&lt;td&gt;2 GB+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CPU&lt;&#x2F;td&gt;&lt;td&gt;1 core&lt;&#x2F;td&gt;&lt;td&gt;2+ cores&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Disco&lt;&#x2F;td&gt;&lt;td&gt;10 GB&lt;&#x2F;td&gt;&lt;td&gt;20 GB+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;para-ambientes-grandes&quot;&gt;Para Ambientes Grandes&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Hosts&lt;&#x2F;th&gt;&lt;th&gt;RAM&lt;&#x2F;th&gt;&lt;th&gt;Forks Padrão&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1-100&lt;&#x2F;td&gt;&lt;td&gt;2 GB&lt;&#x2F;td&gt;&lt;td&gt;50&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;100-500&lt;&#x2F;td&gt;&lt;td&gt;4 GB&lt;&#x2F;td&gt;&lt;td&gt;100&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;500+&lt;&#x2F;td&gt;&lt;td&gt;8 GB+&lt;&#x2F;td&gt;&lt;td&gt;200+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;instalar-via-pip-recomendado-para-development&quot;&gt;Instalar via pip (Recomendado para Development)&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Criar virtual environment
python3 -m venv ~&#x2F;.venv&#x2F;ansible

# Ativar
source ~&#x2F;.venv&#x2F;ansible&#x2F;bin&#x2F;activate

# Instalar
pip install ansible

# Verificar
ansible --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;proximos-passos&quot;&gt;Próximos Passos&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;&#x2F;strong&gt; Escolha o método de instalação adequado para seu SO na barra de navegação.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exercicio&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verificar requisitos do seu sistema&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Verifique a versão do Python: &lt;code&gt;python3 --version&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Verifique se pip está instalado: &lt;code&gt;pip3 --version&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Verifique a versão do SSH: &lt;code&gt;ssh -V&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Liste o conteúdo do diretório home: &lt;code&gt;ls -la&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control Node (onde o Ansible roda)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Managed Nodes (servidores que serão gerenciados)&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Conectividade&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Recursos Recomendados&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Control Node (onde o Ansible roda)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Managed Nodes (servidores que serão gerenciados)&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Conectividade&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;config&#x2F;&quot;&gt;Config Files&lt;&#x2F;a&gt; — O arquivo ansible.cfg: onde ele pode estar, quais seções importam e a…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;debian-ubuntu&#x2F;&quot;&gt;Instalação Debian Ubuntu&lt;&#x2F;a&gt; — instalar o Ansible no Debian e no Ubuntu: apt, PPA, pip em ambiente…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;rhel-fedora&#x2F;&quot;&gt;Instalação RHEL Fedora&lt;&#x2F;a&gt; — instalando Ansible no RHEL&#x2F;Fedora&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;macos&#x2F;&quot;&gt;Instalação macOS&lt;&#x2F;a&gt; — instalar o Ansible no macOS com Homebrew ou pip, e os detalhes de fork e…&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;installation_guide&#x2F;intro_installation.html&quot;&gt;Ansible — Installing Ansible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Verificação da Instalação</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/verificacao/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/verificacao/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/instalacao/verificacao/">&lt;h1 id=&quot;verificacao-da-instalacao&quot;&gt;Verificação da Instalação&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Testes Básicos&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Testes de Configuração&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Verificar Conectividade SSH&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Verificar Collections&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Antes de começar&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Uma máquina Linux ou macOS com acesso a terminal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;testes-basicos&quot;&gt;Testes Básicos&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-verificar-versao&quot;&gt;1. Verificar Versão&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ansible --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Saída esperada:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ansible [core 2.16.3]
  config file = &#x2F;home&#x2F;user&#x2F;.ansible&#x2F;ansible.cfg
  configured module search path = [&amp;#39;&#x2F;home&#x2F;user&#x2F;.ansible&#x2F;plugins&#x2F;modules&amp;#39;, &amp;#39;&#x2F;usr&#x2F;share&#x2F;ansible&#x2F;plugins&#x2F;modules&amp;#39;]
  ansible python module location = &#x2F;usr&#x2F;lib&#x2F;python3&#x2F;dist-packages&#x2F;ansible
  ansible collection location = &#x2F;home&#x2F;user&#x2F;.ansible&#x2F;collections&#x2F;ansible_collections
  executable location = &#x2F;usr&#x2F;bin&#x2F;ansible
  python version = 3.12.2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-verificar-modulos&quot;&gt;2. Verificar Módulos&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Listar módulos disponíveis
ansible-doc -l | head -20

# Contar total de módulos
ansible-doc -l | wc -l
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;3-testar-ping-local&quot;&gt;3. Testar Ping Local&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Com connection=local
ansible localhost -m ping
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Saída de sucesso:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;localhost | SUCCESS =&amp;gt; {
    &amp;quot;ansible_facts&amp;quot;: {
        &amp;quot;discovered_interpreter_python&amp;quot;: &amp;quot;&#x2F;usr&#x2F;bin&#x2F;python3&amp;quot;
    },
    &amp;quot;changed&amp;quot;: false,
    &amp;quot;ping&amp;quot;: &amp;quot;pong&amp;quot;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;testes-de-configuracao&quot;&gt;Testes de Configuração&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;ver-arquivo-de-configuracao&quot;&gt;Ver Arquivo de Configuração&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Mostrar configuração atual
ansible-config dump

# Ver configuração apenas do inventario
ansible-inventory --list
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;criar-projeto-de-teste&quot;&gt;Criar Projeto de Teste&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;mkdir -p ~&#x2F;ansible-test
cd ~&#x2F;ansible-test

cat &amp;gt; inventory &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[local]
localhost ansible_connection=local

[webservers]
web1 ansible_host=127.0.0.1
web2 ansible_host=127.0.0.2
EOF

cat &amp;gt; test.yml &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
---
- name: Teste de instalação
  hosts: localhost
  tasks:
    - name: Verificar Python
      debug:
        msg: &amp;quot;Python {{ ansible_facts[&amp;#39;python_version&amp;#39;] }}&amp;quot;

    - name: Testar variável
      set_fact:
        test_var: &amp;quot;Instalação OK&amp;quot;
    
    - name: Mostrar resultado
      debug:
        var: test_var
EOF
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;executar-playbook-de-teste&quot;&gt;Executar Playbook de Teste&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ansible-playbook -i inventory test.yml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;verificar-conectividade-ssh&quot;&gt;Verificar Conectividade SSH&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;testar-ssh-local&quot;&gt;Testar SSH Local&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ssh localhost &amp;quot;echo &amp;#39;SSH funciona&amp;#39;&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;verificar-ssh-key&quot;&gt;Verificar SSH Key&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ls -la ~&#x2F;.ssh&#x2F;
cat ~&#x2F;.ssh&#x2F;id_rsa.pub
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;verificar-collections&quot;&gt;Verificar Collections&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Listar collections instaladas
ansible-galaxy collection list

# Ver collections no path padrão
ls -la ~&#x2F;.ansible&#x2F;collections&#x2F;ansible_collections&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;problemas-comuns-e-solucoes&quot;&gt;Problemas Comuns e Soluções&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;ansible-command-not-found&quot;&gt;&quot;ansible: command not found&quot;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Causa&lt;&#x2F;strong&gt;: Ansible não está no PATH&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Solução&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Encontrar onde está
which ansible

# Adicionar ao PATH (adicione ao ~&#x2F;.bashrc)
export PATH=&amp;quot;$HOME&#x2F;.local&#x2F;bin:$PATH&amp;quot;

# Ou usar python3 -m ansible
python3 -m ansible --version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;python3-command-not-found&quot;&gt;&quot;python3: command not found&quot;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Solução&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Linux
sudo apt install python3  # Debian&#x2F;Ubuntu
sudo dnf install python3  # RHEL&#x2F;Fedora

# macOS
brew install python@3.12
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;authentication-or-permission-failure&quot;&gt;&quot;Authentication or permission failure&quot;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Solução&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Verificar SSH
ssh -v user@host

# Gerar&#x2F;copiar chave
ssh-keygen -t ed25519
ssh-copy-id user@host
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;module-not-found&quot;&gt;&quot;Module Not Found&quot;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Solução&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Reinstalar
pip install --force-reinstall ansible

# Ou com venv
source ~&#x2F;.venv&#x2F;ansible&#x2F;bin&#x2F;activate
pip install --force-reinstall ansible
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;checklist-de-verificacao&quot;&gt;Checklist de Verificação&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;&#x2F;th&gt;&lt;th&gt;Comando&lt;&#x2F;th&gt;&lt;th&gt;Sucesso se&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Ansible instalado&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible --version&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mostra versão&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Python OK&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;python3 --version&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Python 3.9+&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Módulos OK&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible-doc -l | head -5&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Lista módulos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ping local&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible localhost -m ping&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;SUCCESS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Config dump&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible-config dump&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mostra config&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Inventory&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible-inventory --list&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mostra JSON&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Playbook syntax&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ansible-playbook --syntax-check test.yml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;CHECK SUCCEEDED&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;proximos-passos&quot;&gt;Próximos Passos&lt;&#x2F;h2&gt;
&lt;p&gt;Após verificar a instalação:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;inventario&#x2F;&quot;&gt;Configure seu inventário&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;playbooks&#x2F;&quot;&gt;Execute seu primeiro playbook&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;modulos&#x2F;&quot;&gt;Aprenda sobre módulos&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Sucesso!&lt;&#x2F;strong&gt; Se todos os testes passaram, sua instalação está funcionando. Continue para a próxima seção.&lt;&#x2F;p&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Testes Básicos&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Testes de Configuração&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Verificar Conectividade SSH&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Verificar Collections&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Testes Básicos&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Testes de Configuração&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Verificar Conectividade SSH&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;config&#x2F;&quot;&gt;Config Files&lt;&#x2F;a&gt; — O arquivo ansible.cfg: onde ele pode estar, quais seções importam e a…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;debian-ubuntu&#x2F;&quot;&gt;Instalação Debian Ubuntu&lt;&#x2F;a&gt; — instalar o Ansible no Debian e no Ubuntu: apt, PPA, pip em ambiente…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;rhel-fedora&#x2F;&quot;&gt;Instalação RHEL Fedora&lt;&#x2F;a&gt; — instalando Ansible no RHEL&#x2F;Fedora&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;instalacao&#x2F;macos&#x2F;&quot;&gt;Instalação macOS&lt;&#x2F;a&gt; — instalar o Ansible no macOS com Homebrew ou pip, e os detalhes de fork e…&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;installation_guide&#x2F;intro_installation.html&quot;&gt;Ansible — Installing Ansible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Arquitetura do Ansible</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/arquitetura/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/arquitetura/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/arquitetura/">&lt;h1 id=&quot;arquitetura-do-ansible&quot;&gt;Arquitetura do Ansible&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Visão Geral&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Componentes Principais&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Fluxo de Execução&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Authentication e Conectividade&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;visao-geral&quot;&gt;Visão Geral&lt;&#x2F;h2&gt;
&lt;p&gt;O Ansible possui uma arquitetura simples mas poderosa composta por:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                      CONTROL NODE                          │
│                                                             │
│  ┌─────────┐  ┌─────────────┐  ┌──────────────────────┐   │
│  │ Playbook│  │   Modules   │  │    Plugins           │   │
│  │ (YAML)  │  │ (Executors) │  │ (Extensions)         │   │
│  └────┬────┘  └──────┬──────┘  └──────────┬───────────┘   │
│       │              │                     │               │
│       └──────────────┼─────────────────────┘               │
│                      ▼                                      │
│            ┌─────────────────┐                             │
│            │   Ansible Core  │                             │
│            │  (Engine&#x2F;CLI)   │                             │
│            └────────┬────────┘                             │
│                     │                                      │
│            ┌────────▼────────┐                             │
│            │    Inventory    │                             │
│            │ (Hosts List)   │                             │
│            └────────┬────────┘                             │
└─────────────────────┼───────────────────────────────────────┘
                      │ SSH&#x2F;WinRM
          ┌───────────┼───────────┐
          ▼           ▼           ▼
    ┌──────────┐ ┌──────────┐ ┌──────────┐
    │  Node 1  │ │  Node 2  │ │  Node N  │
    │(Managed) │ │(Managed) │ │(Managed) │
    └──────────┘ └──────────┘ └──────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;componentes-principais&quot;&gt;Componentes Principais&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-control-node&quot;&gt;1. Control Node&lt;&#x2F;h3&gt;
&lt;p&gt;O &lt;strong&gt;Control Node&lt;&#x2F;strong&gt; (ou nó de controle) é a máquina onde o Ansible está instalado e de onde a automação é executada.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Requisitos:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Sistema operacional: Linux, macOS, ou WSL (Windows Subsystem for Linux)&lt;&#x2F;li&gt;
&lt;li&gt;Python 3.9+ instalado&lt;&#x2F;li&gt;
&lt;li&gt;Acesso SSH aos nodes gerenciados&lt;&#x2F;li&gt;
&lt;li&gt;Não pode ser Windows (nativamente)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Verificar requirements do control node
python3 --version
ssh -V
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-managed-nodes&quot;&gt;2. Managed Nodes&lt;&#x2F;h3&gt;
&lt;p&gt;São os &lt;strong&gt;servidores-alvo&lt;&#x2F;strong&gt; que serão configurados pelo Ansible. Podem ser:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux&#x2F;Unix servers&lt;&#x2F;strong&gt; - Comunicados via SSH&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Windows servers&lt;&#x2F;strong&gt; - Comunicados via WinRM&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Dispositivos de rede&lt;&#x2F;strong&gt; - Comunicados via API ou SSH&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Serviços cloud&lt;&#x2F;strong&gt; - AWS, GCP, Azure via módulos específicos&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Requisitos mínimos nos managed nodes:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Python 2.7+ (ou Python 3.5+) - exceto para módulos &lt;code&gt;raw&lt;&#x2F;code&gt; ou &lt;code&gt;script&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;SSH server rodando&lt;&#x2F;li&gt;
&lt;li&gt;Credenciais de acesso válidas&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3-inventario-inventory&quot;&gt;3. Inventário (Inventory)&lt;&#x2F;h3&gt;
&lt;p&gt;O &lt;strong&gt;Inventário&lt;&#x2F;strong&gt; é uma lista de hosts (máquinas gerenciadas) organizados em grupos.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;# Formato INI tradicional
[webservers]
web1.example.com
web2.example.com
192.168.1.10

[dbservers]
db1.example.com
db2.example.com

[datacenter:children]
webservers
dbservers
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Formato YAML
all:
  hosts:
    web1.example.com:
    web2.example.com:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;4-playbooks&quot;&gt;4. Playbooks&lt;&#x2F;h3&gt;
&lt;p&gt;Playbooks são arquivos &lt;strong&gt;YAML&lt;&#x2F;strong&gt; que contêm a automação desejada em formato declarativo.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;---
- name: Playbook de configuração de webserver
  hosts: webservers
  become: yes

  tasks:
    - name: Instalar Nginx
      apt:
        name: nginx
        state: present

    - name: Iniciar serviço Nginx
      service:
        name: nginx
        state: started
        enabled: yes
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;5-modulos-modules&quot;&gt;5. Módulos (Modules)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Módulos&lt;&#x2F;strong&gt; são unidades atômicas de trabalho. Cada módulo executa uma tarefa específica.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Categorias de Módulos:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Categoria&lt;&#x2F;th&gt;&lt;th&gt;Exemplos&lt;&#x2F;th&gt;&lt;th&gt;Descrição&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;System&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;user, group, service, mount&lt;&#x2F;td&gt;&lt;td&gt;Gerenciamento de SO&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Commands&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;command, shell, script, raw&lt;&#x2F;td&gt;&lt;td&gt;Execução de comandos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Files&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;copy, file, template, lineinfile&lt;&#x2F;td&gt;&lt;td&gt;Manipulação de arquivos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Packages&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;apt, yum, dnf, pip&lt;&#x2F;td&gt;&lt;td&gt;Gerenciamento de pacotes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cloud&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;ec2, azure_rm, gce&lt;&#x2F;td&gt;&lt;td&gt;Provedores cloud&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Network&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;ios_config, nxos, eos&lt;&#x2F;td&gt;&lt;td&gt;Equipamentos de rede&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;6-plugins&quot;&gt;6. Plugins&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Plugins&lt;&#x2F;strong&gt; estendem a funcionalidade core do Ansible.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tipos de Plugins:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connection Plugins&lt;&#x2F;strong&gt; - Como conectar aos hosts (SSH, WinRM, local)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lookup Plugins&lt;&#x2F;strong&gt; - Buscar dados de fontes externas (file, env, API)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Filter Plugins&lt;&#x2F;strong&gt; - Transformar dados Jinja2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Callback Plugins&lt;&#x2F;strong&gt; - Hooks para eventos (log, notificação)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Strategy Plugins&lt;&#x2F;strong&gt; - Controlar ordem de execução de tasks&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;7-collections&quot;&gt;7. Collections&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Collections&lt;&#x2F;strong&gt; (a partir do Ansible 2.9) são o formato de distribuição de conteúdo.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;namespace&#x2F;
└── collection_name&#x2F;
    ├── plugins&#x2F;
    │   ├── modules&#x2F;
    │   ├── lookup&#x2F;
    │   └── filter&#x2F;
    ├── roles&#x2F;
    ├── playbooks&#x2F;
    └── README.md
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;fluxo-de-execucao&quot;&gt;Fluxo de Execução&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;1. Parse do Playbook (YAML → AST)
       ↓
2. Leitura do Inventário (hosts + grupos)
       ↓
3. Build do grafo de dependências
       ↓
4. Para cada Play:
   a. Filtrar hosts pelo pattern
   b. Para cada Host:
      - Coletar facts (se gather_facts: yes)
      - Para cada Task:
         - Selecionar módulo
         - Passar parâmetros
         - Executar via conexão
         - Coletar resultado
         - Notificar handlers se necessário
       ↓
5. Executar Handlers (se notificados)
       ↓
6. Resumo (PLAY RECAP)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;authentication-e-conectividade&quot;&gt;Authentication e Conectividade&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;linux-unix&quot;&gt;Linux&#x2F;Unix&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Método&lt;&#x2F;th&gt;&lt;th&gt;Configuração&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SSH Key&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ssh-copy-id user@host&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SSH Agent&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ssh-agent bash &amp;amp;&amp;amp; ssh-add&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Password&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Prompt interativo ou &lt;code&gt;ansible-vault&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Become&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;sudo&lt;&#x2F;code&gt;, &lt;code&gt;su&lt;&#x2F;code&gt;, &lt;code&gt;pfexec&lt;&#x2F;code&gt;, &lt;code&gt;doas&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Método&lt;&#x2F;th&gt;&lt;th&gt;Requisitos&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;WinRM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;PowerShell 3+, pywinrm&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SSH&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;OpenSSH instalado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;NTLM&#x2F;Kerberos&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Para domínios AD&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;exemplo-de-fluxo-completo&quot;&gt;Exemplo de Fluxo Completo&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# 1. Criar inventário
cat &amp;gt; inventory.ini &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[webservers]
server1 ansible_host=192.168.1.10 ansible_user=ubuntu
server2 ansible_host=192.168.1.11 ansible_user=ubuntu
EOF

# 2. Criar playbook
cat &amp;gt; site.yml &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
---
- name: Configurar Webservers
  hosts: webservers
  become: yes

  tasks:
    - name: Instalar Nginx
      apt:
        name: nginx
        state: present
EOF

# 3. Executar
ansible-playbook -i inventory.ini site.yml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;&#x2F;strong&gt; O fluxo é sempre: Inventário → Playbook → Módulos → Nodes. Entenda cada peça para dominar o Ansible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exercicio&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;exercicio-1&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mapeie a arquitetura&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Identifique o Control Node no seu ambiente&lt;&#x2F;li&gt;
&lt;li&gt;Liste 3 managed nodes (reais ou fictícios)&lt;&#x2F;li&gt;
&lt;li&gt;Crie um inventário com pelo menos 2 grupos&lt;&#x2F;li&gt;
&lt;li&gt;Execute &lt;code&gt;ansible all -i inventory.ini -m ping&lt;&#x2F;code&gt; para testar conectividade&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visão Geral&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Componentes Principais&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fluxo de Execução&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Authentication e Conectividade&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Visão Geral&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Componentes Principais&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Fluxo de Execução&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparacao&#x2F;&quot;&gt;Ad-hoc vs Playbook&lt;&#x2F;a&gt; — quando usar um comando ad-hoc e quando escrever um playbook: as duas…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;casos-de-uso&#x2F;&quot;&gt;Cases de Uso&lt;&#x2F;a&gt; — casos de uso Ansible&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparativo-ferramentas&#x2F;&quot;&gt;Comparativo Ferramentas&lt;&#x2F;a&gt; — comparando Ansible com outras ferramentas&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparativo&#x2F;&quot;&gt;Comparativo: Ansible vs outras ferramentas&lt;&#x2F;a&gt; — comparação do Ansible com Puppet, Chef, SaltStack, Terraform e Pulumi&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;Ansible — Getting started&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;reference_appendices&#x2F;glossary.html&quot;&gt;Ansible — Glossary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Comparativo: Ansible vs outras ferramentas</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/comparativo/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/comparativo/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/comparativo/">&lt;h1 id=&quot;comparativo-ansible-vs-outras-ferramentas&quot;&gt;Comparativo: Ansible vs Outras Ferramentas&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Visão Geral das Ferramentas&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Ansible vs Puppet&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Ansible vs Chef&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Ansible vs SaltStack&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;visao-geral-das-ferramentas&quot;&gt;Visão Geral das Ferramentas&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ferramenta&lt;&#x2F;th&gt;&lt;th&gt;Tipo&lt;&#x2F;th&gt;&lt;th&gt;Modelo&lt;&#x2F;th&gt;&lt;th&gt;Paradigma&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ansible&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração + Orquestração&lt;&#x2F;td&gt;&lt;td&gt;Push&lt;&#x2F;td&gt;&lt;td&gt;Declarativo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Puppet&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração&lt;&#x2F;td&gt;&lt;td&gt;Pull&lt;&#x2F;td&gt;&lt;td&gt;Declarativo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Chef&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração&lt;&#x2F;td&gt;&lt;td&gt;Pull&lt;&#x2F;td&gt;&lt;td&gt;Procedural&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SaltStack&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração + Orquestração&lt;&#x2F;td&gt;&lt;td&gt;Push&#x2F;Pull&lt;&#x2F;td&gt;&lt;td&gt;Declarativo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Terraform&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Infrastructure as Code&lt;&#x2F;td&gt;&lt;td&gt;Push&lt;&#x2F;td&gt;&lt;td&gt;Declarativo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Pulumi&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Infrastructure as Code&lt;&#x2F;td&gt;&lt;td&gt;Push&lt;&#x2F;td&gt;&lt;td&gt;Imperativo&#x2F;Declarativo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;ansible-vs-puppet&quot;&gt;Ansible vs Puppet&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;sem-agente-vs-com-agente&quot;&gt;Sem Agente vs Com Agente&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;Puppet&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agent&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Não requer (SSH)&lt;&#x2F;td&gt;&lt;td&gt;Requer instalar puppet-agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Porta&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;22 (SSH)&lt;&#x2F;td&gt;&lt;td&gt;8140 (Puppet Master)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Latência&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Maior (SSH overhead)&lt;&#x2F;td&gt;&lt;td&gt;Menor (agente local)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Setup&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mais simples&lt;&#x2F;td&gt;&lt;td&gt;Mais complexo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;dsl-e-legibilidade&quot;&gt;DSL e Legibilidade&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ansible (YAML)&lt;&#x2F;strong&gt; - Mais legível:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Instalar Nginx
  apt:
    name: nginx
    state: present
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Puppet (PP DSL)&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;puppet&quot;&gt;package { &amp;#39;nginx&amp;#39;:
  ensure =&amp;gt; present,
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;casos-de-uso&quot;&gt;Casos de Uso&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Situação&lt;&#x2F;th&gt;&lt;th&gt;Recomendação&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Configuração de servidores novos&lt;&#x2F;td&gt;&lt;td&gt;Ansible&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Gerenciamento contínuo de estado&lt;&#x2F;td&gt;&lt;td&gt;Puppet&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Infraestrutura como código&lt;&#x2F;td&gt;&lt;td&gt;Terraform&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Orquestração de containers&lt;&#x2F;td&gt;&lt;td&gt;Ansible + Kubernetes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ambientes híbriddos Linux&#x2F;Windows&lt;&#x2F;td&gt;&lt;td&gt;Ansible&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;ansible-vs-chef&quot;&gt;Ansible vs Chef&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;modelo-de-execucao&quot;&gt;Modelo de Execução&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;Chef&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Modelo&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Push (controla quando executa)&lt;&#x2F;td&gt;&lt;td&gt;Pull (agentes puxam código)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Execução&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;sob demanda&lt;&#x2F;td&gt;&lt;td&gt;contínua (a cada 30min por padrão)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Idempotência&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;inerente nos módulos&lt;&#x2F;td&gt;&lt;td&gt;garantida por recursos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;abordagem&quot;&gt;Abordagem&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ansible&lt;&#x2F;strong&gt; - Declarativo:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Garantir diretório existe
  file:
    path: &#x2F;opt&#x2F;myapp
    state: directory
    mode: &amp;#39;0755&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Chef&lt;&#x2F;strong&gt; - Procedural (você descreve como):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ruby&quot;&gt;directory &amp;#39;&#x2F;opt&#x2F;myapp&amp;#39; do
  owner &amp;#39;root&amp;#39;
  group &amp;#39;root&amp;#39;
  mode &amp;#39;0755&amp;#39;
  action :create
end
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;ansible-vs-saltstack&quot;&gt;Ansible vs SaltStack&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;similaridades&quot;&gt;Similaridades&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Ambos suportam SSH como transporte&lt;&#x2F;li&gt;
&lt;li&gt;Ambos usam YAML para configuração&lt;&#x2F;li&gt;
&lt;li&gt;Ambos têm arquitetura master&#x2F;agent (Salt) ou pure push (Ansible)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;diferencas&quot;&gt;Diferenças&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;SaltStack&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agente&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Opcional (requer se usar pull mode)&lt;&#x2F;td&gt;&lt;td&gt;Recomendado (always-on)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Performance&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Lento para pequenas tasks&lt;&#x2F;td&gt;&lt;td&gt;Muito rápido (ZeroMQ)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Curva de aprendizado&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Menor&lt;&#x2F;td&gt;&lt;td&gt;Maior&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Comunidade&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Maior&lt;&#x2F;td&gt;&lt;td&gt;Menor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;ansible-vs-terraform&quot;&gt;Ansible vs Terraform&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;diferenca-fundamental&quot;&gt;Diferença Fundamental&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;Terraform&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Propósito&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração de SO e apps&lt;&#x2F;td&gt;&lt;td&gt;Infraestrutura (IaaS)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Estado&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stateless (idempotente)&lt;&#x2F;td&gt;&lt;td&gt;Statefull (mantém estado)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ordem&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Tasks&#x2F;Plays&lt;&#x2F;td&gt;&lt;td&gt;Plan&#x2F;Apply&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Recursos&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Módulos (~2500)&lt;&#x2F;td&gt;&lt;td&gt;Providers (~1000)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;quando-usar-cada-um&quot;&gt;Quando Usar Cada Um&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Terraform - Criar infraestrutura
terraform apply -var=&amp;quot;environment=prod&amp;quot;

# Ansible - Configurar após criar
ansible-playbook -i inventory.py site.yml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;integracao-ansible-terraform&quot;&gt;Integração Ansible + Terraform&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Terraform chama Ansible após criar VMs
resource &amp;quot;null_resource&amp;quot; &amp;quot;ansible&amp;quot; {
  provisioner &amp;quot;local-exec&amp;quot; {
    command = &amp;quot;ansible-playbook -i &amp;#39;${aws_instance.web.public_ip},&amp;#39; site.yml&amp;quot;
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;ansible-vs-pulumi&quot;&gt;Ansible vs Pulumi&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;abordagem-1&quot;&gt;Abordagem&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;Pulumi&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Linguagem&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;YAML&lt;&#x2F;td&gt;&lt;td&gt;Python, TypeScript, Go, C#&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Paradigma&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Declarativo YAML&lt;&#x2F;td&gt;&lt;td&gt;Imperativo&#x2F;Declarativo com linguagem&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Estado&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Não mantém&lt;&#x2F;td&gt;&lt;td&gt;Mantém estado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Debugging&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Limitado&lt;&#x2F;td&gt;&lt;td&gt;Full IDE support&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;matriz-de-decisao&quot;&gt;Matriz de Decisão&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;                         ┌─────────────────────┐
                         │  O QUE VOCÊ PRECISA? │
                         └──────────┬──────────┘
                                    │
                    ┌───────────────┼───────────────┐
                    ▼               ▼               ▼
           ┌──────────────┐  ┌─────────────┐  ┌────────────┐
           │ Infraestrutura│  │ Configuração│  │Orquestração│
           │ (VMs, Redes) │  │   (SO, App) │  │ (Containers│
           │              │  │             │  │  , Deploy) │
           └──────┬───────┘  └──────┬──────┘  └─────┬──────┘
                  │                  │               │
                  ▼                  ▼               ▼
            ┌──────────┐      ┌──────────┐    ┌──────────┐
            │Terraform │      │ Ansible  │    │ Ansible  │
            │Pulumi    │      │ Puppet   │    │ K8s     │
            │          │      │ Chef     │    │ Docker  │
            │          │      │ Salt     │    │ Swarm   │
            └──────────┘      └──────────┘    └──────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;tabela-comparativa-tecnica&quot;&gt;Tabela Comparativa Técnica&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Característica&lt;&#x2F;th&gt;&lt;th&gt;Ansible&lt;&#x2F;th&gt;&lt;th&gt;Puppet&lt;&#x2F;th&gt;&lt;th&gt;Chef&lt;&#x2F;th&gt;&lt;th&gt;Salt&lt;&#x2F;th&gt;&lt;th&gt;Terraform&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Linguagem&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;YAML&lt;&#x2F;td&gt;&lt;td&gt;Ruby PP&lt;&#x2F;td&gt;&lt;td&gt;Ruby&lt;&#x2F;td&gt;&lt;td&gt;YAML&lt;&#x2F;td&gt;&lt;td&gt;HCL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agentless&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Não&lt;&#x2F;td&gt;&lt;td&gt;Não&lt;&#x2F;td&gt;&lt;td&gt;Opcional&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Licença&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;GPLv3&lt;&#x2F;td&gt;&lt;td&gt;Apache&lt;&#x2F;td&gt;&lt;td&gt;Apache&lt;&#x2F;td&gt;&lt;td&gt;Apache&lt;&#x2F;td&gt;&lt;td&gt;BSL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Comunidade&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Muito Grande&lt;&#x2F;td&gt;&lt;td&gt;Grande&lt;&#x2F;td&gt;&lt;td&gt;Média&lt;&#x2F;td&gt;&lt;td&gt;Média&lt;&#x2F;td&gt;&lt;td&gt;Muito Grande&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Curva de Aprendizado&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Baixa&lt;&#x2F;td&gt;&lt;td&gt;Média&lt;&#x2F;td&gt;&lt;td&gt;Média&lt;&#x2F;td&gt;&lt;td&gt;Alta&lt;&#x2F;td&gt;&lt;td&gt;Baixa&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Idempotência&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Suporte Windows&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bom&lt;&#x2F;td&gt;&lt;td&gt;Bom&lt;&#x2F;td&gt;&lt;td&gt;Bom&lt;&#x2F;td&gt;&lt;td&gt;Bom&lt;&#x2F;td&gt;&lt;td&gt;Médio&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Suporte Network&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bom&lt;&#x2F;td&gt;&lt;td&gt;Limitado&lt;&#x2F;td&gt;&lt;td&gt;Limitado&lt;&#x2F;td&gt;&lt;td&gt;Limitado&lt;&#x2F;td&gt;&lt;td&gt;Médio&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Execução Paralela&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Paralelo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dry Run&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Sim&lt;&#x2F;td&gt;&lt;td&gt;Plan&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resumo&quot;&gt;Resumo&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Use Ansible quando:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Precisa de configuração de servidores sem agente&lt;&#x2F;li&gt;
&lt;li&gt;Já conhece YAML&lt;&#x2F;li&gt;
&lt;li&gt;Precisa de orquestração (multi-tier apps)&lt;&#x2F;li&gt;
&lt;li&gt;Quer simplicidade de uso&lt;&#x2F;li&gt;
&lt;li&gt;Tem ambiente híbrido Linux&#x2F;Windows&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Use Terraform quando:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Foco em infraestrutura como código (IaaS)&lt;&#x2F;li&gt;
&lt;li&gt;Precisa criar&#x2F;destruuir infraestrutura completa&lt;&#x2F;li&gt;
&lt;li&gt;Usa múltiplos provedores cloud&lt;&#x2F;li&gt;
&lt;li&gt;Precisa manter estado de infraestrutura&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Use Puppet&#x2F;Chef quando:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Tem ambiente enterprise consolidado&lt;&#x2F;li&gt;
&lt;li&gt;Precisa de compliance contínuo&lt;&#x2F;li&gt;
&lt;li&gt;Tem equipe dedicada de DevOps&lt;&#x2F;li&gt;
&lt;li&gt;Prefere arquitetura pull-established&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;&#x2F;strong&gt; Muitos times usam Terraform + Ansible juntos: Terraform cria infraestrutura, Ansible configura os sistemas.&lt;&#x2F;p&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visão Geral das Ferramentas&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ansible vs Puppet&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ansible vs Chef&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ansible vs SaltStack&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Visão Geral das Ferramentas&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Ansible vs Puppet&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Ansible vs Chef&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparacao&#x2F;&quot;&gt;Ad-hoc vs Playbook&lt;&#x2F;a&gt; — quando usar um comando ad-hoc e quando escrever um playbook: as duas…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;arquitetura&#x2F;&quot;&gt;Arquitetura do Ansible&lt;&#x2F;a&gt; — arquitetura do Ansible - Control Node, Managed Nodes, Módulos, Inventário…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;casos-de-uso&#x2F;&quot;&gt;Cases de Uso&lt;&#x2F;a&gt; — casos de uso Ansible&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparativo-ferramentas&#x2F;&quot;&gt;Comparativo Ferramentas&lt;&#x2F;a&gt; — comparando Ansible com outras ferramentas&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;Ansible — Getting started&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;reference_appendices&#x2F;glossary.html&quot;&gt;Ansible — Glossary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>O que é Ansible?</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/o-que-e-ansible/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/o-que-e-ansible/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/o-que-e-ansible/">&lt;h1 id=&quot;o-que-e-ansible&quot;&gt;O que é Ansible?&lt;&#x2F;h1&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;O que você vai aprender&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Definição&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Filosofia&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;Características Principais&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reproduzir o que a página mostra sobre &lt;strong&gt;História e Evolução&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reconhecer, em um playbook alheio, onde cada um desses recursos foi usado&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;definicao&quot;&gt;Definição&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Ansible&lt;&#x2F;strong&gt; é uma ferramenta de &lt;strong&gt;automatização de TI&lt;&#x2F;strong&gt; open-source que permite configurar sistemas, implementar software e orquestrar tarefas complexas de infraestrutura. Foi criada por Michael DeHaan em 2012 e adquirida pela Red Hat em 2015.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;filosofia&quot;&gt;Filosofia&lt;&#x2F;h2&gt;
&lt;p&gt;O Ansible segue princípios fundamentais:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Simplicidade&lt;&#x2F;strong&gt; - YAML legível por humanos para automação&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Agentless&lt;&#x2F;strong&gt; - Não requer agente instalado nos nodes gerenciados&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Idempotência&lt;&#x2F;strong&gt; - Executar múltiplas vezes produz o mesmo resultado&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Push-based&lt;&#x2F;strong&gt; - Control node envia configurações para nodes&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;caracteristicas-principais&quot;&gt;Características Principais&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;sem-agentes-para-instalar&quot;&gt;Sem Agentes para Instalar&lt;&#x2F;h3&gt;
&lt;p&gt;Diferente de outras ferramentas como Puppet ou Chef, o Ansible não requer software-agent instalado nos servidores gerenciados. A comunicação acontece via &lt;strong&gt;SSH&lt;&#x2F;strong&gt; (Linux&#x2F;Unix) ou &lt;strong&gt;WinRM&lt;&#x2F;strong&gt; (Windows).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;linguagem-declarativa&quot;&gt;Linguagem Declarativa&lt;&#x2F;h3&gt;
&lt;p&gt;Playbooks Ansible usam &lt;strong&gt;YAML&lt;&#x2F;strong&gt;, uma linguagem legível que descreve o estado desejado da infraestrutura:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Exemplo: Garantir que Nginx está instalado
- name: Instalar Nginx
  apt:
    name: nginx
    state: present
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;push-vs-pull&quot;&gt;Push vs Pull&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Modelo&lt;&#x2F;th&gt;&lt;th&gt;Ferramentas&lt;&#x2F;th&gt;&lt;th&gt;Como Funciona&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Push&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Ansible&lt;&#x2F;td&gt;&lt;td&gt;Control node envia comandos para nodes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Pull&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Puppet, Chef&lt;&#x2F;td&gt;&lt;td&gt;Nodes puxam configuração de servidor central&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;historia-e-evolucao&quot;&gt;História e Evolução&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ano&lt;&#x2F;th&gt;&lt;th&gt;Evento&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2012&lt;&#x2F;td&gt;&lt;td&gt;Michael DeHaan cria Ansible&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2013&lt;&#x2F;td&gt;&lt;td&gt;Lançamento público no GitHub&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015&lt;&#x2F;td&gt;&lt;td&gt;Red Hat adquire Ansible&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2019&lt;&#x2F;td&gt;&lt;td&gt;Ansible AWX lançado (versão open source do Tower)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2022&lt;&#x2F;td&gt;&lt;td&gt;Ansible 2.10+ com Collections&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;casos-de-uso&quot;&gt;Casos de Uso&lt;&#x2F;h2&gt;
&lt;p&gt;O Ansible pode ser usado para:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Provisionamento&lt;&#x2F;strong&gt; - Criar VMs, containers, recursos cloud&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gerenciamento de Configuração&lt;&#x2F;strong&gt; - Manter estado consistente de sistemas&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deploy de Aplicações&lt;&#x2F;strong&gt; - Automatizar pipelines de release&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Orquestração&lt;&#x2F;strong&gt; - Coordenar múltiplas tarefas em múltiplos servidores&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Segurança e Compliance&lt;&#x2F;strong&gt; - Aplicar políticas de segurança&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;quando-nao-usar-ansible&quot;&gt;Quando NÃO Usar Ansible&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Necessidade de &lt;strong&gt;execução em tempo real&lt;&#x2F;strong&gt; (Ansible não é contínuo)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Processamento de dados&lt;&#x2F;strong&gt; massivo (não é um framework de processamento)&lt;&#x2F;li&gt;
&lt;li&gt;Infraestrutura Windows muito complexa (há limitações)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;proximos-passos&quot;&gt;Próximos Passos&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;&#x2F;strong&gt; Agora que você entende o que é Ansible, prossiga para a página de &lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;arquitetura&#x2F;&quot;&gt;Arquitetura&lt;&#x2F;a&gt; para entender como os componentes funcionam juntos.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exercicio&quot;&gt;Exercício&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Explore a instalação do Ansible&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Verifique se o Ansible está instalado no seu sistema&lt;&#x2F;li&gt;
&lt;li&gt;Execute &lt;code&gt;ansible --version&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Observe a versão do Python utilizada&lt;&#x2F;li&gt;
&lt;li&gt;Liste os módulos disponíveis com &lt;code&gt;ansible-doc -l | head -20&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Você aprendeu&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Definição&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Filosofia&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Características Principais&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;História e Evolução&lt;&#x2F;strong&gt; — com exemplo pronto para copiar&lt;&#x2F;li&gt;
&lt;li&gt;Todo exemplo desta página deve ser idempotente: rodar duas vezes não pode relatar &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Perguntas para reflexão&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;Que problema &lt;strong&gt;Definição&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Filosofia&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Que problema &lt;strong&gt;Características Principais&lt;&#x2F;strong&gt; resolve, e em que situação você recorreria a isso?&lt;&#x2F;li&gt;
&lt;li&gt;Qual dos exemplos desta página você reescreveria de memória, sem consultar?&lt;&#x2F;li&gt;
&lt;li&gt;Rodando duas vezes, algum exemplo desta página relataria &lt;code&gt;changed&lt;&#x2F;code&gt; na segunda?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-tip&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Desafio: rode duas vezes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;p&gt;Rode os exemplos desta página numa máquina de teste e depois rode de novo, sem alterar nada.&lt;&#x2F;p&gt;
&lt;p&gt;Se a segunda execução relatar &lt;code&gt;changed&lt;&#x2F;code&gt;, alguma task não é idempotente — e descobrir qual, com o exemplo pequeno desta página, é bem mais barato do que descobrir num playbook de produção.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparacao&#x2F;&quot;&gt;Ad-hoc vs Playbook&lt;&#x2F;a&gt; — quando usar um comando ad-hoc e quando escrever um playbook: as duas…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;arquitetura&#x2F;&quot;&gt;Arquitetura do Ansible&lt;&#x2F;a&gt; — arquitetura do Ansible - Control Node, Managed Nodes, Módulos, Inventário…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;casos-de-uso&#x2F;&quot;&gt;Cases de Uso&lt;&#x2F;a&gt; — casos de uso Ansible&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparativo-ferramentas&#x2F;&quot;&gt;Comparativo Ferramentas&lt;&#x2F;a&gt; — comparando Ansible com outras ferramentas&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;Ansible — Getting started&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;reference_appendices&#x2F;glossary.html&quot;&gt;Ansible — Glossary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="pt">
        <title>Terminologia Ansible</title>
        <published>2024-01-01T00:00:00+00:00</published>
        <updated>2024-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/terminologia/"/>
        <id>https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/terminologia/</id>
        
        <content type="html" xml:base="https://pages.singularjourney.org/devjonatas/guia-ansible/introducao/terminologia/">&lt;h1 id=&quot;terminologia-ansible&quot;&gt;Terminologia Ansible&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;conceitos-fundamentais&quot;&gt;Conceitos Fundamentais&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;playbook&quot;&gt;Playbook&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Playbook&lt;&#x2F;strong&gt; é um arquivo YAML que descreve a automação desejada. Contém uma ou mais &lt;strong&gt;plays&lt;&#x2F;strong&gt; (peças).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;---
- name: Meu primeiro playbook
  hosts: webservers
  tasks:
    - name: Instalar Nginx
      apt:
        name: nginx
        state: present
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;play&quot;&gt;Play&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Play&lt;&#x2F;strong&gt; é um bloco dentro do playbook que mapeia hosts para tasks.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Configurar webservers      # Nome do play
  hosts: webservers                # Quais hosts
  become: yes                       # Executar como root

  tasks:                            # Lista de tasks
    - name: Instalar nginx
      apt:
        name: nginx
        state: present
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;task&quot;&gt;Task&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Task&lt;&#x2F;strong&gt; é a unidade mínima de trabalho, combina um módulo com argumentos.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;tasks:
  - name: Copiar configuração          # Nome descritivo
    template:                          # Módulo
      src: nginx.conf.j2              # Argumento
      dest: &#x2F;etc&#x2F;nginx&#x2F;nginx.conf     # Argumento
    notify: Restart Nginx             # Handler trigger
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;module-modulo&quot;&gt;Module (Módulo)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Módulo&lt;&#x2F;strong&gt; é o código executável que realiza a ação. Ansible vem com +2500 módulos embutidos.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Módulo&lt;&#x2F;th&gt;&lt;th&gt;Função&lt;&#x2F;th&gt;&lt;th&gt;Exemplo&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;apt&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;yum&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Instalar pacotes&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;apt: name=vim state=present&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;copy&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Copiar arquivos&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;copy: src=file dest=&#x2F;tmp&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;file&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Criar arquivos&#x2F;dirs&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;file: path=&#x2F;tmp mode=0755 state=directory&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Gerenciar serviços&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;service: name=nginx state=started&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;command&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Executar comando&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;command: &#x2F;usr&#x2F;bin&#x2F;uptime&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;shell&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Executar shell&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;shell: cat &#x2F;etc&#x2F;os-release&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;handler&quot;&gt;Handler&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Handler&lt;&#x2F;strong&gt; é uma task especial executada apenas quando notificada.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;handlers:
  - name: Restart Nginx
    service:
      name: nginx
      state: restarted

tasks:
  - name: Copiar config
    template:
      src: nginx.conf.j2
      dest: &#x2F;etc&#x2F;nginx&#x2F;nginx.conf
    notify: Restart Nginx      # Dispara o handler
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;role&quot;&gt;Role&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Role&lt;&#x2F;strong&gt; é uma estrutura de diretórios autocontida para organizar playbooks.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;roles&#x2F;
└── nginx&#x2F;
    ├── tasks&#x2F;
    │   └── main.yml
    ├── handlers&#x2F;
    │   └── main.yml
    ├── templates&#x2F;
    │   └── nginx.conf.j2
    ├── vars&#x2F;
    │   └── main.yml
    └── defaults&#x2F;
        └── main.yml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;collection&quot;&gt;Collection&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Collection&lt;&#x2F;strong&gt; é o formato de distribuição do Ansible 2.9+.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;namespace&#x2F;
└── collection_name&#x2F;
    ├── plugins&#x2F;
    │   └── modules&#x2F;
    ├── roles&#x2F;
    ├── playbooks&#x2F;
    └── README.md
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;inventory-inventario&quot;&gt;Inventory (Inventário)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Inventário&lt;&#x2F;strong&gt; lista os hosts gerenciados.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;# INI format
[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com

[datacenter:children]
webservers
dbservers
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# YAML format
all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;facts-fatos&quot;&gt;Facts (Fatos)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Facts&lt;&#x2F;strong&gt; são informações coletadas automaticamente sobre cada host.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Coletar facts
ansible all -m setup
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Acessar facts
- debug:
    var: ansible_facts[&amp;#39;distribution&amp;#39;]

- debug:
    var: ansible_facts[&amp;#39;default_ipv4&amp;#39;][&amp;#39;address&amp;#39;]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;variables-variaveis&quot;&gt;Variables (Variáveis)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Variáveis&lt;&#x2F;strong&gt; armazenam valores para usar nos playbooks.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Definição
vars:
  http_port: 80
  app_name: myapp

# Uso
- name: Configurar Nginx
  template:
    src: &amp;quot;{{ app_name }}.conf.j2&amp;quot;
    dest: &#x2F;etc&#x2F;nginx&#x2F;conf.d&#x2F;{{ http_port }}.conf
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;jinja2-template&quot;&gt;Jinja2 Template&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Template Jinja2&lt;&#x2F;strong&gt; permite interpolação de variáveis.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;jinja2&quot;&gt;# template.conf.j2
server {
    listen {{ http_port }};
    server_name {{ domain_name }};

    {% if enable_ssl %}
    ssl_certificate {{ ssl_cert_path }};
    ssl_certificate_key {{ ssl_key_path }};
    {% endif %}
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;idempotencia&quot;&gt;Idempotência&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Idempotência&lt;&#x2F;strong&gt; significa que executar a mesma task múltiplas vezes produz o mesmo resultado.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Idempotente - resultado sempre o mesmo
- name: Garantir Nginx instalado
  apt:
    name: nginx
    state: present

# NÃO idempotente - pode mudar algo toda vez
- name: Instalar versão específica
  apt:
    name: nginx=1.18.0
    state: present
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;ansible-vault&quot;&gt;Ansible Vault&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ansible Vault&lt;&#x2F;strong&gt; criptografa dados sensíveis.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Criar arquivo criptografado
ansible-vault create secrets.yml

# Editar
ansible-vault edit secrets.yml

# Executar playbook com vault
ansible-playbook site.yml --ask-vault-pass
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;strategy-estrategia&quot;&gt;Strategy (Estratégia)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Strategy&lt;&#x2F;strong&gt; controla como tasks são executadas entre hosts.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estratégia&lt;&#x2F;th&gt;&lt;th&gt;Comportamento&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;linear&lt;&#x2F;code&gt; (padrão)&lt;&#x2F;td&gt;&lt;td&gt;Todos os hosts executam a mesma task antes de avançar&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;free&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cada host executa o mais rápido possível&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;debug&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Executa task por task para debug&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Exemplo com strategy free
  hosts: all
  strategy: free
  tasks:
    - name: Long running task
      command: &#x2F;usr&#x2F;bin&#x2F;long-operation
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;tags-etiquetas&quot;&gt;Tags (Etiquetas)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Tags&lt;&#x2F;strong&gt; permitem selecionar subset de tasks para executar.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;tasks:
  - name: Instalar dependências
    apt:
      name: &amp;quot;{{ packages }}&amp;quot;
    tags: [install, packages]

  - name: Configurar aplicação
    template:
      src: app.conf.j2
      dest: &#x2F;etc&#x2F;app.conf
    tags: [config]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Executar apenas tasks com tag &amp;#39;install&amp;#39;
ansible-playbook site.yml --tags install

# Pular tasks com tag &amp;#39;config&amp;#39;
ansible-playbook site.yml --skip-tags config
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;condition-condicao&quot;&gt;Condition (Condição)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;When&lt;&#x2F;strong&gt; executa task apenas se condição for verdadeira.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Instalar Nginx apenas no Debian&#x2F;Ubuntu
  apt:
    name: nginx
    state: present
  when: ansible_facts[&amp;#39;os_family&amp;#39;] == &amp;quot;Debian&amp;quot;

- name: Instalar HTTPD apenas no RHEL&#x2F;CentOS
  yum:
    name: httpd
    state: present
  when: ansible_facts[&amp;#39;os_family&amp;#39;] == &amp;quot;RedHat&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;loop-laco&quot;&gt;Loop (Laço)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Loop&lt;&#x2F;strong&gt; executa task múltiplas vezes com valores diferentes.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# with_items (sintaxe antiga)
- name: Instalar múltiplos pacotes
  apt:
    name: &amp;quot;{{ item }}&amp;quot;
    state: present
  with_items:
    - nginx
    - vim
    - curl

# loop (sintaxe moderna)
- name: Criar usuários
  user:
    name: &amp;quot;{{ item }}&amp;quot;
    state: present
  loop:
    - john
    - jane
    - admin
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;block&quot;&gt;Block&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Block&lt;&#x2F;strong&gt; agrupa tasks para tratamento de erros.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;tasks:
  - name: Bloco principal
    block:
      - name: Tentar instalar pacote
        apt:
          name: &amp;quot;{{ package_name }}&amp;quot;
          state: present

    rescue:
      - name: Se falhar, instalar dependências
        apt:
          name: &amp;quot;{{ package_name }}-dev&amp;quot;
          state: present

    always:
      - name: Sempre limpar cache
        file:
          path: &#x2F;tmp&#x2F;cache
          state: absent
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;become-escalacao-de-privilegio&quot;&gt;Become (Escalação de Privilégio)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Become&lt;&#x2F;strong&gt; executa como outro usuário (sudo&#x2F;su).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;# Nível de playbook
- name: Play que requer root
  hosts: webservers
  become: yes                    # Ativar become
  become_user: www-data          # Como qual usuário
  become_method: sudo            # Método de escalação

  tasks:
    - name: Criar arquivo no diretório web
      file:
        path: &#x2F;var&#x2F;www&#x2F;html&#x2F;file
        state: touch
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;delegate-to&quot;&gt;Delegate_to&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Delegate_to&lt;&#x2F;strong&gt; executa task em outro host.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Adicionar host ao load balancer
  hosts: webservers
  tasks:
    - name: Registrar no HAProxy
      haproxy:
        backend: app
        host: &amp;quot;{{ inventory_hostname }}&amp;quot;
        state: present
      delegate_to: lb01.example.com
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;run-once&quot;&gt;Run Once&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Run Once&lt;&#x2F;strong&gt; executa task apenas no primeiro host.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;- name: Executar apenas uma vez
  hosts: webservers
  tasks:
    - name: Criar banco de dados
      postgresql_db:
        name: myapp
        state: present
      run_once: true
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;&#x2F;strong&gt; Consulte o &lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;glossario&#x2F;&quot;&gt;Glossário&lt;&#x2F;a&gt; completo para referência de todos os termos Ansible.&lt;&#x2F;p&gt;
&lt;div class=&quot;callout callout-info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;&lt;strong&gt;Leia também&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
  &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparacao&#x2F;&quot;&gt;Ad-hoc vs Playbook&lt;&#x2F;a&gt; — quando usar um comando ad-hoc e quando escrever um playbook: as duas…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;arquitetura&#x2F;&quot;&gt;Arquitetura do Ansible&lt;&#x2F;a&gt; — arquitetura do Ansible - Control Node, Managed Nodes, Módulos, Inventário…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;casos-de-uso&#x2F;&quot;&gt;Cases de Uso&lt;&#x2F;a&gt; — casos de uso Ansible&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pages.singularjourney.org&#x2F;devjonatas&#x2F;guia-ansible&#x2F;introducao&#x2F;comparativo-ferramentas&#x2F;&quot;&gt;Comparativo Ferramentas&lt;&#x2F;a&gt; — comparando Ansible com outras ferramentas&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;Ansible — Getting started&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;projects&#x2F;ansible&#x2F;latest&#x2F;reference_appendices&#x2F;glossary.html&quot;&gt;Ansible — Glossary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
</feed>
