zorun.garage

Rol de Ansible para Garage

Este rol de Ansible instala y configura Garage, un servicio de almacenamiento de objetos distribuido de código abierto diseñado para la auto-alojamiento.

Descarga una versión binaria de Garage, crea un usuario del sistema, configura los directorios de datos y metadatos, genera un archivo de configuración y, finalmente, instala un servicio systemd para ejecutar Garage.

Actualmente, este rol no conecta automáticamente los nodos entre sí, pero es una función planeada.

Instalación

Este rol está disponible en Ansible Galaxy

Configuración básica

La configuración mínima requerida es:

  • un plantilla para el archivo de configuración de Garage
  • cuatro variables: garage_version, garage_local_template, garage_metadata_dir, garage_data_dir

Aquí hay un ejemplo de playbook:

- hosts: mycluster
  roles:
    - garage
  vars:
    garage_version: "0.8.0"
    garage_local_template: "garage.toml.j2"
    garage_metadata_dir: "/var/lib/garage"
    garage_data_dir: "/mnt/data"
    my_rpc_secret: "130458bfce56b518db49e5f72029070b5e0fcbe514052c108036d361a087643f"
    my_admin_token: "7b3e91b552089363ab94eb95f62324fb4138c9a6d71a69daefae0c5047b33bb7"

También necesitas crear un archivo templates/garage.toml.j2 en la raíz de tu directorio Ansible con el siguiente contenido:

# Gestionado por Ansible

metadata_dir = "{{ garage_metadata_dir }}"
data_dir = "{{ garage_data_dir }}"
db_engine = "lmdb"

replication_mode = "3"
block_size = 1048576
compression_level = 1

rpc_bind_addr = "{{ ansible_default_ipv4.address }}:3901"
rpc_public_addr = "{{ ansible_default_ipv4.address }}:3901"
rpc_secret = "{{ my_rpc_secret }}"

bootstrap_peers = []

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage.localhost"
index = "index.html"

[admin]
api_bind_addr = "[::1]:3903"
admin_token = "{{ my_admin_token }}"

En este ejemplo, utilizamos la dirección IPv4 principal de cada nodo como dirección RPC. Si tus nodos están detrás de NAT, necesitarás establecer rpc_public_addr en la dirección IP pública de cada nodo. Si estás construyendo un clúster IPv6, podrías usar {{ ansible_default_ipv6.address }}.

Además, este ejemplo utiliza dos variables personalizadas: my_rpc_secret y my_admin_token. Siéntete libre de utilizar variables personalizadas para cualquier entrada de configuración que desees gestionar.

Proporcionar una plantilla puede ser molesto, pero otorga mucha flexibilidad. Consulta la documentación oficial para configurar Garage según tus requisitos.

Referencia de variables

Todas las variables del rol se enumeran a continuación, seguidas de una breve descripción. Algunas de estas variables son obligatorias. Para todas las demás variables, indicamos el valor predeterminado.

garage_version (obligatorio)

Versión de Garage para descargar y usar, sin la v inicial. Ejemplo: 0.8.0.

garage_local_template (obligatorio)

Ruta local a una plantilla para el archivo de configuración de Garage. Cuando se utiliza una ruta relativa, consulta la documentación de rutas de Ansible.

garage_metadata_dir (obligatorio)

Dónde se almacenarán los metadatos por Garage. El rol creará este directorio con los permisos apropiados.

garage_data_dir (obligatorio)

Dónde se almacenarán los datos reales por Garage. El rol creará este directorio con los permisos apropiados.

garage_config_file: /etc/garage.toml

Ubicación del archivo de configuración a generar en el host objetivo.

garage_systemd_service: garage

Nombre del servicio systemd. Útil si planeas ejecutar varios demonios de Garage en el mismo host.

garage_binaries_dir: /usr/local/bin

Directorio en el que almacenar los binarios de Garage descargados. Cada archivo en este directorio se nombrará con la versión como sufijo, por ejemplo, /usr/local/bin/garage-0.8.0.

