Как автоматизировать резервное копирование с помощью DigitalOcean Spaces

Вступление

Резервное копирование важных данных является важной частью управления любой компьютерной инфраструктурой. Несмотря на то, что у всех разные потребности в создании резервных копий, рекомендуется хранить данные резервных копий в удаленном расположении.

Процесс отправки копий данных в стороннее местоположение был главной логистической проблемой. Но с появлением облачных сервисов хранения, таких как Crashplan и Dropbox, а также с развитием решений для хранения объектов, таких какDigitalOcean Spaces, эта задача стала намного проще. Несмотря на это, не забывая о резервном копировании файлов и потратив время на их загрузку, для некоторых это может стать препятствием.

Вот почему люди предпочитают использовать различные инструменты для выполнения рутинных автоматических резервных копий их важных данных. В этом руководстве мы создадим сценарий для инструмента командной строкиs3cmd, который можно использовать для быстрой загрузки данных в DigitalOcean Spaces. Затем мы будем использоватьcrontab для регулярного вызова сценария резервного копирования и загрузки файлов в наше пространство.

Предпосылки

Для этого урока вам понадобятся:

Также может быть полезно некоторое знакомство со сценариями оболочки и планировщиком заданийcron. Для получения некоторых рекомендаций и дополнительного контекста, рассмотрите «https://www.digitalocean.com/community/tutorial_series/an-introduction-to-shell-scripting[An Введение в сценарии оболочки]» и «https: //www.digitalocean .com / community / tutorials / Как запланировать рутинные задачи с помощью cron-and-anacron-on-a-vps [Как запланировать рутинные задачи с помощью Cron и Anacron на VPS] ».

С нашими необходимыми условиями мы готовы начать процесс автоматизации резервного копирования.

Создание нашего скрипта резервного копирования

Существует ряд инструментов, которые можно использовать для автоматической и регулярной загрузки файлов резервных копий в службу хранения объектов. Тем не менее, их может быть сложно настроить, и они не могут обеспечить большую гибкость. Использование простого сценария оболочки может быть гораздо более элегантным и простым подходом к автоматизации резервного копирования хранилища объектов.

В этом руководстве мы напишем базовый сценарий bash, который создаст резервную копию файла или каталога с помощьюtar. Затем сценарий загрузит эту резервную копию в Spaces с помощью утилиты командной строкиs3cmd.

Чтобы начать, войдите в свою Droplet и перейдите в свою домашнюю папку:

cd ~

Оказавшись в домашней папке, мы будем использоватьnano для создания пустого файла, который мы можем написать в нашем скрипте:

nano bkupscript.sh

Теперь мы готовы начать писать сценарий резервного копирования в текстовом редакторе. Когда мы создаем скрипт, мы объясним каждую его часть по порядку, раздел за разделом.

Инициирование нашего сценария

На данный моментbkupscript.sh - это только пустой текстовый файл. Чтобы наш компьютер вызывал наш исполняемый файл в виде команд, нам нужно начать наш скрипт с хеш-бенга. hashbang - это директива интерпретатора, которая позволяет запускать сценарии или файлы данных как команды.

В нашем случае hashbang будет выглядеть так:

bkupscript.sh

#!/bin/bash

Включив это в верхнюю часть скрипта, мы сообщаем оболочке запускать команды файла в bash.

Объявление переменных

Далее мы сообщим нашему сценарию переменные, которые ему необходимо знать для правильной работы. Мы можем добавить их прямо под hashbang вверху текстового файла:

bkupscript.sh

...
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3

Давайте рассмотрим, что мы назначаем каждой из этих переменных:

  • DATETIME: эта переменная содержит метку времени, которую нужно прикрепить к имени полученного файла, чтобы каждый файл, резервная копия которого хранится в нашем пространстве, имел уникальное имя. Эта временная метка создается путем вызова командыdate и форматирования вывода для отображения двух последних цифр года (%y), двух цифр месяца (%m), двух цифры дня (%d), часа (%H), минут (%M) и секунд (%S).

  • SRC: это путьsource к файлу или папке, которую мы хотим сделать резервную копию. $1 указывает, что мы берем это значение из первого параметра, переданного в скрипт.

  • DST: эта переменная представляетdestination файла. В нашем случае это имя пространства, в которое мы загружаем резервную копию. Это имя будет получено из второго параметра, переданного в сценарий, как указано$2.

  • GIVENNAME: в этой переменной хранится выбранное пользователем имя для файла назначения. Результирующее имя файла будет начинаться сGIVENNAME, и к нему будет добавленDATETIME. Это имя происходит от третьего параметра, переданного скрипту ($3).

