summaryrefslogtreecommitdiffstats
path: root/playbooks/common/openshift-etcd/migrate.yml
blob: 06e0607bdfd213a4bb7ec7a76d7903a67eb713cc (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
---
- 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
  - role: etcd_common
    r_etcd_common_action: backup
    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) }}"
  - 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:
  - set_fact:
      l_etcd_service: "{{ 'etcd_container' if openshift.common.is_containerized else 'etcd' }}"
  - name: Disable etcd members
    service:
      name: "{{ l_etcd_service }}"
      state: stopped

- 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) }}"

- 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