{"id":782,"date":"2026-09-07T12:29:23","date_gmt":"2026-09-07T15:29:23","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/primeiros-passos-com-ansible\/"},"modified":"2026-09-08T10:54:44","modified_gmt":"2026-09-08T13:54:44","slug":"primeiros-passos-com-ansible","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/primeiros-passos-com-ansible\/","title":{"rendered":"Primeiros passos com Ansible"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro aplicando um playbook no laptop, cabos ligando tr\u00eas servidores, logo do Ansible na parede\" src=\"\/wp-content\/uploads\/2026\/09\/primeiros-passos-com-ansible-v3.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Se voc\u00ea ainda configura servidor na m\u00e3o \u2014 entra por SSH, edita arquivo, instala pacote, repete tudo na m\u00e1quina seguinte \u2014, o <strong>Ansible<\/strong> \u00e9 a ferramenta que vai aposentar esse ritual. Ele descreve o estado desejado das suas m\u00e1quinas em arquivos YAML leg\u00edveis, aplica tudo via SSH sem instalar agente nenhum nos servidores, e pode rodar mil vezes que o resultado \u00e9 o mesmo. Neste guia voc\u00ea vai instalar o Ansible no Ubuntu, entender a estrutura de pastas de um projeto e rodar seus primeiros comandos e playbooks \u2014 e, de quebra, conhecer a hist\u00f3ria curiosa de como ele nasceu.<\/p>\n<h2>Como nasceu o Ansible<\/h2>\n<p>O Ansible foi criado em <strong>fevereiro de 2012<\/strong> por <strong>Michael DeHaan<\/strong>, um engenheiro que conhecia o problema de perto: na Red Hat, ele havia criado o <strong>Cobbler<\/strong> (provisionamento de servidores) e trabalhado no <strong>Func<\/strong> (execu\u00e7\u00e3o remota de comandos). A experi\u00eancia com essas ferramentas \u2014 e com a complexidade dos concorrentes da \u00e9poca, Puppet e Chef, que exigiam agentes instalados e linguagens pr\u00f3prias \u2014 moldou os tr\u00eas princ\u00edpios do projeto: <strong>sem agente<\/strong> (s\u00f3 SSH e Python, que j\u00e1 existem em qualquer servidor Linux), <strong>YAML leg\u00edvel<\/strong> em vez de linguagem de programa\u00e7\u00e3o, e curva de aprendizado m\u00ednima.<\/p>\n<p>At\u00e9 o nome tem uma boa hist\u00f3ria: <em>ansible<\/em> \u00e9 o comunicador instant\u00e2neo interplanet\u00e1rio da fic\u00e7\u00e3o cient\u00edfica \u2014 termo cunhado por <strong>Ursula K. Le Guin<\/strong> em 1966 e popularizado por <em>O Jogo do Exterminador<\/em>, de Orson Scott Card. A met\u00e1fora \u00e9 perfeita: comandar m\u00e1quinas distantes instantaneamente, sem intermedi\u00e1rios.<\/p>\n<p>O projeto explodiu em ado\u00e7\u00e3o, virou empresa (AnsibleWorks, depois Ansible Inc.) e, em <strong>outubro de 2015<\/strong>, foi <strong>comprado pela Red Hat<\/strong> \u2014 que o mant\u00e9m open source at\u00e9 hoje. Do ecossistema vieram o <strong>Ansible Galaxy<\/strong> (reposit\u00f3rio de roles e collections prontas) e o <strong>AWX\/Ansible Automation Platform<\/strong> (interface web e orquestra\u00e7\u00e3o corporativa). Hoje o n\u00facleo vive no pacote <code>ansible-core<\/code>, e o pacote <code>ansible<\/code> completo agrega as collections da comunidade.<\/p>\n<h2>Instalando no Ubuntu<\/h2>\n<p>O jeito mais simples \u00e9 pelo reposit\u00f3rio oficial do Ubuntu:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install ansible -y\nansible --version\n<\/code><\/pre>\n<p>Para ter uma vers\u00e3o mais recente que a dos reposit\u00f3rios, use o PPA oficial do projeto:<\/p>\n<pre><code class=\"language-bash\">sudo add-apt-repository --yes --update ppa:ansible\/ansible\nsudo apt install ansible -y\n<\/code><\/pre>\n<p>Uma terceira via, boa para quem quer isolar a instala\u00e7\u00e3o do sistema, \u00e9 o <code>pipx<\/code>:<\/p>\n<pre><code class=\"language-bash\">sudo apt install pipx -y\npipx install --include-deps ansible\npipx ensurepath   # abra um novo terminal depois deste comando\n<\/code><\/pre>\n<p>Importante: o Ansible s\u00f3 precisa estar instalado na <strong>sua m\u00e1quina<\/strong> (o &#8220;control node&#8221;). Nos servidores gerenciados basta haver SSH e Python \u2014 nada de agente, nada de daemon.<\/p>\n<h2>A estrutura de pastas de um projeto<\/h2>\n<p>O Ansible funciona a partir de qualquer diret\u00f3rio, mas adotar a estrutura convencional desde o primeiro dia evita retrabalho. Um projeto t\u00edpico:<\/p>\n<pre><code class=\"language-bash\">meu-projeto\/\n\u251c\u2500\u2500 ansible.cfg          # configura\u00e7\u00e3o local do projeto\n\u251c\u2500\u2500 inventory.ini        # invent\u00e1rio: quais m\u00e1quinas gerenciar\n\u251c\u2500\u2500 site.yml             # playbook principal\n\u251c\u2500\u2500 group_vars\/          # vari\u00e1veis por grupo de hosts\n\u2502   \u2514\u2500\u2500 webservers.yml\n\u251c\u2500\u2500 host_vars\/           # vari\u00e1veis por host individual\n\u2502   \u2514\u2500\u2500 web01.yml\n\u2514\u2500\u2500 roles\/               # unidades reutiliz\u00e1veis de automa\u00e7\u00e3o\n    \u2514\u2500\u2500 nginx\/\n        \u251c\u2500\u2500 tasks\/main.yml      # o que fazer\n        \u251c\u2500\u2500 handlers\/main.yml   # rea\u00e7\u00f5es (ex.: restart do servi\u00e7o)\n        \u251c\u2500\u2500 templates\/          # arquivos .j2 (Jinja2)\n        \u251c\u2500\u2500 files\/              # arquivos est\u00e1ticos para copiar\n        \u251c\u2500\u2500 defaults\/main.yml   # vari\u00e1veis com valores padr\u00e3o\n        \u2514\u2500\u2500 vars\/main.yml       # vari\u00e1veis fixas da role\n<\/code><\/pre>\n<p>O essencial de cada pe\u00e7a:<\/p>\n<ul>\n<li><strong>ansible.cfg<\/strong> \u2014 configura\u00e7\u00f5es do projeto (qual invent\u00e1rio usar, usu\u00e1rio SSH padr\u00e3o etc.). O Ansible l\u00ea o do diret\u00f3rio atual antes do global;<\/li>\n<li><strong>Invent\u00e1rio<\/strong> \u2014 a lista de m\u00e1quinas, simples assim: grupos entre colchetes, hosts embaixo;<\/li>\n<li><strong>Playbook<\/strong> \u2014 o roteiro YAML: &#8220;nesses hosts, execute estas tarefas&#8221;;<\/li>\n<li><strong>Roles<\/strong> \u2014 playbooks embalados para reuso: a role <code>nginx<\/code> de um projeto funciona em qualquer outro;<\/li>\n<li><strong>group_vars\/host_vars<\/strong> \u2014 valores que mudam por ambiente (IP do banco, vers\u00e3o do pacote), separados da l\u00f3gica.<\/li>\n<\/ul>\n<h2>Primeiros testes: o ping<\/h2>\n<p>Crie o projeto e um invent\u00e1rio m\u00ednimo:<\/p>\n<pre><code class=\"language-bash\">mkdir meu-projeto && cd meu-projeto\n\ncat &gt; inventory.ini &lt;&lt;'EOF'\n[webservers]\nweb01 ansible_host=192.168.0.10 ansible_user=ubuntu\nEOF\n\ncat &gt; ansible.cfg &lt;&lt;'EOF'\n[defaults]\ninventory = inventory.ini\nhost_key_checking = False   # so para laboratorio; em producao, mantenha a checagem\nEOF\n<\/code><\/pre>\n<p>Garanta que sua chave SSH chegue ao servidor (<code>ssh-copy-id ubuntu@192.168.0.10<\/code>) e teste a comunica\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">ansible all -m ping\n# web01 | SUCCESS =&gt; { \"ping\": \"pong\" }\n<\/code><\/pre>\n<p>Sem servidor \u00e0 m\u00e3o? Teste tudo contra a pr\u00f3pria m\u00e1quina: <code>ansible localhost -m ping<\/code> (no localhost o Ansible usa conex\u00e3o local, nem precisa de SSH). O m\u00f3dulo <code>ping<\/code> n\u00e3o \u00e9 ICMP \u2014 ele confirma que consegue se conectar e executar Python do outro lado, que \u00e9 o que importa.<\/p>\n<h2>Comandos ad-hoc: poder imediato<\/h2>\n<p>Antes de escrever playbooks, voc\u00ea j\u00e1 resolve muita coisa com comandos avulsos:<\/p>\n<pre><code class=\"language-bash\">ansible all -m shell -a \"uptime\"                     # comando em todos os hosts\nansible webservers -m apt -a \"name=htop state=present\" --become   # instalar pacote\nansible all -m setup -a \"filter=ansible_distribution*\"            # coletar fatos\n<\/code><\/pre>\n<p>O <code>--become<\/code> pede sudo do outro lado; <code>-m<\/code> escolhe o m\u00f3dulo e <code>-a<\/code> passa os argumentos.<\/p>\n<h2>O primeiro playbook<\/h2>\n<p>Agora o roteiro completo \u2014 <code>site.yml<\/code>, que instala e garante o Nginx no ar:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Configurar servidores web\n  hosts: webservers\n  become: true\n\n  tasks:\n    - name: Instalar o Nginx\n      ansible.builtin.apt:\n        name: nginx\n        state: present\n        update_cache: true\n\n    - name: Garantir Nginx ativo e habilitado no boot\n      ansible.builtin.service:\n        name: nginx\n        state: started\n        enabled: true\n<\/code><\/pre>\n<p>Execute \u2014 primeiro em modo de simula\u00e7\u00e3o, depois de verdade:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook site.yml --check   # dry-run: mostra o que mudaria\nansible-playbook site.yml           # aplica\n<\/code><\/pre>\n<p>Rode a segunda vez e repare no resumo: <code>changed=0<\/code>. Essa \u00e9 a <strong>idempot\u00eancia<\/strong>, o cora\u00e7\u00e3o do Ansible \u2014 ele n\u00e3o &#8220;executa comandos&#8221;, ele garante estados. Se o Nginx j\u00e1 est\u00e1 instalado e rodando, nada \u00e9 tocado.<\/p>\n<h2>Pr\u00f3ximos passos<\/h2>\n<p>Daqui, os caminhos naturais: transformar o playbook em <strong>role<\/strong> (<code>ansible-galaxy role init roles\/nginx<\/code>), versionar o projeto no Git e explorar m\u00f3dulos no <a href=\"https:\/\/docs.ansible.com\/\" rel=\"noopener\" target=\"_blank\">docs.ansible.com<\/a>. Quando a base estiver confort\u00e1vel, siga para o nosso guia mais avan\u00e7ado \u2014 <a href=\"\/2026\/09\/automatizando-servidores-linux-com-ansible\/\">Automatizando Servidores Linux com Ansible<\/a> \u2014 e, se automa\u00e7\u00e3o virar carreira, o Ansible \u00e9 pe\u00e7a central da <a href=\"\/2026\/09\/certificacao-lpi-devops\/\">certifica\u00e7\u00e3o LPI DevOps Tools Engineer<\/a>.<\/p>\n<p>Instale, fa\u00e7a o ping, rode o playbook duas vezes e veja o <code>changed=0<\/code>: nesse momento voc\u00ea entende por que tanta gente n\u00e3o configura mais servidor na m\u00e3o. \ud83d\udc27<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea ainda configura servidor na m\u00e3o \u2014 entra por SSH, edita arquivo, instala pacote, repete tudo na m\u00e1quina seguinte \u2014, o Ansible \u00e9 a ferramenta que vai aposentar esse ritual. Ele descreve o estado desejado das suas m\u00e1quinas em arquivos YAML leg\u00edveis, aplica tudo via SSH sem instalar agente nenhum nos servidores, e pode &#8230; <a title=\"Primeiros passos com Ansible\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/primeiros-passos-com-ansible\/\" aria-label=\"Read more about Primeiros passos com Ansible\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,2],"tags":[121,122,47,378,5,377],"class_list":["post-782","post","type-post","status-publish","format-standard","hentry","category-devops","category-linux","tag-ansible","tag-automacao","tag-devops","tag-iniciantes","tag-ubuntu","tag-yaml"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=782"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/782\/revisions"}],"predecessor-version":[{"id":1391,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/782\/revisions\/1391"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}