l3d.restic

Rol de Ansible: restic

Beta: Este rol está en estado beta.

licencia Ansible Galaxy

Descripción

Restic es una solución de respaldo versátil basada en Go que soporta múltiples Backend, deduplicación y respaldos incrementales.

Este rol instala restic en un cliente, configura los repositorios de respaldo y opcionalmente establece un temporizador de systemd o tareas de cron para ejecutar los respaldos. Además, configurará scripts ejecutables para realizar un respaldo manualmente.

Este proyecto se basa en gran medida en el donat-b/ansible-restic y en el https://github.com/arillso/ansible.restic rol de ansible. Intentamos hacer este rol más comprensible y moderno utilizando temporizadores de systemd, /etc/crontab para definir rutas de respaldo, más rutas absolutas y menos opciones. (no probado para almacenamiento S3 o Windows...)

Scripts de Respaldo

Este rol creará un script de respaldo y un archivo con credenciales utilizables con el comando source en Linux para cada respaldo en el restic_script_dir. Estos scripts ejecutables pueden usarse para activar manualmente una acción de respaldo, pero también se utilizan para respaldos automatizados si has configurado la variable restic_create_schedule como verdadera. Asegúrate de no cambiar los archivos manualmente, ya que esto puede interferir bastante con tus respaldos.

En Linux, si deseas tomar un snapshot manual, puedes ejecutar el respaldo así:

$ /ruta/al/script/de/respaldo/respaldo-ejemplo.sh

Por defecto, tal snapshot tendrá la etiqueta manual, para que puedas distinguirlos de los snapshots creados automáticamente. También puedes añadir más etiquetas simplemente añadiéndolas:

$ /ruta/al/script/de/respaldo/respaldo-ejemplo.sh --tag despliegue

Tareas CRON / Programadas

Para utilizar los respaldos definidos, se pueden configurar automáticamente como tareas programadas. Debes tener en cuenta que (al menos en sistemas Linux) necesitas permisos de administrador para configurar tal acción.

Si no puedes usar la creación automática de las tareas, aún puedes hacer uso de los scripts generados. Si, por ejemplo, estás en un servidor de hosting compartido y puedes definir un cronjob a través de una interfaz web, simplemente añade cada archivo de respaldo para ejecutarlo. Asegúrate de prefijar el comando con CRON=true para indicar que el snapshot fue creado a través de una tarea programada:

CRON=true /ruta/al/script/de/respaldo/respaldo-ejemplo.sh

Instalación

Hay múltiples maneras de instalar el rol. Puedes clonarlo o descargarlo directamente desde el repositorio de github. O instalarlo a través de ansible galaxy:

ansible-galaxy install roles-ansible.restic

Requisitos

  • bzip2

Variables del Rol

Nombre Predeterminado Descripción
restic_url indefinido La URL para descargar restic. Usa esta variable para sobrescribir la configuración predeterminada
restic_version '0.15.1' La versión de Restic a instalar
restic_download_path '/opt/restic' Ubicación de descarga para el binario de restic
restic_install_path '/usr/local/bin' Ubicación de instalación para el binario de restic
restic_script_dir '/opt/restic' Ubicación de los scripts de respaldo generados
restic_backup_script_shell sh Shell a usar para ejecutar el script de respaldo
restic_log_dir '{{ restic_script_dir }}/log' Ubicación de los registros de los scripts de respaldo
restic_repos {} Un diccionario de repositorios donde se almacenan los snapshots. (Más información: Repos)
restic_backups {} (o []) Una lista de diccionarios que especifican los archivos y directorios a respaldar (Más información: Backups)
restic_create_schedule false ¿Deberíamos programar cada respaldo? Ya sea a través de un cronjob o mediante un temporizador de systemd.
restic_backup_now false Si el script de respaldo debe ejecutarse inmediatamente
restic_schedule_type systemd Aquí puedes definir si creamos un cronjob o un temporizador de systemd. Si falla al crear un temporizador de systemd, se creará un cronjob.
restic_dir_owner '{{ansible_user}}' El propietario de todos los directorios creados
restic_dir_group '{{ansible_user}}' El grupo de todos los directorios creados
restic_no_log true Establecer en falso para ver registros ocultos de ansible
restic_do_not_cleanup_cron false Hemos cambiado la ubicación del cron y limpiamos el antiguo. Puedes omitir la limpieza aquí $
restic__cache_config false Configurar un directorio de caché personalizado
restic__cache_dir '~/.cache/restic' Definir un directorio de caché personalizado
submodules_versioncheck false Si configuras esta variable como verdadera, el rol ejecutará un chequeo de versiones simple para evitar ejecutar versiones antiguas de este rol.
restic__limit_cpu_usage false ¿Debe limitarse el uso de CPU?
restic__max_cpus 1 Número máximo de CPUs que se pueden usar simultáneamente

