DavidWittman.redis

ansible-redis

Estado de Construcción Ansible Galaxy

  • Ansible 2.4+
  • Compatible con la mayoría de las versiones de Ubuntu/Debian y RHEL/CentOS 6.x

Contenido

  1. Instalación
  2. Introducción
  3. Nodo Redis único
  4. Replicación Maestro-Esclavo
  5. Redis Sentinel
  6. Opciones Avanzadas
  7. Verificación de sumas de verificación
  8. Instalar desde un tarball local
  9. Construir binarios de 32 bits
  10. Variables de Rol

Instalación

$ ansible-galaxy install davidwittman.redis

Introducción

A continuación se presentan algunos ejemplos de playbooks y configuraciones para desplegar una variedad de arquitecturas de Redis.

Este rol espera ser ejecutado como root o como un usuario con privilegios de sudo.

Nodo Redis único

Desplegar un único nodo servidor Redis es bastante simple; solo agrega el rol a tu playbook y listo. Aquí hay un ejemplo que haremos un poco más interesante al establecer la dirección de enlace a 127.0.0.1:

---
- hosts: redis01.example.com
  vars:
    - redis_bind: 127.0.0.1
  roles:
    - davidwittman.redis
$ ansible-playbook -i redis01.example.com, redis.yml

Nota: Puede que hayas notado que solo pasé un nombre de host como archivo de inventario de Ansible. Esta es una forma fácil de ejecutar Ansible sin tener que crear un archivo de inventario primero, solo necesitas agregar una coma al final del nombre del host para que Ansible sepa qué hacer con él.

¡Eso es todo! Ahora tendrás un servidor Redis escuchando en 127.0.0.1 en redis01.example.com. Por defecto, los binarios de Redis se instalan en /opt/redis, aunque esto se puede cambiar configurando la variable redis_install_dir.

Replicación Maestro-Esclavo

Configurar replicación en Redis se realiza desplegando varios nodos y configurando la variable redis_slaveof en los nodos esclavos, tal como lo harías en redis.conf. En el ejemplo que sigue, desplegaremos un maestro de Redis con tres esclavos.

En este ejemplo, vamos a usar grupos para separar los nodos maestros y esclavos. Comencemos con el archivo de inventario:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

Y aquí está el playbook:

---
- name: configurar el servidor maestro de redis
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: configurar los esclavos de redis
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

En este caso, asumo que tienes registros DNS configurados para redis-master.example.com, pero no siempre es así. Puedes configurar esto como desees. En muchos casos, le digo a Ansible que use la dirección IP de eth1 para el maestro. Aquí hay un valor más flexible para documentarlo:

redis_slaveof: "{{ hostvars['redis-master.example.com'].ansible_eth1.ipv4.address }} {{ redis_port }}"

¡Ahora estás en marcha! Ejecutar este playbook debería dejarte listo con un maestro de Redis y tres esclavos.

Redis Sentinel

Introducción

Usar replicación Maestro-Esclavo es excelente para durabilidad y distribución de lecturas y escrituras, pero no tanto para alta disponibilidad. Si el nodo maestro falla, un esclavo debe ser promovido manualmente a maestro, y las conexiones deberán redirigirse al nuevo maestro. La solución a este problema es Redis Sentinel, un sistema distribuido que utiliza Redis mismo para comunicarse y manejar la conmutación por error automática en un clúster de Redis.

Sentinel utiliza el mismo binario redis-server que Redis, pero se ejecuta con la opción --sentinel y con un archivo de configuración diferente. Todo esto, por supuesto, está abstraído con este rol de Ansible, pero sigue siendo bueno saberlo.

Configuración

Para agregar un nodo Sentinel a un despliegue existente, asigna este mismo rol redis y establece la variable redis_sentinel en True en ese host. Esto se puede hacer de varias maneras, y para los fines de este ejemplo, ampliaré el archivo de inventario utilizado anteriormente en la configuración Maestro/Esclavo:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

[redis-sentinel]
redis-sentinel0[1:3].example.com redis_sentinel=True

Arriba, hemos añadido tres hosts más en el grupo redis-sentinel (aunque este grupo no tiene propósito dentro del rol, es solo un identificador) y hemos establecido la variable redis_sentinel en línea dentro del archivo de inventario.

Ahora, todo lo que necesitamos hacer es establecer la variable redis_sentinel_monitors para definir los maestros de Redis que Sentinel debe monitorear. En este caso, voy a hacer esto dentro del playbook:

- name: configurar el servidor maestro de redis
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: configurar los esclavos de redis
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

