Backup da forma padrão pode ser bastante tedioso e burocrático de se usar quando precisamos obter apenas um arquivo de configuração antigo para testes ou mesmo para desfazer alguma modificação indevida e rapidamente.
Por conta disso é comum que o sysadmin invente coisas como “cp niginx.conf nginx.conf.2020-09-10” ou “cp nginx.conf.antes-de-ativar-o-ssl” só para ter uma recuperação rápida em caso de falha durante uma mudança.
Isso [as vezes] funciona mas não é seguro e nem organizado, então, se você usa isso com frequência pode estar na hora de conhecer uma solução mais limpa e organizada como o versionamento do /etc.
Um diretório que mantém a configuração do seu servidor
O /etc é onde estão as principais configurações de seu servidor, e seus serviços fundamentais, como seu serviço DNS, DHCP, Apache, Nginx, etc.
Se você administra máquinas Linux ou outras baseadas no padrão POSIX, é fundamental zelar pela organização deste diretório e preservar os seus arquivos de qualquer incidente e manter um histórico de mudanças pode ser bastante benéfico caso você tenha que reconfigurar seus sistemas ou mesmo entender o que houve com o seu serviço que até ontem funcionava e de repente parou.
Mantendo um controle das alterações do seu /etc
É aqui que entra o versionamento dos arquivos, pois com um simples comando, ou talvez dois, você já terá o seu arquivo recuperado e sem muita complicação. Como “recurso brinde” você ainda manterá um registro das mudanças.
Minha preferência pelo uso do Git como sistema de controle de versões é meramente por comodismo e ela quem será usada durante este texto, mas esteja confortável a usar a ferramenta de sua preferência e que tenha mais afinidade.
Você pode simplesmente transformar o seu /etc em um repositório Git com dois comandos básicos e a partir daí começara controlar o seu diretório de configurações:
cd /etc sudo git init .
Você pode ir a frente sem medo de ser feliz, mas se você já usou algum sistema de controle de versões sabe que sempre há aqueles arquivos que não valem a pena versionar. Seja porque são binários, ou por serem dinâmicos e criados quando se altera algum outro arquivo etc.
No /etc não é diferente. Arquivos “*.pyc”, “*.pyo”, “mtab”, “lvm/cache/*” entre outros são alguns dos exemplos que você estará versionando desnecessariamente (mas não se preocupe se o fizer não há risco nisso).
Você pode levar algum tempo refinando isso alterando o .gitignore (arquivo de exceções do Git) então para poupar o trabalho e ter ainda algum bônus, nós podemos aproveitar o trabalho de quem já trilhou por estes caminhos pedregosos.
Se optar por esta opção você deverá usar manualmente os comandos de versionamento do Git todas as vezes que alterar algo:
sudo git add fstab sudo git commit -m "Automount do volume NFS de caixas postais"
Usando uma ferramenta especializada para versionar o /etc
A ferramenta que costumo usar quando necessito desta abordagem de controle do /etc é chamada de EtcKeeper.
Provavelmente ela já está no repositório de pacotes da sua distribuição e a instalação é feita seguindo a mesma receita trivial que você já sabe, usando o gerenciador de pacotes da sua distribuição (yum, dnf, apt etc)
apt install git
apt install etckeeper
A sua instalação automaticamente iniciará um repositório local dentro de /etc/.git , adiciona um script em seu /etc/cron.daily para que diariamente ocorra um commit versionando as atualizações dos arquivos (que, se preferir, pode movê-lo ou copiá-lo para /etc/cron.hourly, ou mesmo para cron.weekly) e ainda um “gancho” no gerenciador de pacotes para que todas as vezes que ocorrer uma instalação de pacotes ele seja acionado antes e depois do processo.
Uma vez instalado você deverá editar o arquivo /etc/etckeeper/etckeeper.conf e, se necessário, alterar as configurações para usar o seu sistema de controle de versões preferido, ou alguma configuração “exótica”, embora o padrão já seja o ideal para maioria dos casos.
Caso tenha mudado o controle de versões, digamos, do Git para o Darc, você deverá iniciar o etckeeper novamente com o comando:
etckeeper init
A partir daqui, o versionamento ocorrerá automaticamente conforme o agendamento definido no Cron da sua máquina com uma mensagem de commit padrão, por isso, caso você altere algum arquivo, teste e o sistema esteja OK, você deve submeter suas alterações para o repositório manualmente.
Digamos que eu altere alguma configuração do Apache, reiniciei o serviço, testei está tudo OK, então agora é hora de guardar as mudanças:
etckeeper commit "Criando o Virtualhost para o hotsite do novo produto"
O EtcKeeper irá adicionar todos os arquivos alterados ao “stage” do Git e executará o commit. Inclusive, se você fizer as devidas configurações, um “push” para um repositório remoto poderá ocorrer também. Só esteja atendo a necessidade deste repositório ser privado, OK!? Nada de fazer commit do etc do seu servidor para um repositório público no Github ou outro servidor de versionamento público.
Para completar o conjunto de instruções básicas para o seu uso você só precisa saber que os comandos padrões do seu sistema de controle de versões estão sempre disponíveis e pode ser invocado com o comando “etckeeper vcs”.
Por exemplo, se para ver os logs de um repositório git eu normalmente uso o comando “git log”, para ver os logs no EtcKeeper eu uso:
etckeeper vcs log
O restante é com vocês. Partindo deste comando de exemplo, com o perdão do trocadilho, o “céu git é o limite”.
Por exemplo, se você conhece bem o git, vai perfeitamente entender o que estou fazendo nos comandos abaixo:
etckeeper vcs checkout -- httpd2.conf
etckeeper vcs rm mailname
etckeeper vcs annotate passwd
etckeeper vcs push
Referências
https://etckeeper.branchable.com/README/
https://wiki.archlinux.org/index.php/etckeeper
https://www.tecmint.com/manage-etc-with-version-control-using-etckeeper/