Laboratório em bancada
Laboratório: Automação de Provisionamento e Configuração de Servidores Linux com Ansible
Você terá um ambiente funcional de automação com Ansible, capaz de provisionar e configurar dois servidores Linux virtuais a partir de um playbook centralizado. A execução completa leva cerca de 2 horas.

- Duração estimada
- 120 min
- Passos
- 13
- Validações
- 4
O objetivo é demonstrar, na prática, como o Ansible pode automatizar o provisionamento e a configuração inicial de servidores Linux em uma rede local. Você vai criar um inventário, escrever playbooks, usar roles, variáveis, templates e o Ansible Vault para proteger informações sensíveis. No final, dois servidores estarão configurados de forma idêntica, prontos para operação.
Topologia
Três máquinas virtuais em uma rede privada: uma máquina de controle (Ansible) e dois servidores-alvo (web01 e web02), todos com Ubuntu Server 22.04. A máquina de controle acessa os servidores por SSH em uma faixa 192.168.56.0/24.
+----------------+
| Ansible VM |
|192.168.56.10 |
+-------+--------+
|
+------------+-------------+
| |
+---------+ +---------+
| web01 | | web02 |
|192.168.56.11| |192.168.56.12|
+---------+ +---------+Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM Ansible (controle) | 1 vCPU, 1GB RAM, 1 interface de rede, Ubuntu Server 22.04 |
| VM web01 | 1 vCPU, 512MB RAM, 1 interface de rede, Ubuntu Server 22.04 |
| VM web02 | 1 vCPU, 512MB RAM, 1 interface de rede, Ubuntu Server 22.04 |
| Ansible | GPLv3 · 2.14 |
| OpenSSH | BSD · a versão estável atual |
| Ubuntu Server | GPL · 22.04 |
Roteiro
- Preparar as máquinas virtuais
Crie as três VMs na mesma rede privada. Use endereços fixos: 192.168.56.10 (Ansible), 192.168.56.11 (web01), 192.168.56.12 (web02).
O que você deve ver: Todas as VMs acessíveis via ping entre si.
- Instalar o Ansible na máquina de controle
O Ansible só precisa estar na máquina de controle. Instale usando o gerenciador de pacotes.
sudo apt update && sudo apt install ansible -yO que você deve ver: Ansible instalado e disponível com o comando 'ansible --version'.
- Configurar acesso SSH sem senha
Gere um par de chaves SSH na máquina de controle e copie a chave pública para web01 e web02. Isso permite automação sem intervenção manual.
ssh-keygen -t ed25519 -C "ansible-lab" ssh-copy-id user@192.168.56.11 ssh-copy-id user@192.168.56.12O que você deve ver: Acesso SSH sem senha entre a máquina de controle e os servidores.
- Criar o inventário Ansible
O inventário define quais hosts serão gerenciados. Crie um arquivo chamado 'hosts' no diretório do projeto.
cat > hosts <<EOF [webservers] web01 ansible_host=192.168.56.11 web02 ansible_host=192.168.56.12 EOFO que você deve ver: Arquivo 'hosts' criado com os dois servidores listados.
- Testar conectividade Ansible
Verifique se o Ansible consegue se conectar aos servidores usando o módulo 'ping'.
ansible -i hosts webservers -m ping -u userO que você deve ver: Saída com 'SUCCESS' para web01 e web02.
- Criar um playbook de configuração inicial
O playbook automatiza tarefas como atualização de pacotes e instalação do Nginx. Crie o arquivo 'site.yml'.
cat > site.yml <<EOF - hosts: webservers become: yes tasks: - name: Atualizar pacotes apt: update_cache: yes upgrade: dist - name: Instalar Nginx apt: name: nginx state: present EOFO que você deve ver: Playbook 'site.yml' criado.
- Executar o playbook
Aplique o playbook para provisionar os servidores.
ansible-playbook -i hosts site.yml -u userO que você deve ver: Saída mostrando as tarefas executadas com sucesso.
- Criar uma role Ansible para configuração do Nginx
Roles organizam tarefas reutilizáveis. Use o comando 'ansible-galaxy init' para criar a estrutura.
ansible-galaxy init roles/nginx_setupO que você deve ver: Diretório 'roles/nginx_setup' criado com subdiretórios padrão.
- Adicionar template de configuração ao Nginx
Crie um template Jinja2 para o arquivo de configuração do Nginx em 'roles/nginx_setup/templates/nginx.conf.j2'.
cat > roles/nginx_setup/templates/nginx.conf.j2 <<EOF user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; } http { server { listen 80 default_server; server_name {{ inventory_hostname }}; root /var/www/html; index index.html; } } EOFO que você deve ver: Template criado em 'roles/nginx_setup/templates/nginx.conf.j2'.
- Adicionar tarefa para aplicar o template
Edite 'roles/nginx_setup/tasks/main.yml' para usar o template e reiniciar o Nginx.
cat > roles/nginx_setup/tasks/main.yml <<EOF - name: Copiar configuração customizada do Nginx template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: Reiniciar Nginx - name: Garantir que o Nginx está rodando service: name: nginx state: started EOF cat > roles/nginx_setup/handlers/main.yml <<EOF - name: Reiniciar Nginx service: name: nginx state: restarted EOFO que você deve ver: Tarefas e handler configurados na role.
- Atualizar o playbook para usar a role
Modifique 'site.yml' para incluir a role 'nginx_setup'.
cat > site.yml <<EOF - hosts: webservers become: yes roles: - nginx_setup EOFO que você deve ver: Playbook atualizado para usar a role.
- Proteger variáveis sensíveis com Ansible Vault
Crie um arquivo de variáveis com senha usando o Ansible Vault.
ansible-vault create group_vars/webservers.ymlO que você deve ver: Arquivo criado e criptografado.
- Executar o playbook final
Rode novamente o playbook, agora com roles, templates e variáveis protegidas.
ansible-playbook -i hosts site.yml -u user --ask-vault-passO que você deve ver: Playbook executado com sucesso, Nginx configurado conforme o template.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Verificar se o Nginx está rodando em ambos os servidores | curl http://192.168.56.11 && curl http://192.168.56.12 | Receber resposta padrão do Nginx em ambos os comandos. |
| Checar se o arquivo de configuração foi aplicado | ssh user@192.168.56.11 'cat /etc/nginx/nginx.conf' | Arquivo contém o nome do host correto (inventory_hostname). |
| Verificar se o playbook executa sem erros | ansible-playbook -i hosts site.yml -u user --check | Saída sem falhas ('failed=0'). |
| Validar proteção do Ansible Vault | cat group_vars/webservers.yml | Conteúdo ilegível (criptografado). |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Erro de permissão ao rodar playbook | Usuário remoto sem sudo configurado | Adicione o usuário ao grupo sudoers nos servidores web |
| Falha de conexão SSH | Chave SSH não copiada corretamente | Refaça o ssh-copy-id e teste acesso manual |
| Nginx não inicia após aplicar template | Erro de sintaxe no template Jinja2 | Valide o template e corrija variáveis ausentes |
| Playbook pede senha do Vault mesmo sem variáveis sensíveis | Arquivo group_vars está criptografado, mas não usado | Remova o arquivo ou adicione variáveis realmente utilizadas |
Segurança e hardening
- Utilize chaves SSH protegidas por senha
- Restrinja acesso SSH apenas à máquina de controle
- Não armazene senhas em texto claro nos playbooks
- Aplique atualizações de segurança nos servidores antes de expor à rede
