通过ansible搭建 Redis Cluster 集群环境(Docker)

背景

通过ansible实现自动化搭建 Redis Cluster 集群环境
Docker 搭建Redis 集群

github地址 https://github.com/lilihongjava/ansible-redis-cluster

本次验证环境

docker:Docker version 18.03.0-ce
linux:redhat8
ansible:ansible 2.9.23
redis:6.0.7

整体搭建步骤

代码位于:ansible-redis-cluster\roles\redis\tasks\main.yml

  1. 创建目录
  2. 准备redis-cluster.tmpl文件
  3. 复制redis-conf-create.sh文件
  4. 复制redis-docker-run.sh文件
  5. 复制redis-cluster-cli.sh文件
  6. 复制redis_6.0.7.tar文件
  7. 安装redis
  8. 执行redis-conf-create.sh脚本
  9. 执行redis-docker-run.sh脚本
  10. 执行执行redis-cluster-cli.sh脚本

hosts_install

inventory文件
设置多台主机,ansible_user为执行的用户名,HN为主机的hostname,ports为redis用的端口

[redis]
10.1.12.214  ansible_user=paasopt HN=x86-nlpass-kafka ports=[8091,8092]
10.1.12.215  ansible_user=paasopt HN=x86-nlpass-kafka ports=[8093,8094]
10.1.12.216  ansible_user=paasopt HN=x86-nlpass-redis ports=[8095,8096]

如果没有那么多台主机,也可以部署在同一台

[redis]
10.1.12.223  ansible_user=paasopt HN=x86-nlpass-kafka ports=[8091,8092,8093,8094,8095,8096]

vars_install.json文件

变量文件,redis_password为redis集群password,
redis_dir为执行安装redis的目录

{
  "workerspace": "/home/paasopt",
  "redis_dir": "{{ workerspace }}/redis-cluster",
  "redis_password": "PaasDev2.3"
}

redis-cluster.tmpl.j2文件

{{redis_password}}为vars_install.json文件里的变量,{{ inventory_hostname }}是Ansible所识别的当前正在运行task的主机的主机名。如果在inventory里定义过别名,那么这里就是那个别名。

port ${PORT}
requirepass {{redis_password}}
masterauth {{redis_password}}
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip {{ inventory_hostname }}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
  • port:节点端口;
  • requirepass:添加访问认证;
  • masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证;
  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
  • daemonize:是否以守护线程的方式启动(后台启动),默认 no;
  • appendonly:是否开启 AOF 持久化模式,默认 no;
  • cluster-enabled:是否开启集群模式,默认 no;
  • cluster-config-file:集群节点信息文件;
  • cluster-node-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点 IP,填写宿主机的 IP;
  • cluster-announce-port:集群节点映射端口;
  • cluster-announce-bus-port:集群节点总线端口。

redis-conf-create.sh.j2文件

ports 来源hosts_install里面的ports
此sh用于创建redis配置文件和数据目录

#!/bin/bash
for port in {{ ports | join(' ')}}; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

redis-docker-run.sh.j2文件

创建 Redis 容器,使用 host 网络模式。

#!/bin/bash
for port in {{ ports | join(' ')}}; do \
  docker run -di -p ${port}:${port} -p 1${port}:1${port} --restart always --name redis-${port} --sysctl net.core.somaxconn=1024 \
  -v {{ redis_dir }}/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v {{ redis_dir }}/${port}/data:/data \
  redis:6.0.7 redis-server /usr/local/etc/redis/redis.conf; \
done

创建redis-cluster-cli.sh.j2

创建 Redis Cluster 集群

#!/bin/bash

sudo docker exec -it redis-{{ ports[0]}} bash -c "/usr/local/bin/redis-cli --cluster create {% for host in groups['redis'] -%}  {% for port in hostvars[host].ports %}{{host}}:{{port}} {{" "}}{%- endfor %}{%- endfor %}  --cluster-replicas 1 --cluster-yes -a {{redis_password}} "

ansible执行过程

执行ansible-playbook -i hosts_install -e @vars_install.json setup.yml ,引用主机文件hosts_install ,变量文件vars_install.json