Предоставление некоторой помощи

При написании сценария полезно добавить несколько советов или общих советов, которые могут помочь пользователям устранить неполадки, если их попытки использовать его не удаются.

Для нашего сценария резервного копирования мы добавим функцию под названиемshowhelp() под нашими переменными. Это напечатает серию сообщений, чтобы помочь пользователям устранить неполадки в случае сбоя сценария. При добавлении функции в bash наш синтаксис будет выглядеть так:

bkupscript.sh

...
showhelp(){

}

Эта функция будет отображать справочные сообщения, выводя на экран ряд инструкций по использованию. Каждая инструкция должна быть представлена ​​в виде строки, заключенной в двойные кавычки. В нашем примере ниже вы заметите, что в начале или конце некоторых строк записаны или . Этоescape characters, которые содержат конкретные инструкции о том, как строка должна отображаться в выводе скрипта:

  • указывает на пространство табуляции

  • указывает на разрыв строки

Не стесняйтесь добавлять любые полезные сведения об использовании между фигурными скобками (просто не забудьте поставить перед любой строкойecho). Для демонстрационных целей мы добавим следующее:

bkupscript.sh

echo "\n\n############################################"
echo "# bkupscript.sh                            #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"<^>

Окончательная функцияshowhelp должна выглядеть примерно так:

bkupscript.sh

...
showhelp(
        echo "\n\n############################################"
        echo "# bkupscript.sh                            #"
        echo "############################################"
        echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
        echo "In order to work, this script needs the following three parameters in the listed order: "
        echo "\t- The full path for the folder or file you want to backup."
        echo "\t- The name of the Space where you want to store the backup at."
        echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
        echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"
}

Имея текст справки, мы можем приступить к сбору файлов, которые мы хотели бы сохранить в нашем пространстве.

Сбор файлов

Прежде чем наш сценарий сможет что-либо перенести в наше пространство, он должен сначала собрать нужные файлы и объединить их в один пакет для загрузки. Это можно сделать с помощью утилитыtar и условного оператора. Поскольку мы используемtar для создания файла архива (иногда называемого «zip-файлом»), мы будем называть эту функциюtarandzip().

Начнем с объявления функции и добавления еще одной командыecho, чтобы пользователи знали, что сценарий начал сбор файлов:

bkupscript.sh

...
tarandzip(){
    echo "\n##### Gathering files #####\n"
}

Под командойecho мы можем добавить командуtar, которая будет выполнять работу по сбору и сжатию файлов в один выходной файл.

bkupscript.sh

tarandzip(){
    echo "\n##### Gathering files #####\n"
    tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}

Вы заметите, что эта командаtar вызывается с несколькими параметрами и переменными:

  • c: этот флаг указываетtar сжать выходной файл.

  • z: указываетtar сжать файл с помощьюgzip.

  • v: это означает параметрverbose, который указываетtar показывать больше информации в выводе.

  • f: этот флаг указываетtar сохранить файл с именем, указанным рядом.

  • $GIVENNAME-$DATETIME.tar.gz: сценарий вызывает эти переменные, которые мы объявили в начале, для создания нового имени файла. Это достигается путем объединения переменных$GIVENNAME и$DATETIME и добавления в конец расширения.tar.gz для формирования нового имени файла.

  • $SRC: эта переменная представляет файлы или папкиsource, резервные копии которых мы инструктируемtar.

Эта функция теперь должна иметь возможность делать то, что мы хотим, но мы можем добавить еще несколько вызововecho, чтобы предоставить пользователю дополнительную информацию о том, как работает скрипт. Это можно сделать, добавив пару условных операторов, например:

bkupscript.sh

    if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
        echo "\n##### Done gathering files #####\n"
        return 0
    else
        echo "\n##### Failed to gather files #####\n"
        return 1
    fi

