ansible playbook配置redis哨兵模式脚本解析

2025-05-06 23:17

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 的监控信息。

相关新闻
热点
视频
投票
查看结果
Tags

站点地图 在线访客: 今日访问量: 昨日访问量: 总访问量:

© 2025 个人网站 版权所有

备案号:苏ICP备2024108837号

苏公网安备32011302322151号