freehck.script_psql_backup
freehck.script_psql_backup
Este rol crea un script que realiza copias de seguridad de psql.
Hace un volcado de la base de datos, opcionalmente comprime y cifra la copia de seguridad con aes256.
Puede enviar mensajes a Slack.
Puede almacenar tu copia de seguridad en S3 o copiarla a otro host usando scp.
Variables del Rol
Variables básicas
psql_backup_host
: host de psql
psql_backup_port
: puerto de psql (por defecto 3306)
psql_backup_user
: usuario de psql
psql_backup_pass
: contraseña de psql
psql_backup_db
: base de datos psql para respaldar (si no se establece, se pasará la opción --all-databases a psqldump)
psql_backup_backend_use_s3
: establece en verdadero si deseas almacenar tu copia de seguridad en S3
psql_backup_backend_use_scp
: establece en verdadero si deseas enviar tu copia de seguridad a otro host usando scp
Variables del backend S3
psql_backup_s3cfg_template
: plantilla de tu configuración s3fs (se proporciona un valor por defecto, no te preocupes)
psql_backup_s3
: opciones de configuración de s3 en un formato como este
psql_backup_s3:
username: "s3user"
access_key: "s3user-akey"
secret_key: "s3user-skey"
bucket: "nombre-del-bucket"
Variables del backend SCP
psql_backup_scp_host
: host de almacenamiento para copiar tu copia de seguridad
psql_backup_scp_user
: usuario para iniciar sesión en el host de almacenamiento
psql_backup_scp_dst
: ruta en el host de almacenamiento para guardar tu copia de seguridad
psql_backup_scp_identity_src
: archivo de identidad para usar al iniciar sesión en el host de almacenamiento (sí, debe ser una clave privada)
Nomenclatura
psql_backup_archive_prefix
: solo el nombre de la copia de seguridad o simplemente todo lo que esté antes de la marca de tiempo
psql_backup_archive_stamp
: plantilla de marca de tiempo en formato de la herramienta date
(el valor por defecto es %F-%Hh%Mm%Ss
y resulta en marcas de tiempo que parecen 2019-09-23-12h22m07s
)
psql_backup_script_name
: si deseas renombrar el script base, eres bienvenido
psql_backup_custom_script_name
: si deseas establecer un nombre específico para el script de trabajo que realiza la copia de seguridad. El valor por defecto es psql-backup-<nombre_base_de_datos>.sh
, donde all
si no se especificaron bases de datos para respaldar.
psql_backup_scp_identity_name
: el valor por defecto es id_rsa
, pero podría ser útil modificarlo si deseas tener múltiples backends SCP que usen diferentes claves
psql_backup_encrypt_aes_key_name
: el valor por defecto es aes256.key
, necesario si deseas tener diferentes claves de encriptación para diferentes tareas de copia de seguridad
Notificaciones
psql_backup_warn_size
: en GiB, el valor por defecto es 0. Compara tu copia de seguridad con este tamaño. Si tu copia de seguridad es menor, te advertirá sobre esto.
psql_backup_hostname
: nombre del host (que se imprimirá en los mensajes de Slack)
psql_backup_slack_webhook
: como se indica, es un webhook de Slack; configúralo para recibir notificaciones de Slack.
Cómo obtener un webhook de Slack: https://get.slack.help/hc/en-us/articles/115005265063-Incoming-WebHooks-for-Slack
Variables de Compresión y Encriptación
psql_backup_gzip
: comprimir archivo de copia de seguridad
psql_backup_encrypt_aes
: encriptar archivo de copia de seguridad (si gzip está habilitado esta acción se realizará específicamente DESPUÉS de gzip)
psql_backup_encrypt_aes_key_src
: clave aes256 para encriptar tu copia de seguridad
La clave Aes256 es solo 32 bytes aleatorios.
Puedes usar el siguiente comando para crearla: dd if=/dev/urandom of=aes256.key count=1 bs=32.
Si prefieres contraseñas en cadena (es menos seguro) puedes usar esto: pwgen -n1 -s 32 | tr -d '\n' >aes256.key
Directorios
psql_backup_script_dir
: directorio para almacenar el script base
psql_backup_custom_script_dir
: directorio para almacenar scripts específicos de trabajos de copia de seguridad correspondientes
psql_backup_conf_dir
: directorio para almacenar archivos de configuración del script de copia de seguridad
psql_backup_encrypt_aes_key_dir
: directorio para almacenar la clave de encriptación aes256
psql_backup_tmpdir
: directorio para mantener resultados temporales (no necesitas crear uno separado, es /tmp por defecto)
Pasar datos fuera del rol
psql_backup_save_facts_about_custom_script
: si lo configuras en verdadero, entonces el rol guardará la ruta completa del script de trabajo generado, que debe ejecutarse para realizar la copia de seguridad, en la variable psql_backup_last_generated_custom_script
. Puedes usar esta variable para agregar una tarea cron específica para este script.
Ejemplo de Playbook
# crear script de trabajo de copia de seguridad psql
- rol: freehck.script_psql_backup
# parámetros de conexión psql
psql_backup_host: "{{ db_host }}"
psql_backup_user: "{{ db_user }}"
psql_backup_pass: "{{ db_pass }}"
psql_backup_db: "{{ db_name }}"
# parámetros de almacenamiento en backend
psql_backup_backend_use_s3: no
psql_backup_backend_use_scp: sí
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'
# gzip y encriptar
psql_backup_gzip: sí
psql_backup_encrypt_aes: sí
psql_backup_encrypt_aes_key_src: "{{ playbook_dir }}/files/aes256.bkp.key"
# otros
psql_backup_save_facts_about_custom_script: sí
psql_backup_logfile: "/var/log/psql-backup.log"
tags: [ backup, psql ]
# es sensato crear la tarea cron para este script de trabajo
- rol: freehck.crontask
crontask_file: "backups"
crontask_name: "respaldar base de datos"
crontask_hour: "12"
crontask_minute: "0"
crontask_job: "{{ psql_backup_last_generated_custom_script }}"
crontask_user: "root"
crontask_commented_out: false
tags: [ backup, psql ]
Información importante
Después de desplegar el script de copia de seguridad de psql en tu host, es sensato ir al host que realiza las tareas de copia de seguridad y ejecutar el script de trabajo desde /opt/scripts
sin parámetros. Si se ejecuta sin errores y ves el archivo de copia de seguridad en el almacenamiento, entonces todo está bien. Si no, descubrirás cuál fue el problema. Por ejemplo, podrías olvidarte de agregar el host de almacenamiento a known_hosts
al configurar usuarios. O tu plantilla s3cfg
podría contener un error. No olvides verificar todo dos veces: respaldar cosas es una tarea muy importante.
Después de verificar que la copia de seguridad fue creada y almacenada en el lugar correcto, revísala cuidadosamente. Debes estar seguro de que puedes restaurarla.
Licencia
MIT
Información del Autor
Dmitrii Kashin, freehck@freehck.ru
ansible-galaxy install freehck.script_psql_backup