Construir um LXC no Proxmox com Automação

Está cansado de clicar em botões numa interface Web para criar um LXC? Gostaria de começar a automatizar as coisas?

A automação é o caminho a seguir, mas saber por onde começar pode ser desafiador. Este guia ajudará a dar os primeiros passos na automação do processo de construção de LXCs no Proxmox.

Pressupostos e Aviso de Responsabilidade

Este é um tópico avançado. Executar algo incorreto PODE resultar em problemas com um LXC no seu sistema ou até mesmo destruir tudo. Dedique tempo para compreender os comandos que estamos a automatizar, verifique cuidadosamente a sintaxe, faça cópias de segurança e tome as precauções necessárias para garantir os melhores resultados para esta operação.

Requisitos

Vamos abordar os requisitos para começar esta jornada. Ao explorar implementações automatizadas, é provável que tenha encontrado o termo “Infraestrutura como Código” (IaC). O IaC tornou-se predominante no mundo DevOps, quando os administradores de servidores precisaram de uma forma fiável de fornecer o que os desenvolvedores necessitavam, sem exigir que estes construíssem os sistemas. Existem várias formas de utilizar frameworks e scripts para implementar coisas. Apenas para mencionar alguns, Jenkins, Ansible, Puppet, Chef, Terraform, e a lista continua. Hoje, vamos reduzir a necessidade dessas ferramentas e frameworks, concentrando-nos apenas em scripts de shell.

Proxmox VE 8.1 – O que há de novo? – HomeServer.pt – Informática e Tecnologia
homeserver.pt

Ferramentas Necessárias

Para acompanhar este tutorial, necessitará do seguinte:

  • Proxmox totalmente configurado
  • Acesso de root ao seu Proxmox
  • Familiaridade com a linha de comandos e scripts

Opcional:

  • Repositórios Git
  • Chaves SSH

O Objetivo

O objetivo deste tutorial/artigo é implementar um LXC completo, utilizando uma imagem LXC Debian 11 completamente atualizada, com uma instalação básica de software e, neste caso, a configuração de um servidor proxy reverso denominado Caddy. O Caddy funcionará como um servidor proxy reverso para o meu domínio e será configurado com certificados Cloudflare desde o início.

Estrutura de Ficheiros

Antes de começarmos, é importante compreender que realizaremos todas as ações através da linha de comandos, sem a interface gráfica. Se preferir, pode criar esses scripts num computador remoto utilizando o seu IDE preferido (que tal o VSCode?), e, em seguida, fazer upload para o servidor Proxmox.

Primeiramente, vamos criar um novo diretório para o nosso projeto e outro para armazenar os nossos segredos. Pretendo transformar isto num repositório Git e não quero que as chaves fiquem nos meus scripts ou sincronizadas com um servidor Git.

Vamos criar os nossos dois diretórios num diretório base sob a raiz (root):

Bash
mkdir -p /root/deploy_scripts/caddy
mkdir -p /root/deploy_scripts/secrets

Configuração de Segredos

Vamos começar com o nosso ficheiro de configuração de segredos. Este será um script bash simples que fornecerá os nossos segredos a outros scripts bash.

Bash
#!/bin/bash
export ROOT_PASS=SUPER_53CRET4_P4$$WORD!

Está feito. Simples, não é verdade? Isto cria uma variável de ambiente chamada “ROOT_PASS” com o valor definido de uma senha para utilização posterior. O meu ficheiro de segredos tem muitos mais segredos, como a chave de autenticação do Tailscale, credenciais de base de dados e outras informações para várias LXCs que utilizo para este fim.

Compreensão do Fluxo

Estamos a criar alguns ficheiros aqui, alguns para configuração, outros para execução. Aqui está uma visão geral bastante abrangente do processo.

O script build_vm.sh irá criar um LXC no host Proxmox e copiar alguns ficheiros.

  1. Para o antigo LXC.
  2. Destroi o antigo LXC.
  3. Cria um novo LXC.
  4. Edita os ficheiros de configuração do LXC no Proxmox para permitir o tunelamento.
  5. Copia ficheiros para o LXC para serem executados dentro do container.

