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.
Setup Garage, a S3-compatible distributed software written in Rust
ansible-galaxy install zorun.garage