[paasopt@x86-nlpass-elk ansible-redis-cluster]$ ansible-playbook -i hosts_install -e @vars_install.json setup.yml 

PLAY [redis] ***********************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
[DEPRECATION WARNING]: Distribution redhat 8.4 on host 10.1.12.223 should use /usr/libexec/platform-python, but is using /usr/bin/python for backward compatibility 
with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See 
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature will be removed in version 2.12. Deprecation 
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
ok: [10.1.12.223]

TASK [redis : 创建目录] ****************************************************************************************************************************************************
changed: [10.1.12.223]

TASK [复制redis-cluster.tmpl文件] ******************************************************************************************************************************************
changed: [10.1.12.223]

TASK [复制redis-conf-create.sh文件] ****************************************************************************************************************************************
changed: [10.1.12.223]

TASK [复制redis-docker-run.sh文件] *****************************************************************************************************************************************
changed: [10.1.12.223]

TASK [复制redis-cluster-cli.sh文件] ****************************************************************************************************************************************
changed: [10.1.12.223]

TASK [复制redis_6.0.7.tar文件] *********************************************************************************************************************************************
changed: [10.1.12.223]

TASK [安装redis] *********************************************************************************************************************************************************
changed: [10.1.12.223]

TASK [执行redis-conf-create.sh脚本] ****************************************************************************************************************************************
changed: [10.1.12.223]

TASK [执行redis-docker-run.sh脚本] *****************************************************************************************************************************************
changed: [10.1.12.223]

TASK [执行redis-cluster-cli.sh脚本] ****************************************************************************************************************************************
changed: [10.1.12.223]

PLAY RECAP *************************************************************************************************************************************************************
10.1.12.223                : ok=11   changed=10   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

参考:
https://xie.infoq.cn/article/a5536b928edd12beb32fcabf9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的Ansible Playbook,用来部署Redis集群: ```yaml --- - name: Deploy Redis Cluster hosts: redis become: yes vars: redis_version: "6.2.5" redis_cluster_port: "6379" redis_cluster_config_file: "/etc/redis/redis.conf" redis_cluster_data_dir: "/var/lib/redis" redis_cluster_node_count: 6 tasks: - name: Install Redis dependencies apt: name: "{{ item }}" state: present loop: - build-essential - tcl - libjemalloc-dev - name: Download and extract Redis get_url: url: "http://download.redis.io/releases/redis-{{ redis_version }}.tar.gz" dest: "/tmp/redis-{{ redis_version }}.tar.gz" - name: Extract Redis archive unarchive: src: "/tmp/redis-{{ redis_version }}.tar.gz" dest: "/tmp" remote_src: yes - name: Compile and install Redis shell: | cd /tmp/redis-{{ redis_version }} make make install - name: Create Redis configuration file template: src: "redis.conf.j2" dest: "{{ redis_cluster_config_file }}" vars: redis_cluster_port: "{{ redis_cluster_port }}" redis_cluster_data_dir: "{{ redis_cluster_data_dir }}" redis_cluster_node_count: "{{ redis_cluster_node_count }}" - name: Create Redis data directory file: path: "{{ redis_cluster_data_dir }}" state: directory - name: Start Redis instances shell: | cd /usr/local/bin redis-server {{ redis_cluster_config_file }} ``` 此Playbook假设我们有一个名为"redis"的Ansible组,该组中的主机将运行Redis实例。它还假设我们将使用Redis 6.2.5版本,并创建一个6节点的Redis集群。 在此之前,我们需要编写一个名为"redis.conf.j2"的Jinja2模板文件,用于生成Redis配置文件。以下是示例模板文件: ```ini port {{ redis_cluster_port }} cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes dir {{ redis_cluster_data_dir }} cluster-announce-ip {{ ansible_default_ipv4.address }} cluster-announce-port {{ redis_cluster_port }} {% for i in range(redis_cluster_node_count) %} cluster-announce-bus-port {{ redis_cluster_port+10000+i }} {% endfor %} ``` 在运行此Playbook之前,请确保在Ansible的控制节点上安装了Jinja2和Redis依赖项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovelife110

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值