O script software.sh será executado dentro do LXC para configurar o software.

  1. Atualiza todos os pacotes.
  2. Adiciona o repositório do Caddy.
  3. Instala o Caddy.
  4. Instala regras UFW para o servidor proxy reverso.

Script build_vm

Este primeiro script será executado no próprio servidor Proxmox para criar o LXC.

Carregando e Definindo mais variáveis

Vamos começar um novo script e chamá-lo de build_vm.sh. As primeiras linhas do nosso script simplesmente definem variáveis de ambiente. Note que essas configurações funcionam para o meu sistema; o seu sistema/rede pode ser diferente. Vá em frente e inicie o seu script com estas linhas.

Bash
# carrega os nossos segredos do ficheiro que fizemos anteriormente
source ../secrets/secrets.sh

# nosso ID de container, número de núcleos, configuração de IP, tamanho do disco rígido (em GB), nome do LXC e ponte de rede a ser utilizada.

CT_ID=202
CORES=2
MEM=128
IP=192.168.2.145
GW=192.168.2.1
HD=2
NAME=caddy
BRIDGE=vmbr0

Removendo containers antigos

Esta linha abaixo utiliza o pct (um script auxiliar do Proxmox) para parar qualquer container que possa estar em execução no ID 202 e, em seguida, destruí-lo.

Bash
echo "Parando o container antigo"
pct stop $CT_ID
echo "A aguardar 2 segundos para o container encerrar"
sleep 2

echo "Eliminando o container antigo"
pct destroy $CT_ID

Construindo um novo container

Adicione o seguinte ao seu script, isto está realmente a criar o novo LXC Debian 11.

Bash
echo "Construindo novo container"
pct create $CT_ID /var/lib/vz/template/cache/debian-11-standard_11.3-1_amd64.tar.zst \
--cores $CORES \
--hostname $NAME \
--memory $MEM \
--net0 name=eth0,bridge=$BRIDGE,firewall=1,gw=$GW,ip=$IP/24,type=veth \
--storage local-lvm \
--rootfs local-lvm:$HD \
--unprivileged 1 \
--features keyctl=1,nesting=1,fuse=1 \
--ostype debian \
--password=$ROOT_PASS \
--start 1 \
--onboot 1 \
--ssh-public-keys /root/.ssh/authorized_keys

Explicação do código acima:

A maior parte do código é dedicada à definição e execução de comandos no ambiente Proxmox para criar, configurar e copiar ficheiros para o container LXC.

Nota sobre segurança: O código faz uso de ficheiros de segredos para proteger informações sensíveis, como senhas. Estes ficheiros são carregados e utilizados, mas são removidos após o uso para manter a segurança.

Ativar Funcionalidades Específicas:
A linha --features keyctl=1,nesting=1,fuse=1 \ ativa funcionalidades específicas do LXC que podem ser necessárias para outras aplicações. Essas funcionalidades são definidas pelo utilizador, dependendo dos requisitos do sistema.

Permitir Tunelamento:
Se for necessário suporte para tunelamento no LXC (por exemplo, tailscale, zerotier, wireguard), são adicionadas configurações ao ficheiro de configuração do LXC para permitir o tunelamento.

Bash
# Permitir Tunelamento
echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >> /etc/pve/lxc/$CT_ID.conf
echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >> /etc/pve/lxc/$CT_ID.conf

Reiniciar o LXC para Aplicar o Tunelamento:
Após permitir o tunelamento, o LXC é reiniciado para aplicar as alterações.

Bash
# Reiniciar para permitir o tunelamento
echo "Reiniciando $CT_ID"
pct reboot $CT_ID
sleep 3

Copiar Ficheiros para o LXC:
Utilizando o script PCT, alguns ficheiros são copiados para o LXC, incluindo scripts de software e ficheiros de segredos.

