Automação da Infraestrutura com Ansible¶
Ansible é a ferramenta de automação escolhida para esta arquitetura, permitindo que configuremos e gerencemos nosso servidor doméstico de forma programática, consistente e repetível. Isso é um pilar da filosofia de Infraestrutura como Código (IaC).
Por que Ansible?¶
- Infraestrutura como Código (IaC): As configurações da sua infraestrutura (servidores, VMs, software, redes) são definidas em arquivos de texto (playbooks YAML), que podem ser versionados em Git, revisados e reutilizados.
- Idempotência: Um conceito fundamental no Ansible. Um playbook pode ser executado múltiplas vezes, e o resultado será sempre o mesmo estado desejado. Se o sistema já está no estado correto, o Ansible não faz alterações (ou faz apenas as mínimas necessárias).
- Agentless: Ansible não requer a instalação de agentes nos nós gerenciados (como o host Proxmox e as VMs). Ele se conecta via SSH (para Linux/Unix) e executa os módulos necessários.
- Simplicidade (YAML): Playbooks são escritos em YAML, que é relativamente fácil de ler e escrever.
- Módulos Extensivos: Ansible possui uma vasta biblioteca de módulos para interagir com diversos sistemas, incluindo Proxmox, Docker, gerenciamento de pacotes, arquivos, serviços, etc. Utilizamos coleções como
community.proxmoxecommunity.docker. - Roles: Permitem organizar tarefas e variáveis em unidades reutilizáveis, promovendo um código mais limpo e modular.
- Ansible Vault: Para gerenciamento seguro de dados sensíveis (senhas, tokens API).
Estrutura do Projeto Ansible (infra-servidor-domestico/ansible/)¶
A organização dos arquivos Ansible no nosso projeto é crucial para a manutenibilidade:
inventories/home/: Define os hosts que o Ansible gerenciará.hosts.ini: Lista os hosts (Proxmox, VMs) e os agrupa. Define variáveis de conexão (IP, usuário, chave SSH).group_vars/all/main.yml: Variáveis comuns não sensíveis aplicadas a todos os hosts.group_vars/all/vault.yml: Variáveis comuns sensíveis (criptografadas) aplicadas a todos os hosts.
playbooks/: Contém os playbooks YAML que orquestram as tarefas. Cada playbook define um conjunto de hosts alvo e os roles ou tarefas a serem aplicados.- Ex:
setup-proxmox-host.yml,vm-deploy.yml,full-deploy.yml(playbook mestre).
- Ex:
roles/: Diretórios contendo roles reutilizáveis. Cada role tem uma estrutura definida (tasks, handlers, templates, files, defaults, vars).- Ex:
infra/proxmox-host-config,common,infra/docker.
- Ex:
ansible.cfg(Opcional, na raiz do projeto Ansible): Pode ser usado para definir configurações padrão do Ansible para o projeto (e.g., caminho do inventário, roles_path, desabilitar host key checking para ambientes de teste - não recomendado para produção). Este guia não foca nele, mas é bom saber que existe.
Fluxo de Trabalho Típico com Ansible¶
- Definir o Estado Desejado: Você descreve o estado final que deseja para seus sistemas nos playbooks e roles Ansible (e.g., "o pacote nginx deve estar instalado", "o serviço Docker deve estar rodando", "esta linha deve existir no arquivo de configuração X").
- Executar o Playbook: A partir da sua máquina de controle Ansible, você executa um comando como:
- Conexão e Coleta de Fatos (Opcional): Ansible se conecta aos hosts definidos no inventário via SSH. Opcionalmente, ele pode coletar "fatos" sobre os sistemas remotos (distribuição do SO, IPs, etc.) que podem ser usados em condicionais e templates.
- Execução de Tarefas: Ansible executa as tarefas definidas no playbook (ou nos roles incluídos) em cada host alvo, em ordem.
- Módulos Ansible são executados no host remoto para realizar as ações.
- Devido à idempotência, se uma tarefa já foi aplicada e o sistema está no estado desejado, o Ansible reportará "ok" sem fazer mudanças. Se uma mudança for necessária, reportará "changed".
- Handlers: Se uma tarefa reportar "changed" e tiver um
notifypara um handler, esse handler será executado no final do play em cada host. Handlers são úteis para reiniciar serviços apenas se suas configurações mudaram. - Relatório: Ansible exibe um resumo das tarefas (ok, changed, unreachable, failed).
Principais Playbooks e Seus Papéis na Arquitetura¶
setup-proxmox-host.yml:- Alvo:
proxmox_main_host. - Função: Configurações iniciais do Proxmox VE (repositórios, pacotes, firewall, SSH hardening, Node Exporter, servidor NFS).
- Alvo:
vm-deploy.yml:- Alvo:
proxmox_main_host(para interagir com a API Proxmox). - Função: Provisiona as VMs (
core-services-vm,ai-desktop-vm) a partir do template Cloud-Init, configurando recursos e Cloud-Init.
- Alvo:
setup-base-ubuntu.yml:- Alvo:
ubuntu_vms(grupo contendo todas as VMs Ubuntu). - Função: Aplica configurações base (pacotes, fuso horário, cliente NFS, UFW, Node Exporter VM). Instala Docker Engine e Portainer na
core-services-vm. Instala GUI opcional.
- Alvo:
setup-core-networking.yml:- Alvo:
core-services-vm. - Função: Prepara arquivos de configuração para Traefik e Authelia, e faz o deploy das stacks Docker
core(Traefik, Cloudflared) eauthelia.
- Alvo:
- Playbooks
setup-<stack>-volumes.yml(e.g.,setup-media-stack-volumes.yml):- Alvo: VM específica onde a stack Docker rodará (geralmente
core-services-vmouai-desktop-vm). - Função: Criar os diretórios necessários nos volumes NFS e gerar o arquivo
.envcom caminhos e variáveis para a respectiva stack Docker a ser implantada via Portainer.
- Alvo: VM específica onde a stack Docker rodará (geralmente
full-deploy.yml:- Função: Playbook mestre que importa e executa os playbooks acima em uma sequência lógica para um deploy completo da infraestrutura base. Usado para o setup inicial ou para garantir que toda a infraestrutura esteja no estado desejado.
A automação com Ansible não apenas economiza tempo e reduz erros manuais, mas também serve como documentação viva da configuração da sua infraestrutura. Qualquer pessoa com acesso ao repositório Ansible pode entender como o sistema foi construído e como é gerenciado.