freehck.script_mysql_backup
freehck.script_mysql_backup
Este rol crea un script que realiza copias de seguridad de MySQL.
Realiza un volcado de la base de datos, posiblemente comprime y cifra la copia de seguridad con aes256.
Puede enviar mensajes a Slack.
Puede almacenar tu copia de seguridad en S3 y/o copiarla a otro host mediante SCP.
Variables del Rol
Variables básicas
mysql_backup_host
: host de mysql
mysql_backup_port
: puerto de mysql (por defecto 3306)
mysql_backup_user
: usuario de mysql
mysql_backup_pass
: contraseña de mysql
mysql_backup_db
: base de datos mysql para hacer copia (si no se establece, entonces se pasará la opción --all-databases a mysqldump)
mysql_backup_backend_use_s3
: establecer en verdadero si deseas almacenar tu copia en S3
mysql_backup_backend_use_scp
: establecer en verdadero si quieres enviar tu copia a otro host usando SCP
Variables del backend S3
mysql_backup_s3cfg_template
: plantilla de tu configuración s3fs (se proporciona una por defecto, no te preocupes)
mysql_backup_s3
: opciones de configuración de s3 en el siguiente formato
mysql_backup_s3:
username: "usuario_s3"
access_key: "clave_acceso_usuario_s3"
secret_key: "clave_secreta_usuario_s3"
bucket: "nombre-del-bucket"
Variables del backend SCP
mysql_backup_scp_host
: host de almacenamiento para copiar tu copia de seguridad
mysql_backup_scp_user
: usuario para iniciar sesión en el host de almacenamiento
mysql_backup_scp_dst
: ruta en el host de almacenamiento para guardar tu copia
mysql_backup_scp_identity_src
: archivo de identidad para usar al iniciar sesión en el host de almacenamiento (sí, debería ser una clave privada)
Nomenclatura
mysql_backup_archive_prefix
: solo el nombre de la copia o simplemente todo antes de la marca de tiempo
mysql_backup_archive_stamp
: plantilla de marca de tiempo en formato de herramienta date
(la por defecto es %F-%Hh%Mm%Ss
y resulta en marcas de tiempo como 2019-09-23-12h22m07s
)
mysql_backup_script_name
: si deseas cambiar el nombre del script base, eres bienvenido
mysql_backup_custom_script_name
: si deseas establecer un nombre específico para el script de trabajo que realiza la copia. El valor por defecto es mysql-backup-<nombre_base_datos>.sh
, donde all
si no se especificaron bases de datos para hacer copia.
mysql_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
mysql_backup_encrypt_aes_key_name
: el valor por defecto es aes256.key
, necesario si deseas tener diferentes claves de cifrado para distintas tareas de copia de seguridad
Notificaciones
mysql_backup_warn_size
: en GiB, el valor por defecto es 0. Compara tu copia con este tamaño. Si tu copia es menor, te avisará.
mysql_backup_hostname
: nombre del host (que se imprimirá en los mensajes de slack)
mysql_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 para Comprimir y Cifrar
mysql_backup_gzip
: comprimir el archivo de copia
mysql_backup_encrypt_aes
: cifrar el archivo de copia (si gzip está habilitado, esta acción se realizará específicamente DESPUÉS de gzip)
mysql_backup_encrypt_aes_key_src
: clave aes256 para cifrar tu copia
La clave Aes256 son 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 de tipo string (es menos seguro) puedes usar esto: pwgen -n1 -s 32 | tr -d '\n' >aes256.key
Directorios
mysql_backup_script_dir
: directorio para almacenar el script base
mysql_backup_custom_script_dir
: directorio para almacenar scripts específicos para trabajos de copia apropiados
mysql_backup_conf_dir
: directorio para almacenar archivos de configuración del script de copia
mysql_backup_encrypt_aes_key_dir
: directorio para almacenar la clave de cifrado aes256
mysql_backup_tmpdir
: directorio para mantener resultados temporales (no necesitas crear uno separado, es /tmp por defecto)
Pasar datos fuera del rol
mysql_backup_save_facts_about_custom_script
: si lo estableces en verdadero, el rol guardará la ruta completa del script de trabajo generado, que debe ejecutarse para realizar la copia, en la variable mysql_backup_last_generated_custom_script
. Puedes usar esta variable para añadir una tarea cron específica para este script.
Ejemplo de Playbook
# crear script de trabajo de copia de seguridad mysql
- role: freehck.script_mysql_backup
# parámetros de conexión a mysql
mysql_backup_host: "{{ db_host }}"
mysql_backup_user: "{{ db_user }}"
mysql_backup_pass: "{{ db_pass }}"
mysql_backup_db: "{{ db_name }}"
# parámetros de almacenamiento backend
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'
# gzip y cifrar
mysql_backup_gzip: yes
mysql_backup_encrypt_aes: yes
mysql_backup_encrypt_aes_key_src: "{{ playbook_dir }}/files/aes256.bkp.key"
# otros
mysql_backup_save_facts_about_custom_script: yes
mysql_backup_logfile: "/var/log/mysql-backup.log"
tags: [ backup, mysql ]
# es recomendable crear la tarea cron para este script de trabajo
- role: freehck.crontask
crontask_file: "backups"
crontask_name: "copia de seguridad de la base de datos"
crontask_hour: "12"
crontask_minute: "0"
crontask_job: "{{ mysql_backup_last_generated_custom_script }}"
crontask_user: "root"
crontask_commented_out: false
tags: [ backup, mysql ]
Información Importante
Después de desplegar el script de copia de seguridad mysql en tu host, sería recomendable ir al host que realiza las tareas de copia y ejecutar el script de trabajo desde /opt/scripts
sin parámetros. Si pasó sin errores y ves el archivo de copia en el almacenamiento, entonces todo está bien. Si no, descubrirás cuál fue el problema. Por ejemplo, podrías olvidar agregar el host de almacenamiento a known_hosts
al configurar usuarios. O tu plantilla s3cfg
podría contener un error. No olvides revisar todo dos veces: realizar copias de seguridad es una tarea muy importante.
Después de verificar que la copia fue creada y almacenada en el lugar correcto, revísala cuidadosamente. Debes asegurarte de que puedes restaurar usando esta copia.
Licencia
MIT
Información del Autor
Dmitrii Kashin, freehck@freehck.ru
ansible-galaxy install freehck.script_mysql_backup