Когда предложениеif вызывается, оно выполняет командуtar и ожидает результата. Если результат команды положительный (что означает, что она выполнена успешно), будут выполнены строки междуthen иelse. Это:

  • Вывод сообщения о том, что сценарий успешно завершил процессtar

  • Возвращение кода ошибки0, чтобы та часть кода, которая вызывает эту функцию, знала, что все работает нормально.

Частьelse этой функции будет выполнена, только если командаtar обнаружит ошибку при выполнении. В этом случае ветвь предложенияelse будет:

  • Вывести сообщение о том, что командаtar не выполнена

  • Вернуть код ошибки1, указывающий на то, что что-то пошло не так

Наконец, мы заканчиваем предложениеif/then/else выражениемfi, что на языке bash означает, что предложениеif закончилось.

Завершенная функцияtarandzip() будет выглядеть так:

bkupscript.sh

tarandzip(){
    echo "\n##### Gathering files #####\n"
    if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
        echo "\n##### Done gathering files #####\n"
        return 0
    else
        echo "\n##### Failed to gather files #####\n"
        return 1
    fi
}

Имея функциюtarandzip(), мы готовы настроить сценарий для перемещения наших резервных копий.

Перенос файлов в хранилище объектов

На этом этапе мы можем заставить наш сценарий резервного копирования передать файл в наше пространство с помощью командыs3cmd. Как и в случае сtarandzip, мы также можем использоватьecho для нескольких строк и использовать операторif/then/else, чтобы пользователи были в курсе того, как скрипт работает во время выполнения.

Сначала мы объявим нашу функцию. Давайте снова сделаем это простым и назовем егоmovetoSpace():

bkupscript.sh

...
movetoSpace(){

}

Теперь мы можем использоватьs3cmd и переменные, которые мы объявили ранее, для создания команды, которая будет помещать наши файлы резервных копий в наше пространство:

bkupscript.sh

movetoSpace(){
    ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}

Вот что означает каждая часть этой команды:

  • ~/s3cmd-2.0.1/s3cmd: вызываетs3cmd, acommand line tool used for managing object storage buckets.

  • put: это команда, используемаяs3cmd для загрузки данных в корзину.

  • $GIVENNAME-$DATETIME.tar.gz: это имя резервной копии, которая будет загружена в наше пространство. Он состоит из четвертой и первой объявленных нами переменных, за которыми следуют.tar.gz, и создается функциейtarandzip() ранее.

  • s3://$DST;: это место, куда мы хотим загрузить файл. s3:// - это схема типа URI, используемая специально для описания мест хранения объектов в сети, а$DST; - это третья переменная, которую мы объявили ранее.

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

Давайте начнем с уведомления пользователя о том, что процесс начался:

bkupscript.sh

movetoSpace(){
    echo “\n##### MOVING TO SPACE #####\n”
    ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}

Поскольку команда будет либо успешной, либо неудачной (то есть, она либо загрузит файлы в наше пространство, либо нет), мы можем сообщить пользователям, сработала ли она, повторив одну из двух строк, содержащихся вif/then/else заявление, например:

bkupscript.sh

...
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
    echo "\n##### Done moving files to s3://"$DST" #####\n"
    return 0
else
    echo "\n##### Failed to move files to the Space #####\n"
    return 1
fi

Этот условный оператор сообщает bash: «Если наша командаs3cmd работает правильно, то пусть пользователь знает, что сценарий завершил перемещение файлов в наше пространство. В противном случае, сообщите пользователю, что процесс завершился неудачей ».

Если процессs3cmd завершается успешно, функция выводит сообщение на экран (первая строкаecho в оператореthen), указывающая на это, и возвращает значение0 , который сообщает вызывающей функции, что операция завершена. Если процесс завершается неудачно, предложениеthen просто печатает сообщение об ошибке (вторая строкаecho) и возвращает1, чтобы остальная часть скрипта знала, что произошла ошибка.

В целом функцияmovetoSpace() должна выглядеть так:

bkupscript.sh