- name: configurar nodos de sentinel de redis
  hosts: redis-sentinel
  vars:
    - redis_sentinel_monitors:
      - name: master01
        host: redis-master.example.com
        port: 6379
  roles:
    - davidwittman.redis

Esto configurará los nodos Sentinel para monitorear el maestro que creamos arriba usando el identificador master01. Por defecto, Sentinel usará un quórum de 2, lo que significa que al menos 2 Sentinels deben coincidir en que un maestro está caído para que se lleve a cabo una conmutación por error. Este valor puede ser anulado configurando la clave quorum dentro de tu definición de monitor. Consulta la documentación de Sentinel para más detalles.

Junto con las variables listadas arriba, Sentinel tiene una serie de configuraciones propias al igual que el servidor Redis. Estas están prefijadas con redis_sentinel_, y se enumeran en la sección Variables de Rol a continuación.

Inclusiones múltiples de roles

Si necesitas ejecutar el rol varias veces, consulta test/test_all.yml para ver cómo proceder. Consulta aquí y aquí para más contexto.

Opciones Avanzadas

Verificación de sumas de verificación

Establece la variable redis_verify_checksum en true para utilizar la opción de verificación de suma de verificación para get_url. Ten en cuenta que esto solo verificará las sumas de verificación cuando Redis se descargue desde una URL, y no cuando se proporcione en un tarball con redis_tarball.

Al usar Ansible 2.x, este rol verificará la suma de verificación sha1 de la descarga contra las sumas de verificación definidas en la variable redis_checksums en vars/main.yml. Si tu versión no está definida aquí o deseas anular la suma de verificación con una de tu elección, simplemente establece la variable redis_checksum. Como en el ejemplo a continuación, deberás prefijar la suma de verificación con el tipo de hash que estás utilizando.

- name: instalar redis en ansible 1.x y verificar sumas de verificación
  hosts: all
  roles:
    - role: davidwittman.redis
      redis_version: 3.0.7
      redis_verify_checksum: true
      redis_checksum: "sha256:b2a791c4ea3bb7268795c45c6321ea5abcc24457178373e6a6e3be6372737f23"

Instalar desde un tarball local

Si el entorno en el que se encuentra tu servidor no permite descargas (es decir, si la máquina está en una DMZ), establece la variable redis_tarball en la ruta de un tarball de Redis descargado localmente para usar en lugar de descargarlo a través de HTTP desde redis.io.

¡No olvides establecer la variable de versión en la misma versión que el tarball para evitar confusiones! Por ejemplo:

vars:
  redis_version: 2.8.14
  redis_tarball: /ruta/a/redis-2.8.14.tar.gz

En este caso, el archivo de origen se copia al servidor a través de SSH en lugar de descargarse.

Construir binarios de 32 bits

Para construir binarios de 32 bits de Redis (que pueden ser utilizados para optimización de memoria), establece redis_make_32bit: true. Esto instala las dependencias necesarias (glibc x86) en RHEL/Debian/SuSE y establece la opción '32bit' al ejecutar make.

Construir con soporte TLS

Para construir Redis con soporte TLS (Agregado en la versión 6), establece redis_make_tls: true. Esto requiere bibliotecas de desarrollo de OpenSSL (por ejemplo, libssl-dev en Debian/Ubuntu).

Variables de Rol

Aquí hay una lista de todas las variables predeterminadas para este rol, que también están disponibles en defaults/main.yml. Algún día las formatearé en una tabla o algo así.

---
## Opciones de instalación
redis_version: 2.8.24
redis_install_dir: /opt/redis
redis_dir: /var/lib/redis/{{ redis_port }}
redis_config_file_name: "{{ redis_port }}.conf"
redis_download_url: "http://download.redis.io/releases/redis-{{ redis_version }}.tar.gz"
# Establecer esto en true para validar la suma de verificación del tarball de redis contra vars/main.yml
redis_verify_checksum: false
# Establecer este valor en una ruta local de un tarball para usar en lugar de descargar
redis_tarball: false
# Establecer esto en true para construir binarios de 32 bits de Redis
redis_make_32bit: false
# Establecer esto en true para construir redis con soporte TLS, disponible solo para versiones >= 6 (requiere bibliotecas de desarrollo de OpenSSL)
redis_make_tls: false

redis_user: redis
redis_group: "{{ redis_user }}"

# El límite de archivos abiertos para Redis/Sentinel
redis_nofile_limit: 16384

## Opciones del rol
# Configurar Redis como un servicio
# Esto crea los scripts de inicio para Redis y asegura que el proceso se esté ejecutando
# También aplica para Redis Sentinel
redis_as_service: true
# Agregar hechos locales a /etc/ansible/facts.d para Redis
redis_local_facts: true
# Nombre del servicio
redis_service_name: "redis_{{ redis_port }}"

