summaryrefslogtreecommitdiffstats
path: root/playbooks/openshift-etcd/private/migrate.yml
blob: 31362f2f62f556ff4cc9bc94ef5dbbaa482a9d26 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
---
- name: Check if the master has embedded etcd
  hosts: localhost
  connection: local
  become: no
  gather_facts: no
  tags:
  - always
  tasks:
  - fail:
      msg: "Migration of an embedded etcd is not supported. Please, migrate the embedded etcd into an external etcd first."
    when:
    - groups.oo_etcd_to_config | default([]) | length == 0

- name: Run pre-checks
  hosts: oo_etcd_to_migrate
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.pre_check
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ ansible_default_ipv4.address }}"

# TODO: This will be different for release-3.6 branch
- name: Prepare masters for etcd data migration
  hosts: oo_masters_to_config
  tasks:
  - set_fact:
      master_services:
      - "{{ openshift.common.service_type + '-master-controllers' }}"
      - "{{ openshift.common.service_type + '-master-api' }}"
  - debug:
      msg: "master service name: {{ master_services }}"
  - name: Stop masters
    service:
      name: "{{ item }}"
      state: stopped
    with_items: "{{ master_services }}"

- name: Backup v2 data
  hosts: oo_etcd_to_migrate
  gather_facts: no
  roles:
  - role: openshift_facts
  post_tasks:
  - include_role:
      name: etcd
      tasks_from: backup
    vars:
      r_etcd_common_etcd_runtime: "{{ openshift.common.etcd_runtime }}"
      r_etcd_common_backup_tag: pre-migration
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      r_etcd_common_backup_sufix_name: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"

- name: Gate on etcd backup
  hosts: localhost
  connection: local
  become: no
  tasks:
  - set_fact:
      etcd_backup_completed: "{{ hostvars
                                 | oo_select_keys(groups.oo_etcd_to_migrate)
                                 | oo_collect('inventory_hostname', {'r_etcd_common_backup_complete': true}) }}"
  - set_fact:
      etcd_backup_failed: "{{ groups.oo_etcd_to_migrate | difference(etcd_backup_completed) | list }}"
  - fail:
      msg: "Migration cannot continue. The following hosts did not complete etcd backup: {{ etcd_backup_failed | join(',') }}"
    when:
    - etcd_backup_failed | length > 0

- name: Stop etcd
  hosts: oo_etcd_to_migrate
  gather_facts: no
  pre_tasks:
  - include_role:
      name: etcd
      tasks_from: disable_etcd
    vars:
      r_etcd_common_etcd_runtime: "{{ openshift.common.etcd_runtime }}"

- name: Migrate data on first etcd
  hosts: oo_etcd_to_migrate[0]
  gather_facts: no
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"

- name: Clean data stores on remaining etcd hosts
  hosts: oo_etcd_to_migrate[1:]
  gather_facts: no
  tasks:
  - include_role:
      name: etcd
      tasks_from: clean_data
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"
  - name: Add etcd hosts
    delegate_to: localhost
    add_host:
      name: "{{ item }}"
      groups: oo_new_etcd_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ groups.oo_etcd_to_migrate[1:] | default([]) }}"
    changed_when: no
  - name: Set success
    set_fact:
      r_etcd_migrate_success: true

- include: ./scaleup.yml

- name: Gate on etcd migration
  hosts: oo_masters_to_config
  gather_facts: no
  tasks:
  - set_fact:
      etcd_migration_completed: "{{ hostvars
                                 | oo_select_keys(groups.oo_etcd_to_migrate)
                                 | oo_collect('inventory_hostname', {'r_etcd_migrate_success': true}) }}"
  - set_fact:
      etcd_migration_failed: "{{ groups.oo_etcd_to_migrate | difference(etcd_migration_completed) | list }}"

- name: Add TTLs on the first master
  hosts: oo_first_master[0]
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.add_ttls
    vars:
      etcd_peer: "{{ hostvars[groups.oo_etcd_to_migrate.0].openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"
    when: etcd_migration_failed | length == 0

- name: Configure masters if etcd data migration is succesfull
  hosts: oo_masters_to_config
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.configure_master
    when: etcd_migration_failed | length == 0
  - debug:
      msg: "Skipping master re-configuration since migration failed."
    when:
    - etcd_migration_failed | length > 0
  - name: Start master services
    service:
      name: "{{ item }}"
      state: started
    register: service_status
    # Sometimes the master-api, resp. master-controllers fails to start for the first time
    until: service_status.state is defined and service_status.state == "started"
    retries: 5
    delay: 10
    with_items: "{{ master_services[::-1] }}"
  - fail:
      msg: "Migration failed. The following hosts were not properly migrated: {{ etcd_migration_failed | join(',') }}"
    when:
    - etcd_migration_failed | length > 0