Provisionar 10 VPS com Ansible: Guia Prático em 10 Min

18 min de leitura Infraestrutura
Provisionar 10 VPS com Ansible: Guia Prático em 10 Min

Visão Geral da Automação

No cenário atual de infraestrutura moderna, o provisionamento manual de servidores é um gargalo crítico que compromete a escalabilidade e a segurança. Quando um administrador de sistemas precisa configurar dez novas instâncias VPS, realizar tarefas repetitivas como atualização de pacotes, configuração de firewall, criação de usuários e ajuste de parâmetros do kernel manualmente, ele não apenas perde tempo, mas também introduz o risco de drift de configuração. O drift ocorre quando pequenas variações manuais entre servidores criam uma infraestrutura heterogênio, dificultando o diagnóstico de incidentes e a manutenção preditiva.

A automação via Infrastructure as Code (IaC), utilizando o Ansible, transforma esse processo de uma tarefa de horas em uma execução de minutos. O Ansible opera sob um modelo agentless, o que significa que você não precisa instalar nenhum software cliente nas instâncias de destino; basta que o servidor de controle tenha acesso via SSH. Isso reduz drasticamente a superfície de ataque e o overhead de gerenciamento, pois a comunicação é feita através de protocolos padrão e seguros.

Neste tutorial, abordaremos o uso de Playbooks, que são arquivos YAML que descrevem o estado desejado do seu parque de servidores. Em vez de enviar uma sequência de comandos isolados, você define uma política de configuração. Por exemplo, ao utilizar o módulo apt, você não está apenas executando um comando de instalação, mas declarando que o pacote deve estar presente e em uma versão específica. Se o pacote já estiver instalado, o Ansible identifica a idempotência e não realiza nenhuma ação, garantindo que a execução repetida do script não cause danos ou reinicializações desnecessárias.

Ao final deste guia, você terá a capacidade de gerenciar múltiplos nós simultaneamente, garantindo que cada uma das 10 VPS provisionadas possua exatamente a mesma stack de software, as mesmas regras de segurança e as mesmas otimizações de performance, permitindo que sua infraestrutura cresça de forma previsível e profissional, seguindo os padrões de DevOps exigidos pelo mercado de tecnologia atual.

Conceitos de Ansible e Playbooks

Para dominar o provisionamento em massa, é fundamental entender que o Ansible opera sob o paradigma de agentless. Diferente de ferramentas como Puppet ou Chef, você não precisa instalar nenhum software cliente nas suas 10 VPS de destino; o Ansible utiliza o protocolo SSH para enviar módulos e executar comandos, o que reduz drasticamente a sobrecarga de gerenciamento e a superfície de ataque na sua infraestrutura.

O coração da automação reside no Playbook. Um Playbook é um arquivo escrito em YAML (Yet Another Markup Language) que descreve o estado desejado do seu servidor. Em vez de escrever scripts imperativos (como um Shell Script que diz "faça isso, depois aquilo"), você escreve configurações declarativas. Isso significa que você define que o pacote nginx deve estar instalado, e o Ansible verifica se ele já existe; se estiver presente, ele não faz nada, garantindo a idempotência.

A estrutura de execução do Ansible é composta por três pilares técnicos:

  • Inventory (Inventário): É o arquivo que mapeia seus alvos. Ele contém os endereços IP ou nomes de domínio das suas VPS e pode ser organizado em grupos, como [webservers] ou [db_servers], permitindo aplicar configurações distintas para cada camada da aplicação.
  • Modules (Módulos): São as unidades de trabalho que executam tarefas específicas. Existem módulos para gerenciar pacotes (apt, yum), arquivos (copy, template), usuários (user) e até serviços (systemd). Cada módulo possui parâmetros próprios que determinam a ação exata a ser realizada.
  • Tasks (Tarefas): São as instruções individuais dentro de um Playbook. Cada tarefa invoca um módulo específico para atingir um objetivo, como garantir que um diretório de logs tenha as permissões corretas.