## Opciones de red/conexión
redis_bind: false
redis_port: 6379
redis_password: false
# Opciones de replicación de esclavos
redis_min_slaves_to_write: 0
redis_min_slaves_max_lag: 10
redis_tcp_backlog: 511
redis_tcp_keepalive: 0
# Máximo de clientes conectados a la vez
redis_maxclients: 10000
redis_timeout: 0
# Opciones de socket
# Establecer socket_path en la ruta deseada para el socket. Por ejemplo, /var/run/redis/{{ redis_port }}.sock
redis_socket_path: false
redis_socket_perm: 755

## Opciones de replicación
# Establecer slaveof tal como lo harías en redis.conf. (por ejemplo, "redis01 6379")
redis_slaveof: false
# Hacer que los esclavos sean de solo lectura. "sí" o "no"
redis_slave_read_only: "sí"
redis_slave_priority: 100
redis_repl_backlog_size: false

## Registro
redis_logfile: '""'
# Habilitar syslog. "sí" o "no"
redis_syslog_enabled: "sí"
redis_syslog_ident: "{{ redis_service_name }}"
# Facilidades de syslog. Debe ser USER o LOCAL0-LOCAL7
redis_syslog_facility: USER

## Configuración general
redis_daemonize: "sí"
redis_pidfile: /var/run/redis/{{ redis_port }}.pid
# Número de bases de datos permitidas
redis_databases: 16
redis_loglevel: notice
# Registrar consultas más lentas que este número de milisegundos. -1 para deshabilitar
redis_slowlog_log_slower_than: 10000
# Número máximo de consultas lentas para guardar
redis_slowlog_max_len: 128
# Límite de memoria de Redis (por ejemplo, 4294967296, 4096mb, 4gb)
redis_maxmemory: false
redis_maxmemory_policy: noeviction
redis_rename_commands: []
redis_db_filename: dump.rdb
# Cada cuánto tomar instantáneas de la base de datos en disco
# por ejemplo, "900 1" => 900 segundos si al menos 1 clave cambió
redis_save:
  - 900 1
  - 300 10
  - 60 10000
redis_stop_writes_on_bgsave_error: "sí"
redis_rdbcompression: "sí"
redis_rdbchecksum: "sí"
redis_appendonly: "no"
redis_appendfilename: "appendonly.aof"
redis_appendfsync: "everysec"
redis_no_appendfsync_on_rewrite: "no"
redis_auto_aof_rewrite_percentage: "100"
redis_auto_aof_rewrite_min_size: "64mb"
redis_notify_keyspace_events: '""'

## Opciones de configuración adicionales
# dejar vacío si no es necesario. Usar un escalar de estilo bloque para agregar opciones, por ejemplo.
# redis_config_additional: |
#   io-threads 4
#   io-threads-do-reads yes
redis_config_additional: ""

## Configuraciones de Redis sentinel
# Establecer esto en true en un host para configurarlo como un Sentinel
redis_sentinel: false
redis_sentinel_dir: /var/lib/redis/sentinel_{{ redis_sentinel_port }}
redis_sentinel_bind: 0.0.0.0
redis_sentinel_port: 26379
redis_sentinel_password: false
redis_sentinel_pidfile: /var/run/redis/sentinel_{{ redis_sentinel_port }}.pid
redis_sentinel_logfile: '""'
redis_sentinel_syslog_ident: sentinel_{{ redis_sentinel_port }}
redis_sentinel_monitors:
  - name: master01
    host: localhost
    port: 6379
    quorum: 2
    auth_pass: ant1r3z
    down_after_milliseconds: 30000
    parallel_syncs: 1
    failover_timeout: 180000
    notification_script: false
    client_reconfig_script: false
    rename_commands: []

Hechos

Los siguientes hechos son accesibles en tu inventario o tareas fuera de este rol.

  • {{ ansible_local.redis.bind }}
  • {{ ansible_local.redis.port }}
  • {{ ansible_local.redis.sentinel_bind }}
  • {{ ansible_local.redis.sentinel_port }}
  • {{ ansible_local.redis.sentinel_monitors }}

Para deshabilitar estos hechos, establece redis_local_facts en un valor falso.

Acerca del proyecto

Highly configurable role to install Redis and Redis Sentinel from source

Instalar
ansible-galaxy install DavidWittman.redis
Licencia
mit
Descargas
1.1M
Propietario
Dev, Ops, Security, Lens Flares