Fez besteira no /etc? Use o git para retornar tudo ao normal
Sistemas de controle de versão, ou VCS ou SCM (source code
management), como são mais conhecidos, são ferramentas fundamentais para
programadores. Com um SCM, o programador — ou toda a equipe de
programadores — pode fazer alterações nos arquivos-fonte que compõem um programa
e, caso o resultado não seja o desejável, retornar a qualquer uma das versões
anteriores.
Contudo, o grupo dos administradores de sistemas logo percebeu que os SCMs
também têm uma utilidade muito importante em seus trabalhos diários. Geralmente,
nós sysadmins de sistemas GNU/Linux e outros derivados de Unix editamos
frequentemente os arquivos de configuração localizados no diretório
Portanto, SCMs são perfeitos para controlar as versões dos próprios arquivos
de configuração abrigados no Qual SCM?Mais uma das do Software Livre: o enorme leque de opções. Temos SCMs para todos os gostos, e os mais indicados são aqueles capazes de armazenar apenas as diferenças entre os arquivos, em vez de armazenar um arquivo inteiro a cada vez que ele é alterado. Imagine um arquivo que costuma ter apenas um caractere alterado; ele seria copiado por inteiro a cada vez que o SCM detectasse uma alteração. Grande desperdício, não? Por isso, vamos dar preferência àqueles SCMs que só gravam as linhas que foram alteradas. Isso também é TI Verde! ;) As escolhas de SCM mais comuns na atualidade são:
Todos estes funcionam basicamente da mesma forma: o usuário marca um
diretório (o A própria Wikipédia também contém um comparativo de todos os SCMs disponíveis hoje em dia, incluindo as diferenças entre os comandos de cada um deles. GitO Git tem grande presença no mercado do Software Livre. Criado originalmente pelo próprio Linus Torvalds, é extremamente rápido e seus usuários, segundo o website, incluem o frenético kernel Linux, o ambiente desktop Gnome, o sistema operacional Android e as distribuições GNU/Linux Fedora e Debian, entre outros. Uma desvantagem teórica do Git é sua "composição": shell script, Perl e C. Porém, seu ótimo desempenho mostra que esse design de fato não acarreta problemas. Por esses motivos, este artigo usará o Git como SCM para criar nossa solução
de versionamento do Técnica "sujinha" e rápida: cronjobA primeira técnica que vou apresentar é a mais "sujinha". Ela consiste em
"bater fotografias" do Dependendo do seu ritmo de alterações no A sequência de comandos do Git (e seus resultados) para inicializar um repositório é: $ cd /etc $ git init Initialized empty Git repository in /etc/.git/ $ git add . $ git commit -a -m "Primeiro commit" [master (root-commit) 417e323] Primeiro commit 54 files changed, 8171 insertions(+), 0 deletions(-) (...) Feito isso, seu Passadas algumas alterações em seus arquivos de configuração, você só precisa de um único comando para armazená-las no Git: $ git commit -a -m "$(date '+%Y Git não (re)conhece arquivos novos!Porém, se você tiver instalado um novo pacote, que por sua vez criou um novo
arquivo de configuração no $ git add . $ git commit -a -m "$(date '+%Y Agora no CronAgora que já sabemos como adicionar novos arquivos ao "repositório" gerenciado pelo Git, basta mandarmos o Cron se encarregar disso. Adicione ao diretório #!/bin/sh # Executar 'git commit -a' no /etc # Esta é uma ótima forma de manter versões # de todos os arquivos de configuração. cd /etc/ git add . git commit -a -m "Commit automático em $(date '+%d/%m/%Y às %H:%M:%S')" exit 0 Por último, não se esqueça de tornar o seu script executável! $ chmod a+x /etc A partir de agora, o seu script entrará em ação uma vez por dia (ou por hora,
caso você tenha usado o diretório Problemas à frente!Esta abordagem é "sujinha" por conta de um tipo muito comum de problema:
imagine que seu sistema esteja instalando um pacote no momento em que o script
Outro problema: se você estiver testando várias alterações em um arquivo do
Se esses problemas não parecem ruins demais para você, esta abordagem é simples e prática. Tamanho e manutenção do repositórioCom o passar do tempo, o Git pode acabar acumulando arquivos desnecessários,
que posteriormente venham a ser apagados, por exemplo. Ele não apaga esse "lixo"
sozinho. Porém, há um comando exatamente para isso: O Git também é econômico quanto ao espaço em disco — um resultado do
armazenamento apenas das linhas alteradas. Para dar um exemplo, o diretório
Sujinho com outros SCMsComo você já deve ter imaginado, substituir o Git pelo Mercurial ou Bazaar ou Darcs no método "sujinho" é muito fácil: basta conferir os comandos equivalentes nesses SCMs. A Wikipédia é muito amiga nessas horas. ;) Método eleganteO "jeito certo" de colocar o O etckeeper sabe utilizar todos os quatro SCMs que este artigo cita:
Git, Mercurial, Bazaar e Darcs. Ele já conta com um pacote na maioria das
distribuições, bastando um A configuração do etckeeper é simples: abra o arquivo
# The VCS to use. #VCS="hg" VCS="git" #VCS="bzr" #VCS="darcs" (...) Em seguida, informe o gerenciador de pacotes de alto nível ( (...) # The high-level package manager that's being used. # (apt, pacman-g2, yum etc) HIGH Esse arquivo de configuração já mostra o bom trabalho de integração realizado
pelo etckeeper: ele se acopla aos gerenciadores de pacotes para saber
quando há novos arquivos no E as alterações manuais?No entanto, não são somente os gerenciadores de pacotes que fazem alterações
nos seus arquivos do Dê uma olhada no diretório Da mesma forma que podemos escolher a frequência dos commits no jeito
"sujinho", o etckeeper também permite isso: basta mover o script do
diretório Ao terminar de preparar o etckeeper, inicialize seu repositório
com o comando RecuperaçãoEntão quer dizer que você finalmente conseguiu: alterou tanto algum arquivo de configuração que já não sabe mais como ele era quando funcionava. Parabéns! :) Por sorte, você já está usando uma das ferramentas de controle de versões no
Até que dia e hora o arquivo funcionava? Ontem? Confira os seus últimos commits com: $ cd /etc $ git log Esse comando retornará toda a lista de commits mais recentes. Note que cada commit possui um longo número que parece um hash: commit 8664 Quer ver o que esse commit tem de diferente do anterior? Basta um
$ git show 8664 Para recuperar o estado do $ git checkout 8664 Feito isso, todos os arquivos do $ cd /etc $ rm um_arquivo $ ls um_arquivo ls: impossível acessar um_arquivo: Arquivo ou diretório não encontrado $ git checkout um_arquivo $ ls um_arquivo um_arquivo $ _ Nada mal, hein? ConclusãoNas atividades diárias do sysadmin, provavelmente o checkout de versões anteriores do arquivo e a recuperação de arquivos apagados serão os recursos mais importantes e mais usados. Porém, tanto o Git quanto os outros SCMs podem fazer muito mais do que isso. Confira a documentação de cada SCM para desfrutar de todo o poder que eles oferecem. Até a próxima! Outros artigos deste autor
|


