script_psql_backup
freehck.script_psql_backup
Эта роль создает скрипт для выполнения резервного копирования psql.
Он создает дамп базы данных, возможно сжатый gzip и зашифрованный с использованием aes256.
Также может отправлять сообщения в Slack.
Резервные копии могут храниться на S3 или/и отправляться на другой хост с помощью SCP.
Переменные роли
Основные переменные
psql_backup_host
: хост psql
psql_backup_port
: порт psql (по умолчанию 3306)
psql_backup_user
: пользователь psql
psql_backup_pass
: пароль psql
psql_backup_db
: база данных psql для резервного копирования (если не указана, то передается параметр --all-databases для psqldump)
psql_backup_backend_use_s3
: установите в true, если хотите хранить резервную копию на S3
psql_backup_backend_use_scp
: установите в true, если хотите отправить резервную копию на другой хост с помощью SCP
Переменные для S3
psql_backup_s3cfg_template
: шаблон конфигурации вашего s3fs (по умолчанию предоставлен, не беспокойтесь)
psql_backup_s3
: параметры конфигурации S3 в следующем формате
psql_backup_s3:
username: "s3user"
access_key: "s3user-akey"
secret_key: "s3user-skey"
bucket: "bucket-name"
Переменные для SCP
psql_backup_scp_host
: хост для хранения вашей резервной копии
psql_backup_scp_user
: пользователь для входа на хост хранения
psql_backup_scp_dst
: путь на хосте хранения для сохранения вашей резервной копии
psql_backup_scp_identity_src
: файл ключа для входа на хост хранения (да, это должен быть приватный ключ)
Название
psql_backup_archive_prefix
: просто имя резервной копии или все, что перед меткой времени
psql_backup_archive_stamp
: шаблон метки времени в формате инструмента date
(по умолчанию %F-%Hh%Mm%Ss
, в результате метки времени выглядят как 2019-09-23-12h22m07s
)
psql_backup_script_name
: если хотите переименовать основной скрипт, пожалуйста
psql_backup_custom_script_name
: если хотите задать специфическое имя для скрипта, который фактически выполняет резервное копирование. По умолчанию это psql-backup-<database_name>.sh
, где all
, если не указаны базы данных для резервного копирования.
psql_backup_scp_identity_name
: по умолчанию id_rsa
, но может быть полезно изменить, если хотите иметь несколько SCP-реестров с разными ключами
psql_backup_encrypt_aes_key_name
: по умолчанию aes256.key
, требуется, если хотите использовать разные ключи шифрования для разных задач резервного копирования
Уведомления
psql_backup_warn_size
: в GiB, по умолчанию 0. Сравните вашу резервную копию с этим размером. Если ваша резервная копия меньше, предупредите об этом.
psql_backup_hostname
: имя хоста (которое будет отображено в сообщениях Slack)
psql_backup_slack_webhook
: как написано, это вебхук Slack; установите его, чтобы получать уведомления в Slack
Как получить вебхук Slack: https://get.slack.help/hc/en-us/articles/115005265063-Incoming-WebHooks-for-Slack
Переменные для сжатия и шифрования
psql_backup_gzip
: сжимает файл резервной копии
psql_backup_encrypt_aes
: шифрует файл резервной копии (если сжатие включено, это действие выполняется непосредственно ПОСЛЕ сжатия)
psql_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
Директории
psql_backup_script_dir
: директория для хранения основного скрипта
psql_backup_custom_script_dir
: директория для хранения скриптов, специфичных для соответствующих задач резервного копирования
psql_backup_conf_dir
: директория для хранения файлов конфигурации скрипта резервного копирования
psql_backup_encrypt_aes_key_dir
: директория для хранения ключа шифрования aes256
psql_backup_tmpdir
: директория для хранения временных результатов (вам не нужно создавать отдельную, по умолчанию это /tmp)
Передача данных за пределы роли
psql_backup_save_facts_about_custom_script
: если вы установите это в true, то роль сохранит полный путь к сгенерированному скрипту задачи, который необходимо выполнить для резервного копирования, в переменную psql_backup_last_generated_custom_script
. Вы можете использовать эту переменную, чтобы добавить конкретную задачу cron для этого скрипта.
Пример плейбука
# создание скрипта задачи резервного копирования psql
- role: freehck.script_psql_backup
# параметры подключения psql
psql_backup_host: "{{ db_host }}"
psql_backup_user: "{{ db_user }}"
psql_backup_pass: "{{ db_pass }}"
psql_backup_db: "{{ db_name }}"
# параметры хранения на сервере
psql_backup_backend_use_s3: no
psql_backup_backend_use_scp: yes
psql_backup_scp_host: "{{ hostvars['storage'].ansible_host }}"
psql_backup_scp_identity_src: "{{ playbook_dir }}/files/id_rsa.bkp.db01"
psql_backup_scp_user: 'file'
psql_backup_scp_dst: '/var/www/file/public/psql-db-prod-backup'
# сжатие и шифрование
psql_backup_gzip: yes
psql_backup_encrypt_aes: yes
psql_backup_encrypt_aes_key_src: "{{ playbook_dir }}/files/aes256.bkp.key"
# другое
psql_backup_save_facts_about_custom_script: yes
psql_backup_logfile: "/var/log/psql-backup.log"
tags: [ backup, psql ]
# целесообразно создать задачу cron для этого скрипта задачи
- role: freehck.crontask
crontask_file: "backups"
crontask_name: "резервное копирование базы данных"
crontask_hour: "12"
crontask_minute: "0"
crontask_job: "{{ psql_backup_last_generated_custom_script }}"
crontask_user: "root"
crontask_commented_out: false
tags: [ backup, psql ]
Важная информация
После развертывания скрипта резервного копирования psql на вашем хосте, целесообразно зайти на хост, выполняющий задачи резервного копирования, и запустить скрипт задачи из /opt/scripts
без параметров. Если он выполнен без ошибок и вы видите файл резервной копии на хранилище, значит, все в порядке. Если нет — вы узнаете, в чем была проблема. Например, вы могли забыть добавить хост хранения в known_hosts
, когда настраивали пользователей. Или ваш шаблон s3cfg
мог содержать ошибку. Не забудьте дважды проверить все: задача резервного копирования крайне важна.
После того как вы убедитесь, что резервная копия была создана и сохранена в нужном месте, проверьте ее внимательно. Вы должны быть уверены, что сможете восстановить данные с ее помощью.
Лицензия
MIT
Информация об авторе
Дмитрий Кашин, freehck@freehck.ru
ansible-galaxy install freehck/ansible-role-script-postgresql-backup