A idempotência é o conceito mais crítico para administradores de sistemas. Quando executamos um Playbook, o Ansible compara o estado atual do servidor com o estado definido no código. Se o servidor já atende aos requisitos, o Ansible reporta status ok; se houver divergência, ele aplica as mudanças e reporta changed. Esse comportamento evita reinicializações desnecessárias de serviços e garante que a execução repetida do mesmo script nunca corrompa a configuração da sua infraestrutura.

Pré-requisitos para Provisionamento

Para garantir que a automação via Ansible ocorra sem interrupções e que o provisionamento em massa seja bem-sucedido, é fundamental que o ambiente de controle e os alvos (os servidores VPS) atendam a requisitos específicos de conectividade e software. A automação de infraestrutura exige um ambiente padronizado para evitar o erro de "drift" de configuração, onde servidores deveriam ser idênticos, mas possuem divergências manuais.

  • Estação de Controle (Control Node): Uma máquina Linux (Ubuntu 22.04 LTS ou superior recomendado) com o Ansible instalado. O Ansible não precisa de agentes nos alvos, mas a máquina que executa os comandos deve ter o Python instalado para gerenciar as bibliotecas de automação.
  • Acesso SSH com Chave Pública: É indispensável que o usuário da estação de controle possua uma chave SSH (RSA ou Ed25519) configurada nos servidores de destino. O uso de senhas em automação de larga escala é inseguro e torna o processo lento devido aos prompts interativos.
  • Python nos Servidores Alvo: Todos os 10 servidores VPS devem possuir o interpretador Python instalado (versão 3.x). O Ansible utiliza o módulo raw ou o módulo python para executar as tarefas de configuração; sem o Python no destino, os módulos avançados não funcionarão.
  • Privilégios de Sudo: O usuário utilizado para a conexão SSH deve ter permissões de sudo sem exigência de senha (passwordless sudo) ou o playbook deve estar preparado para solicitar a senha via --ask-pass. Para automação total, o NOPASSWD no arquivo sudoers é o padrão de mercado.
  • Rede e Conectividade: Os servidores VPS devem estar acessíveis via porta 22 (SSH) a partir do IP da sua estação de controle. Se houver um firewall (como o UFW ou IPTables) ativo, a regra de permissão para o IP de origem deve estar configurada.
  • Endereçamento IP ou DNS: Uma lista atualizada com os endereços IP públicos ou nomes de domínio de todas as 10 instâncias. Sem um identificador único e alcançável, o Ansible não conseguirá mapear o inventário.

Preparando o Ambiente de Controle

Para realizar o provisionamento em massa, você não utilizará as VPS de destino como estação de trabalho, mas sim uma Estação de Controle (Control Node). Este servidor, que pode ser sua máquina local (Linux ou macOS) ou uma instância dedicada na Toda Solução, será o cérebro da operação, onde o Ansible reside e de onde os comandos são disparados para os alvos.

O primeiro passo é garantir que o motor do Ansible esteja instalado e atualizado. Recomenda-se o uso de ambientes virtuais para evitar conflitos com as bibliotecas do sistema operacional.

  1. Atualize os repositórios do seu sistema operacional para garantir que as dependências de compilação estejam presentes.
    sudo apt update && sudo apt upgrade -y
    O comando apt update atualiza a lista de pacotes, enquanto o upgrade aplica as versões mais recentes, evitando erros de dependência durante a instalação do Python.
  2. Instale o gerenciador de pacotes Python e o pip, que é essencial para instalar módulos adicionais do Ansible.
    sudo apt install python3-pip python3-venv -y
    A flag -y responde automaticamente "sim" para todas as confirmações, agilizando o processo de instalação.
  3. Crie um ambiente virtual isolado para o Ansible. Isso evita que atualizações do sistema quebrem seus playbooks de infraestrutura.
    python3 -m venv ansible_env && source ansible_env/bin/activate
    O módulo venv cria o diretório ansible_env, e o comando source ativa o ambiente, garantindo que qualquer pacote instalado via pip fique restrito a este projeto.
  4. Instale o pacote principal do Ansible dentro do ambiente ativado.
    pip install ansible
    Este comando baixa e configura o core do Ansible e suas dependências necessárias para a execução de tarefas remotas via SSH.
  5. Configure a autenticação por chave SSH. O Ansible não deve utilizar senhas para provisionamento, pois isso torna o processo lento e inseguro.
    ssh-keygen -t ed25519 -C "[email protected]"
    A flag -t ed25519 define o algoritmo de criptografia moderno e mais seguro, enquanto a flag -C adiciona um comentário para identificação da chave.