Repos

Restic almacena datos en repositorios. Debes especificar al menos un repositorio para poder usar este rol. Un repositorio puede ser local o remoto (ver la documentación oficial).

Usando un repositorio SFTP

Para usar un backend SFTP, el usuario necesita acceso sin contraseña al host. Asegúrate de distribuir las claves ssh en consecuencia, ya que esto está fuera del ámbito de este rol.

Variables disponibles:

Nombre Requerido Descripción
location La ubicación del Backend. Actualmente, se soportan Local, SFTP, S3, Azure Blob y B2
password La contraseña utilizada para asegurar este repositorio
init no Describe si el repositorio debe ser inicializado o no. Usa false si estás respaldando a un repositorio ya existente.

Ejemplo:

restic_repos:
  local:
    location: /srv/restic-repo
    password: contraseñasegura0
    init: true
  remote:
    location: rest:https://restic_rest_server.example.com:8000/restic-repo/
    password: contraseñasegura1
    init: true
  sftp:
    location: sftp:usuario@host:/srv/restic-repo
    password: contraseñasegura2
    init: true
  aws:
    location: s3:s3.amazonaws.com/nombre_del_bucket
    password: contraseñasegura3
    init: true
    aws_access_key: claveacceso
    aws_secret_access_key: claveprivada
    aws_default_region: eu-west-1
  azure:
    location: azure:container:/
    password: contraseñasegura4
    init: true
    azure_account_name: nombre_cuenta_almacenamiento
    # Solo una de las siguientes es requerida
    azure_account_key: algunaclave
    azure_account_sas: url_sas
    # Opcional
    azure_endpoint_suffix: core.windows.net
  b2:
    location: b2:nombrebucket:ruta/al/repo
    password: contraseñasegura5
    init: true
    b2_account_id: idcuenta
    b2_account_key: clavecuenta

Respaldos

Un respaldo especifica un directorio o archivo que debe ser respaldado. Un respaldo se escribe en un repositorio definido en restic_repos.

Variables disponibles:

Nombre Requerido (Predeterminado) Descripción
name El nombre de este respaldo. Usado junto con la poda y la programación y necesita ser único.
repo El nombre del repositorio al que respaldar.
src sí (a menos que stdin == true) El directorio o archivo fuente
stdin no ¿Este respaldo se crea desde un stdin?
stdin_cmd no (sí si stdin == true) El comando para producir el stdin.
stdin_filename no El nombre de archivo utilizado en el repositorio.
pre_backup_cmd no Un comando a ejecutar antes del respaldo, típicamente usado para volcar bases de datos al disco
tags no Matriz de etiquetas predeterminadas
keep_last no Si se establece, solo mantiene los últimos n snapshots.
keep_hourly no Si se establece, solo mantiene los últimos n snapshots horarios.
keep_daily no Si se establece, solo mantiene los últimos n snapshots diarios.
keep_weekly no Si se establece, solo mantiene los últimos n snapshots semanales.
keep_monthly no Si se establece, solo mantiene los últimos n snapshots mensuales.
keep_yearly no Si se establece, solo mantiene los últimos n snapshots anuales.
keep_within no Si se establece, solo mantiene snapshots en este período de tiempo.
keep_tag no Si se establece, mantener snapshots con estas etiquetas. Asegúrate de especificar una lista.
prune no (false) Si true, el comando restic forget en el script tiene la opción --prune añadida.
scheduled no (false) Si restic_create_schedule está establecido como true, este respaldo está programado y trata de crear una unidad de temporizador de systemd. Si falla, crea un cronjob.
schedule_oncalendar '*-* * * 02:00:00' El tiempo para el temporizador de systemd. Por favor, nota la opción randomDelaySec. Por defecto, el respaldo se realiza cada noche a las 2 am (+0-4h). Pero solo si está programado como verdadero.
schedule_minute no (*) Minuto cuando se ejecuta el trabajo. (0-59, *, */2, etc)
schedule_hour no (2) Hora cuando se ejecuta el trabajo. (0-23, *, */2, etc)
schedule_weekday no (*) Día de la semana cuando se ejecuta el trabajo. (0-6 para Domingo-Sábado, *, etc)
schedule_month no (*) Mes cuando se ejecuta el trabajo. (1-12, *, */2, etc)
exclude no ({}) Te permite especificar archivos a excluir. Ver Excluir para referencia.
disable_logging no Ocasionalmente deshabilitar registro
log_to_journald no Ocasionalmente cambiar el registro a journald con el nombre del trabajo de respaldo como etiqueta
mail_on_error no Ocasionalmente enviar un correo si el trabajo de respaldo falla (mailx es requerido)
mail_address si mail_on_error es verdadero La dirección de correo para recibir correos si habilitaste mail_on_error.
monitoring_call no Un comando que se llamará si el respaldo es exitoso. Útil para sistemas de monitoreo de heartbeat que advierten cuando no se recibe ningún heartbeat. Usa el comando completo que necesitas ejecutar. Ejemplo: curl https://monitoring.example.com/api/push/E9Wzm4lJ2O?status=up&msg=OK&ping=
niceness no Si se establece, ejecuta cualquier respaldo programado con el valor de niceness. En Linux, -20 es la prioridad más alta, 0 la predeterminada y 19 la más baja. 10 es una prioridad baja común asignada a las rutinas de respaldo en sistemas de producción.

Ejemplo:

restic_backups:
  data:
    name: data
    repo: remote
    src: /ruta/a/datos
    scheduled: true
    schedule_oncalendar: '*-* * 01:00:00'
  database:
    name: database
    repo: remote
    stdin: true
    stdin_cmd: pg_dump -Ubackup nombre_base_datos
    stdin_filename: volcado_nombre_base_datos.sql
    scheduled: true
    schedule_oncalendar: '*-* * 01:30:00'
    niceness: 10
  all_databases:
    name: all_databases
    repo: remote
    src: /var/dumped_data
    scheduled: true
    schedule_oncalendar: '*-* * 02:00:00'
    pre_backup_cmd: cd /var/dumped_data && mariadb -N -e 'show databases' | while read dbname; do mariadb-dump --complete-insert --routines --triggers --single-transaction "$dbname" > "$dbname".sql; done

También puedes especificar restic_backups como un arreglo, que es una característica heredada y podría ser deprecada en el futuro. Actualmente, la clave name se usa para nombrar el acceso y los archivos de respaldo.

Excluir

La clave exclude en un respaldo te permite especificar múltiples archivos a excluir o buscar archivos para ser excluidos. Puedes especificar las siguientes claves:

exclude:
    exclude_caches: true
    exclude:
        - /ruta/a/archivo
    iexclude:
        - /ruta/a/archivo
    exclude_file:
        - /ruta/a/archivo
    exclude_if_present:
        - /ruta/a/archivo

Por favor, consulta el uso de las claves específicas en la documentación.

Dependencias

Este rol no tiene otros roles de ansible como dependencias.

Ejemplo de Playbook

- name: respaldar tus carpetas personales a /mnt/backup cada noche
  hosts: localhost
  roles:
    - {role: do1jlr.restic, tags: restic}
  vars:
    restic_create_schedule: true
    restic_repos:
      local:
        location: '/mnt/backup'
        password: 'ChangM3'
        init: true
    restic_backups:
      home:
        name: home
        repo: local
        src: /home/
        scheduled: true
        schedule_oncalendar: '*-* * 01:00:00'

Licencia

Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para el texto completo de la licencia.

Acerca del proyecto

Ansible role to deploy restic and setup backups.

Instalar
ansible-galaxy install l3d.restic
Licencia
mit
Descargas
247k
Propietario
Ansible roles provide a framework for fully independent, or interdependent collections of variables,tasks,files,templates &modules. Here we maintain some. enjoy