ULC Lab · implementação reproduzível
Laboratório: Provisionamento e Configuração de Servidores Web Apache com Ansible
Você irá provisionar e configurar automaticamente dois servidores web Apache em máquinas virtuais usando Ansible, partindo do zero. Em cerca de 2 horas, terá uma infraestrutura mínima automatizada e validada.

- Duração estimada
- 120 min
- Passos
- 12
- Validações
- 4
- Versões da documentação consultada
- Ansible 2.14 · OpenSSH a versão estável atual · Apache HTTP Server a versão estável atual
O objetivo é demonstrar, na prática, como o Ansible pode automatizar o provisionamento e a configuração de servidores Linux para rodar um serviço web. Você vai criar um playbook do zero, aplicar em múltiplos hosts e validar o resultado, entendendo cada etapa do processo.
Topologia
Uma máquina de controle (Ansible) conecta via SSH a duas máquinas alvo (web1 e web2), todas em uma rede privada (exemplo: 192.168.56.0/24). O controle executa os playbooks e gerencia as configurações dos servidores web.
+----------------+
| Ansible |
| Controller |
|192.168.56.10 |
+-------+--------+
|
+---------------+---------------+
| |
+-------+--------+ +--------+-------+
| web1 | | web2 |
|192.168.56.11 | |192.168.56.12 |
+----------------+ +----------------+Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM ou máquina física para Ansible Controller | 1 vCPU, 1 GB RAM, 1 porta de rede, Ubuntu 22.04 ou CentOS 8 |
| VM ou máquina física para web1 | 1 vCPU, 512 MB RAM, 1 porta de rede, Ubuntu 22.04 ou CentOS 8 |
| VM ou máquina física para web2 | 1 vCPU, 512 MB RAM, 1 porta de rede, Ubuntu 22.04 ou CentOS 8 |
| Ansible | GPLv3 · 2.14 |
| OpenSSH | BSD · a versão estável atual |
| Apache HTTP Server | Apache License 2.0 · a versão estável atual |
Roteiro
- Preparar as VMs e a rede
Crie três VMs (uma para o Ansible Controller, duas para web) na mesma rede privada. Isso garante conectividade SSH.
O que você deve ver: As três VMs conseguem se pingar usando IPs privados.
- Configurar acesso SSH sem senha
No Controller, gere uma chave SSH e copie para web1 e web2. Isso é pré-requisito para automação sem intervenção.
ssh-keygen -t ed25519 ssh-copy-id user@192.168.56.11 ssh-copy-id user@192.168.56.12O que você deve ver: Acesso SSH do Controller para web1 e web2 sem pedir senha.
- Instalar o Ansible no Controller
Instale o Ansible usando o gerenciador de pacotes. O Ansible é a ferramenta central deste laboratório.
sudo apt update && sudo apt install ansible -y # Ubuntu sudo dnf install ansible -y # CentOSO que você deve ver: Comando 'ansible --version' retorna a versão instalada.
- Criar arquivo de inventário
Defina os hosts gerenciados em um arquivo 'hosts' no Controller. O inventário é o ponto de partida de toda automação com Ansible.
cat > hosts <<EOF [webservers] 192.168.56.11 192.168.56.12 EOFO que você deve ver: Arquivo 'hosts' criado com os IPs dos servidores web.
- Testar conectividade Ansible
Use o módulo 'ping' do Ansible para testar comunicação com os alvos. Isso valida o setup SSH e inventário.
ansible -i hosts webservers -m ping -u userO que você deve ver: Saída 'pong' para cada host.
- Criar playbook para instalar Apache
Escreva um playbook YAML que instala e inicia o Apache. O playbook é o coração da automação.
cat > apache.yml <<EOF - hosts: webservers become: yes tasks: - name: Instalar Apache apt: name: apache2 state: present when: ansible_os_family == 'Debian' - name: Instalar Apache (CentOS) yum: name: httpd state: present when: ansible_os_family == 'RedHat' - name: Iniciar e habilitar Apache service: name: "{{ 'apache2' if ansible_os_family == 'Debian' else 'httpd' }}" state: started enabled: yes EOFO que você deve ver: Arquivo 'apache.yml' criado com as tarefas de instalação e inicialização.
- Executar o playbook
Rode o playbook para instalar e iniciar o Apache nos dois servidores. Isso demonstra a automação em ação.
ansible-playbook -i hosts apache.yml -u userO que você deve ver: Saída mostra tarefas OK ou changed para cada host.
- Verificar status do Apache manualmente
Confirme que o Apache está rodando em cada servidor. Isso valida o resultado do playbook.
ssh user@192.168.56.11 'sudo systemctl status apache2 || sudo systemctl status httpd' ssh user@192.168.56.12 'sudo systemctl status apache2 || sudo systemctl status httpd'O que você deve ver: Status 'active (running)' para o serviço Apache.
- Testar acesso HTTP
Acesse a página padrão do Apache via curl a partir do Controller. Isso garante que o serviço está disponível na rede.
curl http://192.168.56.11 curl http://192.168.56.12O que você deve ver: Retorno contém 'Apache2 Ubuntu Default Page' ou equivalente.
- Modificar página inicial via Ansible
Adicione uma tarefa ao playbook para criar um index.html personalizado. Isso mostra como gerenciar conteúdo.
cat >> apache.yml <<EOF - name: Criar página inicial personalizada copy: dest: /var/www/html/index.html content: "Servidor gerenciado por Ansible" owner: www-data group: www-data mode: '0644' EOFO que você deve ver: Playbook atualizado com nova tarefa.
- Reaplicar o playbook
Execute novamente para aplicar a nova configuração. O Ansible é idempotente: só muda o que precisa.
ansible-playbook -i hosts apache.yml -u userO que você deve ver: Saída mostra tarefa de cópia como changed.
- Validar página personalizada
Acesse novamente via curl e verifique o conteúdo. Isso confirma que a automação alterou o serviço.
curl http://192.168.56.11 curl http://192.168.56.12O que você deve ver: Retorno contém 'Servidor gerenciado por Ansible'.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Conectividade Ansible com todos os hosts | ansible -i hosts webservers -m ping -u user | Todos retornam 'pong' |
| Apache rodando nos dois servidores | ssh user@192.168.56.11 'sudo systemctl status apache2 || sudo systemctl status httpd' | Status 'active (running)' |
| Acesso HTTP funcional | curl http://192.168.56.11 | Página padrão ou personalizada do Apache aparece |
| Página inicial personalizada entregue | curl http://192.168.56.11 | Retorno contém 'Servidor gerenciado por Ansible' |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Erro de permissão ao rodar playbook | Usuário remoto não tem sudo sem senha | Configure sudoers para o usuário ou use --ask-become-pass |
| Falha de conexão SSH | Chave SSH não copiada ou firewall bloqueando | Verifique ssh-copy-id e regras de firewall |
| Apache não inicia | Porta 80 já em uso ou erro de instalação | Verifique logs do Apache e libere a porta |
| Página personalizada não aparece | Cache do navegador ou erro de permissão no arquivo | Limpe cache e confira permissões do index.html |
Segurança e hardening
- Restrinja o acesso SSH apenas ao Controller
- Utilize chaves SSH fortes e nunca compartilhe a privada
- Remova ou limite o uso de sudo sem senha após o laboratório
- Verifique permissões dos arquivos gerados pelo Ansible
- Não exponha as VMs à internet pública sem firewall
Checklist final
Referências
- Documentação oficial do Ansible · Ansible (Red Hat) (docs.ansible.com)
- Documentação de inventário do Ansible · Ansible (Red Hat) (docs.ansible.com)
- Documentação de playbooks · Ansible (Red Hat) (docs.ansible.com)
- Publicado
- 09/09/2026
- Última revisão
- 09/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 3 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