Após gerar a chave, você deve copiar a chave pública para as 10 VPS que serão provisionadas. Utilize o comando ssh-copy-id para cada IP de destino, garantindo que o acesso sem senha seja estabelecido antes de iniciar o playbook.

Criação do Inventário de Servidores

O arquivo de inventário é o coração do Ansible. Sem ele, o motor de automação não sabe quais máquinas deve gerenciar. Para o nosso cenário de provisionamento em massa, utilizaremos o formato INI, que é o mais simples e direto para gerenciar grupos de servidores VPS. O objetivo aqui é agrupar os 10 servidores em um único grupo lógico, permitindo que um único comando execute tarefas em todos eles simultaneamente.

Para organizar nossa infraestrutura, siga os passos abaixo para estruturar o arquivo de hosts:

  1. Crie um diretório dedicado para o projeto de automação para manter a organização dos arquivos de configuração e chaves SSH.
    mkdir provisionamento_vps && cd provisionamento_vps
    O comando mkdir cria o diretório e o cd navega para dentro dele.
  2. Crie o arquivo chamado hosts.ini. Este arquivo conterá os endereços IP de todas as suas instâncias VPS recém-criadas na Toda Solução.
    touch hosts.ini
    O comando touch cria um arquivo vazio para edição posterior.
  3. Defina o grupo de servidores utilizando colchetes. No Ansible, tudo o que estiver dentro de [webservers] será tratado como um único alvo de execução.
    [webservers]
    192.168.1.10
    192.168.1.11
    192.168.1.12
    ...
    192.168.1.19
    Cada linha representa o endereço IP de uma VPS. Para escalar, basta adicionar novos IPs nesta lista.
  4. Configure as variáveis de conexão para o grupo. Em vez de repetir o usuário root ou o caminho da chave SSH para cada IP, definimos variáveis de grupo que se aplicam a todos os membros do grupo [webservers].
    [webservers:vars]
    ansible_user=root
    ansible_ssh_private_key_file=~/.ssh/id_rsa
    ansible_ssh_common_args='-o StrictHostKeyChecking=no'
    A diretiva ansible_user define o usuário de acesso; ansible_ssh_private_key_file aponta para sua chave privada; e a flag StrictHostKeyChecking=no evita que o processo trave pedindo confirmação manual de fingerprint de cada novo servidor.

Ao finalizar, seu arquivo hosts.ini deve estar estruturado de forma que o Ansible consiga identificar o grupo e as credenciais de acesso de forma automática. Essa separação entre a lista de IPs e as variáveis de conexão é o que garante a escalabilidade do seu processo de provisionamento.

Desenvolvimento do Playbook de Configuração

O playbook é o coração da automação. Nele, definimos o estado desejado de cada VPS, transformando tarefas manuais em código declarativo. Para este tutorial, vamos criar um arquivo chamado provision_vps.yml que realiza a atualização do sistema, instalação do Nginx, configuração de firewall e criação de um usuário administrativo.

Nesta etapa, utilizaremos a sintaxe YAML para estruturar as tarefas. O foco será garantir que todos os 10 servidores recebam exatamente a mesma configuração, eliminando o drift de configuração (quando servidores que deveriam ser iguais começam a divergir).