garage_main_binary: /usr/local/bin/garage

Ruta al binario principal utilizado por el servicio systemd. Este será un enlace simbólico a la versión solicitada de Garage.

garage_system_user: garage

Nombre del usuario del sistema a crear. Garage se ejecutará como este usuario, y todos los archivos (tanto datos como metadatos) pertenecerán a este usuario.

garage_system_group: garage

Nombre del grupo del sistema a crear.

garage_logging: netapp=info,garage=info

Configuración de registro para Garage, proporcionada a través de RUST_LOG. Consulta la documentación de env_logger para detalles sobre la sintaxis.

garage_architecture: {{ansible_architecture}}

Arquitectura de CPU para el binario descargado. Debería configurarse automáticamente a la arquitectura del host objetivo correcta, pero aun así puedes sobrescribirla en caso de que esté equivocada (por ejemplo, si deseas ejecutar el binario i686).

Configuración avanzada: múltiples demonios de Garage

Supongamos que deseas ejecutar múltiples demonios de Garage en la misma máquina. Por ejemplo, podrías tener varios clústeres con algunos nodos superpuestos.

Aquí hay un ejemplo de inventario de Ansible:

[cluster1]
host1
host2
host3

[cluster2]
host1
host2
host3
host4
host5

Puedes gestionar esta situación a través del siguiente playbook:

- hosts: cluster1
  roles:
    - garage
  vars:
    garage_version: "0.8.0"
    garage_local_template: "garage.toml.j2"
    garage_config_file: /etc/garage-cluster2.toml
    garage_metadata_dir: "/var/lib/garage/cluster1"
    garage_data_dir: "/mnt/data/cluster1"
    garage_systemd_service: garage-cluster1
    garage_main_binary: /usr/local/bin/garage-cluster1
    garage_system_user: garage-cluster1
    garage_system_group: garage-cluster1

- hosts: cluster2
  roles:
    - garage
  vars:
    garage_version: "0.8.1"
    garage_local_template: "garage.toml.j2"
    garage_metadata_dir: "/var/lib/garage/cluster2"
    garage_data_dir: "/mnt/data/cluster2"
    garage_config_file: /etc/garage-cluster2.toml
    garage_systemd_service: garage-cluster2
    garage_main_binary: /usr/local/bin/garage-cluster2
    garage_system_user: garage-cluster1
    garage_system_group: garage-cluster1

Es seguro compartir la misma garage_version y garage_local_template. También puedes compartir el mismo usuario y grupo, dependiendo de tu modelo de amenazas.

Ten en cuenta que si deseas usar la CLI de Garage, necesitarías ejecutar algo como garage-cluster1 -c /etc/garage-cluster1.toml status. De manera similar, para reiniciar el servicio: systemctl restart garage-cluster1.

Actualización de un clúster

Primero, asegúrate de leer cuidadosamente la documentación oficial de actualización

Actualizaciones sencillas

Para una "actualización sencilla" segura:

  • lee las notas de la versión
  • aumenta garage_version
  • añade serial: 1 a tu playbook (consulta la documentación de Ansible)
  • ejecuta ansible-playbook con --step
  • después de que cada host haya terminado de actualizarse, verifica que todo funcione como se espera y dile a Ansible que (c)ontinue

Actualizaciones avanzadas

Para actualizaciones entre versiones incompatibles, la estrategia exacta depende de la versión: consulta la documentación oficial y la guía de migración específica.

Si necesitas descargar la nueva versión de Garage sin tocar la configuración existente, puedes ejecutar solo la tarea "download" y forzar la versión:

ansible-playbook garage.yaml -e garage_version=0.9.0 --tags download

Ahora deberías tener el nuevo binario en tus hosts, accesible a través de su ruta completa (por ejemplo, /usr/local/bin/garage-0.9.0). Esto te permite realizar migraciones fuera de línea.

Acerca del proyecto

Setup Garage, a S3-compatible distributed software written in Rust

Instalar
ansible-galaxy install zorun.garage
Licencia
Unknown
Descargas
2.8k
Propietario