movetoSpace(){
    echo "\n##### MOVING TO SPACE #####\n"
    if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
        echo "\n##### Done moving files to s3://"$DST" #####\n"
        return 0
    else
        echo "\n##### Failed to move files to the Space #####\n"
        return 1
    fi
}

Написав функциюmovetoSpace(), мы можем перейти к тому, чтобы убедиться, что сценарий настроен для вызова функций в ожидаемом порядке с помощью условных операторов для управления потоком.

Настройка управления потоком

Хотя мы настроили наш сценарий с помощью функций, мы не предоставили заказ сценарию для выполнения этих функций. На этом этапе мы можем представить вызывающую функцию, которая расскажет остальной части скрипта, как и когда запускать другие функции, которые мы написали.

Предполагая, что все настроено правильно, когда мы запускаем скрипт, он должен прочитать команду ввода, присвоить значения из нее каждой переменной, выполнить функциюtarandzip(), а затем выполнить функциюmovetoSpace(). В случае сбоя сценария между любой из этих точек он должен распечатать вывод нашей функцииshowhelp(), чтобы помочь пользователям в устранении неполадок. Мы можем упорядочить это и отловить ошибки, добавив серию операторовif/then/else в конец файла:

bkupscript.sh

...
if [ ! -z "$GIVENNAME" ]; then
    if tarandzip; then
        movetoSpace
    else
        showhelp
    fi
else
    showhelp
fi

Первый операторif в приведенном выше разделе проверяет, не пуста ли третья переданная переменная. Это делается следующим образом:

  • [ ]: квадратные скобки указывают, что между ними находитсяtest. В этом случае тест для определенной переменной не должен быть пустым.

  • !: в данном случае этот символ означаетnot.

  • -z: эта опция указываетempty string. Итак, в сочетании с! мы запрашиваемnot an empty string.

  • $GIVENNAME: здесь мы указываем, что строка, которую мы не хотим быть пустой, является значением, присвоенным переменной$GIVENNAME. Причина, по которой мы выбрали этот подход, заключается в том, что этой переменной присваивается значение, переданное третьим параметром при вызове сценария из командной строки. Если мы передадим сценарию менее 3 параметров, в коде не будет третьего параметра для присвоения значения$GIVENNAME, поэтому он назначит пустую строку, и этот тест завершится ошибкой.

Предполагая, что этот первый тест прошел успешно, он перейдет к следующему операторуif и так далее. Если какой-либо из операторовif возвращает ошибку, предложениеthen вызовет функциюshowhelp, и в выводе будет отображаться текст справки. По сути, это то, что он склеивает все предыдущие функции, которые мы написали, и дает bash информацию, необходимую для их выполнения в правильном порядке.

Наш скрипт завершен! Вы можете убедиться, что ваш скрипт выглядит как полноценный скрипт, который мы создали в следующем разделе.

Полный сценарий

Готовый скрипт резервного копирования, который мы создали, должен выглядеть следующим образом:

bkupscript.sh

#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(){
        echo "\n\n############################################"
        echo "# bkupscript.sh                            #"
        echo "############################################"
        echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
        echo "In order to work, this script needs the following three parameters in the listed order: "
        echo "\t- The full path for the folder or file you want to backup."
        echo "\t- The name of the Space where you want to store the backup at (not the url, just the name)."
        echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
        echo "Example: sh bkupscript.sh ./testdir testSpace backupdata\n"
}
tarandzip(){
    echo "\n##### Gathering files #####\n"
    if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
        echo "\n##### Done gathering files #####\n"
        return 0
    else
        echo "\n##### Failed to gather files #####\n"
        return 1
    fi
}
movetoSpace(){
    echo "\n##### MOVING TO SPACE #####\n"
    if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
        echo "\n##### Done moving files to s3://"$DST" #####\n"
        return 0
    else
        echo "\n##### Failed to move files to the Space #####\n"
        return 1
    fi
}
if [ ! -z "$GIVENNAME" ]; then
    if tarandzip; then
        movetoSpace
    else
        showhelp
    fi
else
    showhelp
fi

После того, как вы проверили свой скрипт, не забудьте сохранить и закрыть файл (CTRL-x,y, затемENTER) перед выходом из nano.

Тестирование скрипта

