ansible playbook 配置redis哨兵模式
ansible playbook配置redis哨兵模式脚本:
Ansible Playbook 用于在指定的主机上部署 Redis 6.0 的哨兵模式集群。它包含三个主要部分:部署 Redis 和 Sentinel 服务、配置 Redis 主从复制、验证 Redis 集群状态。
环境如下:192.168.1.51、192.168.1.52、192.168.1.53
哨兵节点:192.168.1.51
主节点:192.168.1.51
从节点:192.168.1.52、192.168.1.53
---
- name: Deploy Redis 6.0 Sentinel Cluster
hosts: redis
become: true
gather_facts: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
tasks:
- name: Update yum cache
yum:
update_cache: true
- name: Install Redis 6
yum:
name: redis
state: present
- name: Create Redis configuration directory
file:
path: /etc/redis
state: directory
mode: '0755'
- name: Generate Redis configuration file
template:
src: redis.conf.j2
dest: /etc/redis/redis.conf
notify:
- Restart Redis
- name: Generate Redis Sentinel configuration file
template:
src: sentinel.conf.j2
dest: /etc/redis/sentinel.conf
notify:
- Restart Redis Sentinel
- name: Generate Redis Sentinel configuration file
template:
src: sentinel.conf.j2
dest: /etc/redis/sentinel.conf
notify:
- Restart Redis Sentinel
- name: Start Redis service
command: redis-server /etc/redis/redis.conf
args:
creates: /var/run/redis_{{ redis_port }}.pid
- name: Start Redis Sentinel service
command: redis-sentinel /etc/redis/sentinel.conf
args:
creates: /var/run/redis-sentinel.pid
handlers:
- name: Restart Redis
command: pkill -f "redis-server /etc/redis/redis.conf"
args:
removes: /var/run/redis_{{ redis_port }}.pid
notify:
- Start Redis service
- name: Restart Redis Sentinel
command: pkill -f "redis-sentinel /etc/redis/sentinel.conf"
args:
removes: /var/run/redis-sentinel.pid
notify:
- Start Redis Sentinel service
- name: Configure Redis Replication
hosts: redis
become: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
tasks:
- name: Set slave nodes
command: redis-cli -h {{ item }} -p {{ redis_port }} SLAVEOF {{ master_ip }} {{ redis_port }}
when: ansible_default_ipv4.address != master_ip
loop: "{{ slave_ips }}"
- name: Initialize Sentinel monitoring
command: redis-cli -h {{ master_ip }} -p {{ sentinel_port }} sentinel monitor mymaster {{ master_ip }} {{ redis_port }} 2
- name: Verify Redis Cluster Status
hosts: redis
become: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
tasks:
- name: Check Redis master status
command: redis-cli -h {{ master_ip }} -p {{ redis_port }} INFO replication
register: master_info
when: ansible_default_ipv4.address == master_ip
- name: Print Redis master status
debug:
var: master_info.stdout_lines
when: ansible_default_ipv4.address == master_ip
- name: Check Redis slave status
command: redis-cli -h {{ item }} -p {{ redis_port }} INFO replication
register: slave_info
when: ansible_default_ipv4.address != master_ip
loop: "{{ slave_ips }}"
- name: Print Redis slave status
debug:
var: slave_info.results
when: ansible_default_ipv4.address != master_ip
- name: Check Sentinel status
command: redis-cli -h {{ item }} -p {{ sentinel_port }} SENTINEL masters
register: sentinel_info
loop: "{{ slave_ips + [master_ip] }}"
- name: Print Sentinel status
debug:
var: sentinel_info.results
全局配置
---
- name: Deploy Redis 6.0 Sentinel Cluster
hosts: redis
become: true
gather_facts: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
name
:Playbook 的名称,描述了该 Playbook 的主要功能。hosts: redis
:指定该 Playbook 将在名为redis
的主机组上执行。become: true
:表示以超级用户权限执行任务,通常用于执行需要 root 权限的操作。gather_facts: true
:让 Ansible 收集目标主机的系统信息,这些信息可以在后续任务中使用。vars
:定义了一些变量,包括 Redis 服务端口redis_port
、Sentinel 服务端口sentinel_port
、主节点的 IP 地址master_ip
以及从节点的 IP 地址列表slave_ips
。
第一部分:部署 Redis 和 Sentinel 服务
tasks:
- name: Update yum cache
yum:
update_cache: true
- name: Install Redis 6
yum:
name: redis
state: present
- name: Create Redis configuration directory
file:
path: /etc/redis
state: directory
mode: '0755'
- name: Generate Redis configuration file
template:
src: redis.conf.j2
dest: /etc/redis/redis.conf
notify:
- Restart Redis
- name: Generate Redis Sentinel configuration file
template:
src: sentinel.conf.j2
dest: /etc/redis/sentinel.conf
notify:
- Restart Redis Sentinel
- name: Generate Redis Sentinel configuration file
template:
src: sentinel.conf.j2
dest: /etc/redis/sentinel.conf
notify:
- Restart Redis Sentinel
- name: Start Redis service
command: redis-server /etc/redis/redis.conf
args:
creates: /var/run/redis_{{ redis_port }}.pid
- name: Start Redis Sentinel service
command: redis-sentinel /etc/redis/sentinel.conf
args:
creates: /var/run/redis-sentinel.pid
更新 yum 缓存:使用
yum
模块更新系统的 yum 缓存,确保可以获取到最新的软件包信息。安装 Redis 6:使用
yum
模块安装 Redis 6 软件包。创建 Redis 配置目录:使用
file
模块创建/etc/redis
目录,用于存放 Redis 和 Sentinel 的配置文件。生成 Redis 配置文件:使用
template
模块将redis.conf.j2
模板文件渲染成实际的配置文件,并保存到/etc/redis/redis.conf
。如果配置文件发生变化,会触发Restart Redis
处理程序。生成 Redis Sentinel 配置文件:使用
template
模块将sentinel.conf.j2
模板文件渲染成实际的配置文件,并保存到/etc/redis/sentinel.conf
。如果配置文件发生变化,会触发Restart Redis Sentinel
处理程序。这里有重复的任务,可考虑删除重复部分。启动 Redis 服务:使用
command
模块直接运行redis-server /etc/redis/redis.conf
命令启动 Redis 服务。creates
参数确保只有当/var/run/redis_{{ redis_port }}.pid
文件不存在时才会执行该命令,避免重复启动。启动 Redis Sentinel 服务:使用
command
模块直接运行redis-sentinel /etc/redis/sentinel.conf
命令启动 Redis Sentinel 服务。creates
参数确保只有当/var/run/redis-sentinel.pid
文件不存在时才会执行该命令,避免重复启动。
处理程序
handlers:
- name: Restart Redis
command: pkill -f "redis-server /etc/redis/redis.conf"
args:
removes: /var/run/redis_{{ redis_port }}.pid
notify:
- Start Redis service
- name: Restart Redis Sentinel
command: pkill -f "redis-sentinel /etc/redis/sentinel.conf"
args:
removes: /var/run/redis-sentinel.pid
notify:
- Start Redis Sentinel service
Restart Redis:使用
pkill
命令杀死 Redis 进程。removes
参数确保只有当/var/run/redis_{{ redis_port }}.pid
文件存在时才会执行该命令。杀死进程后,会触发Start Redis service
任务重新启动 Redis 服务。Restart Redis Sentinel:使用
pkill
命令杀死 Redis Sentinel 进程。removes
参数确保只有当/var/run/redis-sentinel.pid
文件存在时才会执行该命令。杀死进程后,会触发Start Redis Sentinel service
任务重新启动 Redis Sentinel 服务。
第二部分:配置 Redis 主从复制
- name: Configure Redis Replication
hosts: redis
become: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
tasks:
- name: Set slave nodes
command: redis-cli -h {{ item }} -p {{ redis_port }} SLAVEOF {{ master_ip }} {{ redis_port }}
when: ansible_default_ipv4.address != master_ip
loop: "{{ slave_ips }}"
- name: Initialize Sentinel monitoring
command: redis-cli -h {{ master_ip }} -p {{ sentinel_port }} sentinel monitor mymaster {{ master_ip }} {{ redis_port }} 2
设置从节点:使用
redis-cli
命令将从节点(IP 地址在slave_ips
列表中)配置为指向主节点(master_ip
)。when
条件确保该任务只在非主节点上执行。初始化 Sentinel 监控:使用
redis-cli
命令初始化 Sentinel 对主节点的监控。sentinel monitor mymaster {{ master_ip }} {{ redis_port }} 2
表示监控名为mymaster
的主节点,并且至少需要 2 个 Sentinel 节点同意才能进行故障转移。
第三部分:验证 Redis 集群状态
- name: Verify Redis Cluster Status
hosts: redis
become: true
vars:
redis_port: 6379
sentinel_port: 26379
master_ip: 192.168.1.51
slave_ips:
- 192.168.1.52
- 192.168.1.53
tasks:
- name: Check Redis master status
command: redis-cli -h {{ master_ip }} -p {{ redis_port }} INFO replication
register: master_info
when: ansible_default_ipv4.address == master_ip
- name: Print Redis master status
debug:
var: master_info.stdout_lines
when: ansible_default_ipv4.address == master_ip
- name: Check Redis slave status
command: redis-cli -h {{ item }} -p {{ redis_port }} INFO replication
register: slave_info
when: ansible_default_ipv4.address != master_ip
loop: "{{ slave_ips }}"
- name: Print Redis slave status
debug:
var: slave_info.results
when: ansible_default_ipv4.address != master_ip
- name: Check Sentinel status
command: redis-cli -h {{ item }} -p {{ sentinel_port }} SENTINEL masters
register: sentinel_info
loop: "{{ slave_ips + [master_ip] }}"
- name: Print Sentinel status
debug:
var: sentinel_info.results
检查 Redis 主节点状态:使用
redis-cli
命令获取主节点的复制信息,并将结果存储在master_info
变量中。when
条件确保该任务只在主节点上执行。打印 Redis 主节点状态:使用
debug
模块打印主节点的复制信息。检查 Redis 从节点状态:使用
redis-cli
命令获取从节点的复制信息,并将结果存储在slave_info
变量中。when
条件确保该任务只在从节点上执行。打印 Redis 从节点状态:使用
debug
模块打印从节点的复制信息。检查 Sentinel 状态:使用
redis-cli
命令获取 Sentinel 监控的主节点信息,并将结果存储在sentinel_info
变量中。打印 Sentinel 状态:使用
debug
模块打印 Sentinel 的监控信息。