суббота, 25 апреля 2015 г.

Автоматический бекап конфигов и скриптов в облачный git

Линукс особенная операционная система. Имяя лишь одни конфиги, можно восстановить систему в точно такое же состояние с нуля, даже если стереть все остальные директории.
Поэтому иметь их бекап просто необходимо.
Для себя я решил хранить все текстовые конфигурационные файлы в облаке используя систему гит. Что позволяет обеспечить

  1. просто удобный бекап, без страха что-то потерять.
  2. доступность с любой машины
  3. версионность и удобный просмотр всех сделанных изменений
  4. ведение нескольких версий логов при неоходимости

Звучит, отлично! Осталось только все настроить и сделать так, чтобы бекап был полностью автоматический.
Для себя я выбрал вариант коммитить раз в день вечером сами конфиги /etc, содержимое хоума, и также мои скрипты.

1. Для создания репозиториев я выбрал bitbucket , главным образом за неограниченное количество прайват репозиториев. Не вижу смысла кому-то светить конфиги или скрипты, используемые для личных нужд. Итак, завел на нем три репозирия : под /etc, хоум директорию и /usr/local/bin скрипты

2. Далее настроил доступ по ssh. Для этого надо сгенерить private/public пару ключей. Процесс очень хорошо описан на самом bitbucket. На данном этапе требуется только наличие private ключа на машине. Подкладываться он будет автоматически скриптом при коммитах.

3. Далее создаем локальные git репозитории на каждую директорию:
Имя вашего репозитория можно посмотреть в веб интерфейсе bitbucket

  cd /etc   
  git init   
  git remote add origin git@bitbucket.org:vasya_pupkin/configs.git 

4. Для хоума я также написал .gitignore файл, чтобы комиттить только конфиги. И исключать все остальное что , как оказалось может там лежать. Пример моего .gitignore для домашней директории:
  # exclude everything   
  /*   
  # excepting directories and files beginning with .   
  !/.*   
  #specifically exclude these cache directories   
  /.local   
  /.dropbox-dist   
  /.config/google-chrome*   
  /.config/MIB*   
  **/RecentDocuments   
  /temp   
  #exclude specifically different log files and cache everywhere   
  **/*ache   
  **/*humbnails   
  **/*.log   
  **/*core   
  **/*.swp   
  **/*.swo   
  **/*.bak   
  .xsession*   
  #exclude some common binaries   
  **/*.zip   
  **/*.png   
  **/*.jpg   
  **/*.jpeg   
  **/*.svg   
  **/*.so   
  **/*.dll   
  #exclude secured files   
  **/*ssh   
  **/*.kdbx

Для /etc также небольшой .gitignore
  **/ssh 


5. Чтобы автоматически коммитить изменения я прописал вот такой конфиг в fcrontab
  %nightly * 20-23 /usr/local/bin/backup_configs /home/myuser | systemd-cat -t backup_configs  
  %nightly * 20-23 /usr/local/bin/backup_configs /usr/local/bin | systemd-cat -t backup_configs  
  %nightly * 20-23 /usr/local/bin/backup_configs /etc | systemd-cat -t backup_configs


Данный крон конфиг будет запускать скрипт для коммита изменений один раз в день между 20 и 24.00 , как только сможет.
Добавленная в конец команда "| systemd-cat -t backup_configs" требует наличия systemd и перенаправляет весь вывод скрипта в системный журнал.
Логи удобно можно посмотреть командой
journalctl -t backup_configs --since today

6. Ну и собственно сам скрипт. Так как доступ настроeн по ssh, то скрипт каждый раз подымает ssh агента, и подсовывает ему private кей для логина. А потом этого агента киляет.
Скрипт также использует systemd-cat для записи в systemd журнал
#!/bin/bash
BACKUP_DIR=$1
RSA_KEY="/home/myuser/.ssh/git_key"

function cleanup {
    /bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT

cd $BACKUP_DIR
echo "Backup $BACKUP_DIR" | systemd-cat -t backup_configs
if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent`
  ssh-add $RSA_KEY
fi

git add .
git commit -m 'automated backup' .
git push -u origin master


2 комментария :

  1. Почему бы просто не использовать etckeeper? Зачем писать свои велосипеды?

    ОтветитьУдалить
  2. спасибо за ссылку на etckeeper. Прочитал док. Я правильно понимаю, что он бекапит только /etc ? А как насчет хоума и директории со скриптами?

    ОтветитьУдалить