Теперь, когда мы закончили с созданием скрипта, мы можем перейти к его тестированию. Это не только скажет нам, правильно ли мы написали сценарий, но также даст нам возможность попрактиковаться в использовании сценария и увидеть его в действии.

При тестировании такого сценария обычно рекомендуется использовать фиктивные файлы. Несмотря на то, что мы знаем, что он не способен уничтожать или удалять данные, разумно обезопасить его, протестировав его с некоторыми неважными файлами. Сначала мы создадим каталог с помощью командыmkdir:

mkdir backupthis

Затем мы создадим два пустых файла внутри этого каталога, используяtouch:

sudo touch backupthis/file1.txt
sudo touch backupthis/file2.txt

Теперь мы можем протестировать сценарий, загрузив каталогbackupthis и его содержимое в наше пространство. Это формат, который нам нужно будет использовать для вызова скрипта:

sh bkupscript.sh ./backupthis name_of_your_space testrun

[.Примечание]##

Note Поскольку функцияmovetoSpace() автоматически добавляетs3:// к целевой переменной (т. е. к имени вашего пространства), эта переменная должна быть просто именем вашего пространства, а не его полным URL. Например, если URL вашего пространства «https: //example-space-name.nyc3.digitaloceanspaces.com», вы должны написать тестовую команду следующим образом:

sh bkupscript.sh ./backupthis example-space-name testrun

Команда, приведенная выше, приведёт скрипт в движение, и вы должны увидеть результат примерно так:

Output
##### Gathering files #####

./backupthis/
./backupthis/file1.txt
./backupthis/file2.txt

##### Done gathering files #####


##### MOVING TO SPACE #####

upload: 'testrun-180119-15_09_36.tar.gz' -> 's3://name_of_your_space /testrun-180119-15_09_36.tar.gz'  [1 of 1]
 162 of 162   100% in    8s    19.81 B/s  done

##### Done moving files to s3://name_of_your_space #####

Если вы столкнулись с какими-либо ошибками, просмотрите ваш скрипт, чтобы убедиться, что он соответствует нашему примеру. Также убедитесь, что ваша установкаs3cmd была правильно настроена и что ключ доступа и секретный ключ, который вы используете, верны.

Автоматизация резервного копирования с помощью Crontab

После успешного тестирования сценария резервного копирования мы можем настроить заданиеcron, которое будет использовать сценарий для регулярного резервного копирования в наше пространство. Для целей данного руководства мы настроим его на выполнение сценария резервного копирования каждую минуту.

Во-первых, нам нужно сделать исполняемый скрипт:

chmod +x bkupscript.sh

Теперь, когда сценарий можно выполнять как команду, мы можем редактировать файлcrontab, чтобы сценарий запускался каждую минуту:

crontab -e

При первом запускеcrontab -e он попросит вас выбрать редактор из списка:

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]:

Вы можете выбрать nano по умолчанию или другой текстовый редактор по вашему выбору.

Оказавшись вcrontab, мы добавим следующую строку в конец значений, которые уже есть:

/tmp/crontab.example/crontab

* * * * * ~/bkupscript.sh ~/backupthis nameofyourspace cronupload

Чтобы сохранить изменения, нажмитеCTRL-x, затемy, затемENTER.

Примерно через минуту вы увидите новый файл на панели управления вашего Space!

Если вы оставите заданиеcron запущенным, не внося никаких изменений, то каждую минуту в ваше пространство будет копироваться новый файл. Убедившись, чтоcron работает успешно, вы можете перенастроитьcrontab для резервного копирования файлов с желаемым интервалом.

Теперь у вас есть скрипт, который периодически сжимает и отправляет ваши резервные копии в DigitalOcean Space!

Заключение

В этом руководстве мы рассмотрели, как создавать регулярные резервные копии важных файлов за пределами офиса с помощью сценария bash,crontab и DigitalOcean Spaces. Хотя сценарий, представленный в этом руководстве, предназначен только для демонстрационных целей, его можно использовать в качестве основы для создания готовой к производству версии, которую впоследствии можно будет интегрировать с решением CI / CD, напримерJenkins,Drone илиTravis CI.

Если вы хотите узнать больше об инструментах CI / CD, вы можете сделать это, прочитав следующие руководства:

Related