touch provision_vps.yml

O comando touch cria um arquivo vazio para iniciarmos a escrita da nossa automação.

- name: Provisionamento em Massa de VPS
  hosts: webservers
  become: yes

A diretiva name identifica o que o playbook faz. O parâmetro hosts indica qual grupo do seu inventário será alvo, e o become: yes instrui o Ansible a executar as tarefas com privilégios de sudo.

- name: Atualizar cache do APT e upgrade de pacotes
  apt:
    update_cache: yes
    upgrade: dist

O módulo apt gerencia pacotes Debian/Ubuntu. A flag update_cache: yes equivale ao apt update, enquanto o upgrade: dist garante que todas as dependências sejam resolvidas, similar ao apt dist-upgrade.

- name: Instalar Nginx e UFW
  apt:
    name:
      - nginx
      - ufw
    state: present

Ao passar uma lista no parâmetro name, o Ansible instala múltiplos pacotes em uma única transação. O estado present garante que o pacote esteja instalado, mas não faz nada se ele já existir, garantindo a idempotência.

- name: Configurar regras de firewall
  ufw:
    rule: allow
    port: "{{ item }}"
    proto: tcp
  loop:
    - '22'
    - '80'
    - '443'

Utilizamos a diretiva loop para iterar sobre uma lista de portas. O Ansible aplicará a regra allow para SSH (22), HTTP (80) e HTTPS (443) individualmente, garantindo que o acesso ao servidor não seja bloqueado durante o provisionamento.

  1. Crie o arquivo do playbook no seu diretório de controle.
  2. Abra o arquivo com seu editor de texto preferido (Vim, Nano ou VS Code) e defina o cabeçalho do playbook.
  3. Adicione a primeira tarefa para atualizar os repositórios do sistema.
  4. Adicione a instalação do servidor web e do firewall.
  5. Configure as regras de segurança do firewall para permitir apenas tráfego essencial.

Execução do Provisionamento em Massa

Com o inventário configurado e o playbook devidamente estruturado, entramos na fase crítica de execução. O grande diferencial do Ansible aqui é a capacidade de utilizar o forks para processar múltiplos servidores em paralelo, evitando que você tenha que esperar a conclusão de um nó para iniciar o próximo.

  1. Primeiro, realize um teste de conectividade básica utilizando o módulo ping do Ansible. Isso garante que a sua chave SSH está autorizada em todos os 10 servidores da lista do inventário antes de aplicar qualquer alteração estrutural.

    ansible all -m ping

    O comando utiliza o alvo all para abranger todos os hosts do inventário e o módulo ping para validar a comunicação via SSH.

  2. Execute o playbook de provisionamento utilizando o comando ansible-playbook. Para garantir a velocidade desejada, utilizaremos a flag --forks, que define quantos servidores serão configurados simultaneamente.

    ansible-playbook -i inventory.ini setup_vps.yml --forks 10

    A flag --forks 10 instrui o Ansible a abrir 10 processos paralelos, permitindo que o provisionamento dos 10 servidores ocorra quase ao mesmo tempo, reduzindo drasticamente o tempo total de espera.

  3. Caso você utilize uma senha para o usuário sudo nos servidores de destino, adicione a flag --ask-become-pass para que o Ansible solicite a senha de privilégio durante a execução, evitando falhas de permissão por falta de autenticação.

    ansible-playbook -i inventory.ini setup_vps.yml --ask-become-pass

    O parâmetro --ask-become-pass (ou -K) é essencial quando o usuário remoto não possui permissão de sudo sem senha (NOPASSWD) configurada no arquivo sudoers.

  4. Monitore o progresso em tempo real através do terminal. O Ansible exibirá cada tarefa (task) e o status de cada host (ok, changed, failed ou unreachable). Se observar uma cor vermelha, interrompa a execução imediatamente com Ctrl+C para investigar a falha.

