aboutsummaryrefslogtreecommitdiff
path: root/ansible/roles/valkey/tasks/upgrade.yml
blob: e40b699b9cb124bf832ede9d5246920f94f899db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
---
# TODO(bbezak): Remove in G/2026.1 release as Redis migration is no longer required
- name: Check if Redis is running
  become: true
  kolla_container_facts:
    action: get_containers
    container_engine: "{{ kolla_container_engine }}"
    name:
      - redis
  check_mode: false
  register: redis_container_facts

- name: Set migration flag if Redis is present
  set_fact:
    _valkey_migration: "{{ redis_container_facts.containers['redis'] is defined }}"

- name: Perform Redis to Valkey migration steps
  when: redis_container_facts.containers['redis'] is defined
  block:
    - name: Set temporary Valkey migration vars
      set_fact:
        valkey_server_port: "6380"
        valkey_sentinel_port: "26380"
        valkey_sentinel_monitor_name: "kolla-temp"

    - name: Set valkey master host to valkey[0]
      set_fact:
        valkey_master_host: "{{ groups['valkey'][0] }}"
        redis_slave_hosts: "{{ groups['redis'][1:] }}"
      run_once: true

    - name: Start Valkey on temporary ports with temp sentinel monitor name
      import_tasks: deploy.yml

    - name: Wait for Valkey replication sync
      become: true
      changed_when: false
      delegate_to: "{{ valkey_master_host }}"
      run_once: true
      command: >-
        {{ kolla_container_engine }} exec valkey_server
        valkey-cli -h {{ api_interface_address }} -p {{ valkey_server_port }} info replication
      register: valkey_replication
      until: "'master_link_status:up' in valkey_replication.stdout"
      retries: 30
      delay: 2

    - name: Set replica-priority=10 on valkey[0] to ensure it becomes master
      become: true
      changed_when: true
      delegate_to: "{{ valkey_master_host }}"
      run_once: true
      command: >-
        {{ kolla_container_engine }} exec valkey_server valkey-cli
        -h {{ api_interface_address }} -p {{ valkey_server_port }}
        CONFIG SET replica-priority 10

    - name: Set replica-priority=0 on other valkey nodes to prevent promotion
      become: true
      changed_when: true
      command: >-
        {{ kolla_container_engine }} exec valkey_server valkey-cli
        -h {{ api_interface_address }} -p {{ valkey_server_port }} CONFIG SET replica-priority 0
      when: inventory_hostname != valkey_master_host

    - name: Stop redis slaves (so they don't get promoted during failover)
      become: true
      kolla_container:
        name: redis
        action: stop_container
      when: inventory_hostname in redis_slave_hosts

    - name: Trigger Sentinel failover (using one of redis-sentinels)
      become: true
      changed_when: true
      delegate_to: "{{ valkey_master_host }}"
      run_once: true
      command: >-
        {{ kolla_container_engine }} exec redis_sentinel redis-cli
        -h {{ api_interface_address }}
        -p {{ redis_sentinel_port }}
        SENTINEL failover kolla

    - name: Wait until Valkey becomes master
      become: true
      changed_when: false
      delegate_to: "{{ valkey_master_host }}"
      run_once: true
      command: >-
        {{ kolla_container_engine }} exec valkey_server
        valkey-cli -h {{ api_interface_address }} -p {{ valkey_server_port }} info replication
      register: valkey_role
      until: "'role:master' in valkey_role.stdout"
      retries: 30
      delay: 2

    - name: Stop all Redis containers
      become: true
      kolla_container:
        name: redis
        action: stop_and_remove_container
      when: inventory_hostname in groups['redis']

    - name: Stop all Sentinel containers
      become: true
      kolla_container:
        name: redis_sentinel
        action: stop_and_remove_container
      when: inventory_hostname in groups['redis']

    - name: Remove Redis data volume
      become: true
      kolla_container:
        action: remove_volume
        name: redis
      when: inventory_hostname in groups['redis']

# These tasks run always, regardless of Redis presence

- name: Reset Valkey port to default (6379) after migration
  set_fact:
    valkey_server_port: "6379"
    valkey_sentinel_port: "26379"
    valkey_sentinel_monitor_name: "kolla"
    _valkey_migration: false

- name: Reconfigure/Redeploy Valkey on default ports
  import_tasks: reconfigure.yml

- name: Verify Valkey responds on port 6379
  import_tasks: check.yml

- import_tasks: check-containers.yml

- name: Flush handlers
  meta: flush_handlers