summaryrefslogtreecommitdiffstats
path: root/playbooks/common/openshift-etcd/migrate.yml
blob: a2af7bb21926f3444da9e00c5dec202040211874 (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
---
- name: Run pre-checks
  hosts: oo_etcd_to_migrate
  roles:
  - role: etcd_migrate
    r_etcd_migrate_action: check
    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
  roles:
  - role: etcd_migrate
    r_etcd_migrate_action: migrate
    r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
    etcd_peer: "{{ ansible_default_ipv4.address }}"
    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
  roles:
  - role: etcd_migrate
    r_etcd_migrate_action: clean_data
    r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
    etcd_peer: "{{ ansible_default_ipv4.address }}"
    etcd_url_scheme: "https"
    etcd_peer_url_scheme: "https"
  post_tasks:
  - 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]
  roles:
  - role: etcd_migrate
    r_etcd_migrate_action: add_ttls
    etcd_peer: "{{ hostvars[groups.oo_etcd_to_migrate.0].ansible_default_ipv4.address }}"
    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
  roles:
  - role: etcd_migrate
    r_etcd_migrate_action: configure
    when: etcd_migration_failed | length == 0
  tasks:
  - 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