Ao final do processo, o terminal exibirá um resumo estatístico. O valor changed indica que as configurações foram aplicadas com sucesso, enquanto unreachable aponta que um dos servidores não pôde ser acessado via rede ou SSH.

Verificação da Infraestrutura

Após a execução do playbook, é fundamental garantir que o provisionamento não apenas terminou com status "success", mas que os serviços e as configurações de segurança foram aplicados corretamente em todos os nós. Não confie apenas no log do Ansible; realize testes de conectividade e integridade localmente.

O primeiro passo é validar o estado de conectividade SSH e a presença dos usuários criados através do módulo user. Utilize o comando ansible com o parâmetro ping para testar o módulo de comunicação em todo o grupo definido no seu inventário.

ansible all -m ping</code<></pre>

<p>O output esperado deve retornar <strong>pong</strong> para cada endereço IP listado no seu arquivo de inventário, confirmando que o controle remoto está operacional.</p>

<pre>
<code< code="">[all:grouped]
  200 OK

  200 OK

  200 OK</code<></pre>

<p>Em seguida, verifique se as atualizações de pacotes e a instalação de dependências críticas (como Nginx ou Docker) foram concluídas. Você pode executar um comando ad-hoc para verificar a versão de um serviço específico em todos os servidores simultaneamente, garantindo a <strong>padronização</strong> da frota.</p>

<pre>
<code< code="">ansible webservers -a "nginx -v"</code<></pre>

<p>Neste comando, o argumento <code>-a indica a tarefa a ser executada (o comando de versão do Nginx) e webservers é o grupo de destino. O resultado deve exibir a versão exata que você definiu no seu playbook.

nginx version: nginx/1.18.0 (Ubuntu)</code<></pre>

<p>Por fim, realize uma auditoria de segurança básica verificando se as portas críticas (como a 22 para SSH) estão acessíveis apenas via chave pública e se o firewall (UFW ou Iptables) está ativo. Um teste de <strong>escaneamento de portas</strong> rápido ajuda a identificar se alguma regra de firewall foi aplicada incorretamente, deixando portas desnecessárias expostas para a internet.</p>

<pre>
<code< code="">nc -zv [IP_DA_VPS] 22</code<></pre>

<p>O comando <code>nc (Netcat) com a flag -z (modo scan) e -v (verbose) deve retornar uma conexão bem-sucedida, confirmando que a política de acesso restrito definida no playbook está operando conforme o planejado.

Troubleshooting de Conexão e Permissões