Bash
# Copiar scripts/software secretos PARA dentro do LXC via comando PCT push
pct push $CT_ID /root/deploy_scripts/caddy/software.sh /root/software.sh
pct push $CT_ID /root/deploy_scripts/secrets/secrets.sh /root/secrets.sh

# Executar o comando chmod dentro do LXC para tornar os ficheiros .sh executáveis
pct exec $CT_ID chmod +x /root/software.sh
pct exec $CT_ID chmod +x /root/secrets.sh

# Executar o ficheiro software.sh dentro do LXC para executar processos de instalação e outros.
pct exec $CT_ID /root/software.sh

# Baixar o certificado de origem do Cloudflare para o seu domínio e guardá-lo em /root/deploy_scripts/caddy/certs/

# Copiar certificados SSL via PCT push
pct push $CT_ID /root/deploy_scripts/caddy/certs/cert.pem /etc/ssl/cert.pem 
pct push $CT_ID /root/deploy_scripts/caddy/certs/key.pem /etc/ssl/key.pem

Caddyfile:
O Caddyfile é um arquivo de configuração específico do Caddy. Ele é copiado para dentro do LXC e fornece instruções sobre como o Caddy deve manipular as solicitações HTTP.

O ficheiro Caddyfile, localizado em /root/deploy_scripts/caddy/Caddyfile:

Bash
*.homeserver.pt {

	# Certificados de origem Cloudflare
	tls /etc/ssl/cert.pem /etc/ssl/key.pem

	@test host test.homeserver.pt
	handle @test {
		reverse_proxy 192.168.2.100:80
	}
	
	handle {
		respond "Desculpe, mas não encontramos nada para este subdomínio. Verifique a URL e tente novamente."
	}
}
}
Bash
# Finalmente, copiar o Caddyfile
pct push $CT_ID Caddyfile /etc/caddy/Caddyfile

# Reiniciar o LXC pela última vez para que os serviços iniciem e possamos garantir que tudo funciona.
pct reboot $CT_ID

Conclusão da Primeira Parte:
A primeira parte do script cria o LXC, configura tunelamento, copia scripts e ficheiros de configuração para o LXC e reinicia o LXC para aplicar as alterações. O próximo passo será criar e executar um script de software dentro do LXC para realizar atualizações, instalações e configurações adicionais.

Atualizações de Software, Instalação e Outras Configurações Dentro do Container

Agora chegamos à parte divertida. Vamos criar outro script em /root/deploy_scripts/caddy/software.sh. Vou comentar abaixo para explicar enquanto lemos o script.

Bash
#!/bin/bash

# Carregar as variáveis de ambiente e eliminar o ficheiro por razões de segurança
source /root/secrets.sh
rm -f /root/secrets.sh

### Atualizar, fazer upgrade e instalar pacotes básicos que utilizo regularmente.
apt update
apt upgrade -y
apt install sudo curl wget psmisc fail2ban ca-certificates gnupg lsb-release ufw -y

# Instruções de instalação do Caddy
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

# Outra atualização para o apt
apt update

# Instalação do Caddy
apt install caddy -y

# Regras UFW para um proxy reverso, permitindo tailcale e rede local
ufw allow from 101.45.0.0/10 proto tcp to any
ufw allow from 192.168.2.0/24 proto tcp to any

# Permitir todo o resto para 80/443
ufw allow 80/tcp
ufw allow 443/tcp

# Iniciar o UFW
ufw enable

Este script executa uma série de comandos para atualizar, instalar pacotes e configurar o Caddy, bem como regras UFW para permitir tráfego específico. Certifique-se de ajustar essas configurações conforme necessário para o seu ambiente. Se precisar de mais alguma alteração ou explicação, estou à disposição.

Conclusão

Agora temos vários ficheiros prontos para serem copiados e executados no servidor Proxmox. Copie os seus ficheiros e siga os seguintes passos:

Bash
cd /root/deploy_scripts/caddy
./build_vm.sh

Isto irá criar um novo container (ID 202), instalar todo o software necessário e configurar um servidor proxy reverso.

Deixe um comentário