script_mysql_backup
freehck.script_mysql_backup
Эта роль создает скрипт, который выполняет резервное копирование MySQL.
Он создает дамп базы данных, возможно, сжатый с помощью gzip и зашифрованный с помощью aes256.
Скрипт может отправлять сообщения в Slack.
Он может сохранять резервную копию на S3 или/и передавать на другой хост с помощью SCP.
Переменные роли
Основные переменные
mysql_backup_host
: хост MySQL
mysql_backup_port
: порт MySQL (по умолчанию 3306)
mysql_backup_user
: пользователь MySQL
mysql_backup_pass
: пароль MySQL
mysql_backup_db
: база данных MySQL для резервного копирования (если не указана, будет использован параметр --all-databases для mysqldump)
mysql_backup_backend_use_s3
: установите значение true, если хотите сохранить резервную копию на S3
mysql_backup_backend_use_scp
: установите значение true, если хотите передать резервную копию на другой хост с помощью SCP
Переменные для S3
mysql_backup_s3cfg_template
: шаблон конфигурации для s3fs (по умолчанию предоставляется, не волнуйтесь)
mysql_backup_s3
: параметры конфигурации S3 в следующем формате
mysql_backup_s3:
username: "s3user"
access_key: "s3user-akey"
secret_key: "s3user-skey"
bucket: "bucket-name"
Переменные для SCP
mysql_backup_scp_host
: хост для хранения, куда будет скопирована резервная копия
mysql_backup_scp_user
: пользователь для входа на хост хранения
mysql_backup_scp_dst
: путь на хосте хранения для сохранения резервной копии
mysql_backup_scp_identity_src
: файл идентичности для входа на хост хранения (да, это должен быть закрытый ключ)
Именование
mysql_backup_archive_prefix
: просто имя резервной копии или всё, что перед меткой времени
mysql_backup_archive_stamp
: шаблон метки времени в формате инструмента date
(по умолчанию %F-%Hh%Mm%Ss
, результатом будут метки времени вроде 2019-09-23-12h22m07s
)
mysql_backup_script_name
: если хотите переименовать основной скрипт, пожалуйста
mysql_backup_custom_script_name
: если хотите задать конкретное имя для скрипта задания, который выполняет резервное копирование. По умолчанию это mysql-backup-<database_name>.sh
, где all
, если не указаны базы данных для резервного копирования.
mysql_backup_scp_identity_name
: по умолчанию это id_rsa
, но может быть полезно изменить его, если вы хотите иметь несколько SCP-ресурсов с разными ключами
mysql_backup_encrypt_aes_key_name
: по умолчанию это aes256.key
, необходимо, если хотите иметь разные ключи шифрования для разных задач резервного копирования
Уведомления
mysql_backup_warn_size
: в GiB, по умолчанию 0. Сравните размер вашей резервной копии с этим значением. Если ваша резервная копия меньше, предупредите об этом.
mysql_backup_hostname
: имя хоста (которое будет отображаться в сообщениях Slack)
mysql_backup_slack_webhook
: как указано, это вебхук Slack; установите его, чтобы получать уведомления в Slack
Как получить вебхук для Slack: https://get.slack.help/hc/en-us/articles/115005265063-Incoming-WebHooks-for-Slack
Переменные для сжатия и шифрования
mysql_backup_gzip
: сжать файл резервной копии с помощью gzip
mysql_backup_encrypt_aes
: зашифровать файл резервной копии (если включено gzip, это действие будет выполнено после сжатия)
mysql_backup_encrypt_aes_key_src
: aes256 ключ для шифрования вашей резервной копии
Aes256 ключ — это просто 32 байта случайных данных.
Вы можете использовать следующую команду для его создания: dd if=/dev/urandom of=aes256.key count=1 bs=32.
Если вы предпочитаете строковые пароли (это менее безопасно), вы можете использовать: pwgen -n1 -s 32 | tr -d '\n' >aes256.key
Каталоги
mysql_backup_script_dir
: каталог для хранения основного скрипта
mysql_backup_custom_script_dir
: каталог для хранения скриптов, специфичных для соответствующих задач резервного копирования
mysql_backup_conf_dir
: каталог для хранения конфигурационных файлов скрипта резервного копирования
mysql_backup_encrypt_aes_key_dir
: каталог для хранения ключа шифрования aes256
mysql_backup_tmpdir
: каталог для хранения временных результатов (создавать отдельный не нужно, по умолчанию это /tmp)
Передача данных за пределы роли
mysql_backup_save_facts_about_custom_script
: если установить в true, роль сохранит полный путь сгенерированного скрипта задания, который должен быть выполнен для резервного копирования, в переменную mysql_backup_last_generated_custom_script
. Вы можете использовать эту переменную для добавления конкретной задачи cron для этого скрипта.
Пример плейбука
# создание скрипта задания резервного копирования MySQL
- role: freehck.script_mysql_backup
# параметры подключения к MySQL
mysql_backup_host: "{{ db_host }}"
mysql_backup_user: "{{ db_user }}"
mysql_backup_pass: "{{ db_pass }}"
mysql_backup_db: "{{ db_name }}"
# параметры хранения
mysql_backup_backend_use_s3: no
mysql_backup_backend_use_scp: yes
mysql_backup_scp_host: "{{ hostvars['storage'].ansible_host }}"
mysql_backup_scp_identity_src: "{{ playbook_dir }}/files/id_rsa.bkp.db01"
mysql_backup_scp_user: 'file'
mysql_backup_scp_dst: '/var/www/file/public/mysql-db-prod-backup'
# сжатие и шифрование
mysql_backup_gzip: yes
mysql_backup_encrypt_aes: yes
mysql_backup_encrypt_aes_key_src: "{{ playbook_dir }}/files/aes256.bkp.key"
# другое
mysql_backup_save_facts_about_custom_script: yes
mysql_backup_logfile: "/var/log/mysql-backup.log"
tags: [backup, mysql]
# разумно создать задачу cron для этого скрипта задания
- role: freehck.crontask
crontask_file: "backups"
crontask_name: "резервное копирование базы данных"
crontask_hour: "12"
crontask_minute: "0"
crontask_job: "{{ mysql_backup_last_generated_custom_script }}"
crontask_user: "root"
crontask_commented_out: false
tags: [backup, mysql]
Важная информация
После развертывания скрипта резервного копирования MySQL на вашем хосте разумно зайти на хост, который выполняет задачи резервного копирования, и запустить скрипт задания из /opt/scripts
без параметров. Если он прошел без ошибок и вы видите файл резервной копии на хранилище, значит, все в порядке. Если нет — вы узнаете, в чем проблема. Например, вы могли забыть добавить хост хранилища в known_hosts
при настройке пользователей. Или ваш шаблон s3cfg
мог содержать ошибку. Не забудьте проверить все дважды: резервное копирование — очень важная задача.
После того, как вы проверите, что резервная копия была создана и сохранена в правильном месте, внимательно проверьте ее. Вы должны быть уверены, что сможете восстановить данные с ее помощью.
Лицензия
MIT
Авторская информация
Дмитрий Кашин, freehck@freehck.ru
ansible-galaxy install freehck/ansible-role-script-mysql-backup