A automação via Ansible depende inteiramente da capacidade da sua máquina de controle estabelecer uma sessão SSH estável e segura com os nós remotos. Quando o provisionamento falha, o problema raramente está na lógica do playbook, mas sim em camadas de rede ou autenticação. Abaixo, listamos os erros mais críticos encontrados durante a execução em larga escala.

  • Sintoma: Erro Permission denied (publickey) durante o comando de execução.

    Boas Práticas de Infraestrutura como Código

    Adotar a mentalidade de Infraestrutura como Código (IaC) vai muito além de apenas rodar scripts de automação. Para que sua gestão de VPS na Toda Solução seja escalável e auditável, é fundamental tratar seus arquivos de configuração com o mesmo rigor aplicado ao desenvolvimento de software. O objetivo é garantir que o estado atual do seu servidor seja previsível, replicável e livre de "configurações drift", que ocorrem quando alterações manuais são feitas fora do fluxo de automação.

    • Versionamento de Código: Utilize sempre um sistema de controle de versão, como o Git, para armazenar seus playbooks e inventários. Isso permite rastrear quem alterou qual parâmetro de configuração e facilita o rollback imediato caso uma atualização de pacote quebre um serviço essencial.
    • Princípio da Imutabilidade: Evite realizar alterações manuais via SSH diretamente nos servidores de produção. Se uma configuração precisa mudar, altere o playbook, teste em um ambiente de staging e aplique a mudança via Ansible. Isso garante que a documentação (o código) seja a única fonte da verdade.
    • Idempotência como Regra: Desenvolva tarefas que possam ser executadas múltiplas vezes sem alterar o resultado final se o sistema já estiver no estado desejado. No Ansible, prefira módulos nativos como apt, template ou service em vez de usar o módulo shell, pois os módulos nativos verificam o estado atual antes de agir.
    • Separação de Segredos: Nunca armazene senhas, chaves SSH ou tokens de API em texto puro dentro dos seus playbooks. Utilize o Ansible Vault para criptografar variáveis sensíveis. Para proteger um arquivo de variáveis, use o comando:
      ansible-vault encrypt vars/secrets.yml
      A flag encrypt transforma o conteúdo do arquivo em um formato ilegível sem a senha mestre.
    • Modularização com Roles: Não crie um único playbook gigante para todas as suas 10 VPS. Organize sua infraestrutura em Roles separadas (ex: uma role para Nginx, outra para MySQL, outra para Firewall). Isso facilita a reutilização de componentes em novos projetos e torna a manutenção muito mais simples.
    • Validação Pré-Execução: Antes de rodar o playbook em toda a frota, utilize o comando --syntax-check para validar a estrutura do YAML e o modo --check (dry run) para simular as mudanças sem aplicá-las de fato. Isso previne erros de sintaxe que poderiam interromper o provisionamento em massa.

    Conclusão e Próximos Passos

    Automatizar o provisionamento de 10 ou mais instâncias VPS através de Ansible transforma uma tarefa que levaria horas de configuração manual em um processo de poucos minutos, reduzindo drasticamente a margem de erro humano. Ao utilizar Infrastructure as Code (IaC), você garante que cada servidor, seja ele um nó de banco de dados, um servidor web Nginx ou um balanceador de carga, possua exatamente a mesma base de configuração, pacotes e políticas de segurança. Este guia foi o primeiro passo para tirar sua gestão de infraestrutura do modelo reativo e movê-la para um modelo declarativo e escalável.

    No entanto, o provisionamento é apenas o início do ciclo de vida de um servidor. Para manter uma infraestrutura profissional e resiliente, você deve expandir seu conhecimento para camadas mais complexas de automação. O domínio de playbooks permite que você não apenas crie máquinas, mas gerencie o drift de configuração, garantindo que alterações manuais não desviam o estado desejado do sistema.

    Para evoluir sua stack de automação, recomendamos os seguintes camritos técnicos:

    • Implementação de Ansible Roles: Em vez de um único playbook gigante, aprenda a estruturar seu código em Roles. Isso permite reutilizar lógicas de instalação (como uma role de Docker ou MySQL) em diferentes projetos de forma modular e organizada.
    • Integração com CI/CD: Conecte seu repositório de playbooks ao GitLab CI ou GitHub Actions. Assim, sempre que você atualizar uma configuração no Git, o pipeline pode disparar o Ansible para aplicar as mudanças automaticamente nos servidores de homologação e produção.
    • Gestão de Secrets com Ansible Vault: Nunca deixe senhas, chaves SSH ou tokens de API em texto puro nos seus arquivos. Utilize o comando ansible-vault encrypt vars/secrets.yml para criptografar dados sensíveis, garantindo que seu código possa ser versionado com segurança.
    • Monitoramento de Infraestrutura: Após o provisionamento, implemente ferramentas como Prometheus e Grafana. Use o próprio Ansible para instalar os agentes de monitoramento em todas as novas instâncias automaticamente.
    • Exploração de Terraform: Se você pretende escalar para ambientes Multi-Cloud ou gerenciar recursos de rede complexos (VPC, Subnets, Firewalls), combine o Terraform para o provisionamento de recursos de infraestrutura com o Ansible para a configuração de software.

    A automação não é um destino, mas um processo contínuo de refinamento. Ao dominar essas ferramentas, você libera tempo para focar no que realmente importa para o seu negócio: a entrega de valor e a estabilidade do seu serviço.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000