DavidWittman.redis
ansible-redis
- Ansible 2.4+
- Compatible con la mayoría de las versiones de Ubuntu/Debian y RHEL/CentOS 6.x
Contenido
- Instalación
- Introducción
- Nodo Redis único
- Replicación Maestro-Esclavo
- Redis Sentinel
- Opciones Avanzadas
- Verificación de sumas de verificación
- Instalar desde un tarball local
- Construir binarios de 32 bits
- 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.
Highly configurable role to install Redis and Redis Sentinel from source
ansible-galaxy install DavidWittman.redis