forked from ceph/ceph-ansible
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shrink-mon.yml
142 lines (121 loc) · 4.5 KB
/
shrink-mon.yml
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
---
# This playbook shrinks the Ceph monitors from your cluster
# It can remove any number of monitor(s) from the cluster and ALL THEIR DATA
#
# Use it like this:
# ansible-playbook shrink-mon.yml -e mon_host=ceph-mon01,ceph-mon02
# Prompts for confirmation to shrink, defaults to no and
# doesn't shrink the cluster. yes shrinks the cluster.
#
# ansible-playbook -e ireallymeanit=yes|no shrink-cluster.yml
# Overrides the prompt using -e option. Can be used in
# automation scripts to avoid interactive prompt.
- name: confirm whether user really meant to remove monitor(s) from the ceph cluster
hosts:
- localhost
gather_facts: false
become: true
vars_prompt:
- name: ireallymeanit
prompt: Are you sure you want to shrink the cluster?
default: 'no'
private: no
tasks:
- include_vars: roles/ceph-common/defaults/main.yml
- include_vars: group_vars/all
- name: exit playbook, if user did not mean to shrink cluster
fail:
msg: "Exiting shrink-mon playbook, no monitor(s) was/were removed.
To shrink the cluster, either say 'yes' on the prompt or
or use `-e ireallymeanit=yes` on the command line when
invoking the playbook"
when: ireallymeanit != 'yes'
- name: exit playbook, if no monitor(s) was/were given
fail:
msg: "mon_host must be declared
Exiting shrink-cluster playbook, no monitor(s) was/were removed.
On the command line when invoking the playbook, you can use
-e mon_host=ceph-mon01,ceph-mon02 argument."
when: mon_host is not defined
- name: test if ceph command exist
command: command -v ceph
changed_when: false
failed_when: false
register: ceph_command
- name: exit playbook, if ceph command does not exist
debug:
msg: "The ceph command is not available, please install it :("
run_once: true
when:
- ceph_command.rc != 0
- name: exit playbook, if cluster files do not exist
stat:
path: "{{ item }}"
register: ceph_conf_key
with_items:
- /etc/ceph/{{ cluster }}.conf
- /etc/ceph/{{ cluster }}.client.admin.keyring
failed_when: false
- fail:
msg: "Ceph's configuration file is not present in /etc/ceph"
with_items: "{{ceph_conf_key.results}}"
when:
- item.stat.exists == false
- name: exit playbook, if can not connect to the cluster
command: timeout 5 ceph --cluster {{ cluster }} health
register: ceph_health
until: ceph_health.stdout.find("HEALTH") > -1
retries: 5
delay: 2
- name: verify given monitors are reachable
command: ping -c 1 {{ item }}
with_items: "{{mon_host.split(',')}}"
register: mon_reachable
failed_when: false
- fail:
msg: "One or more monitors are not reachable, please check your /etc/hosts or your DNS"
with_items: "{{mon_reachable.results}}"
when:
- item.rc != 0
- name: stop monitor service (systemd)
service:
name: ceph-mon@{{ item }}
state: stopped
enabled: no
with_items: "{{mon_host.split(',')}}"
delegate_to: "{{item}}"
failed_when: false
- name: purge monitor store
file:
path: /var/lib/ceph/mon/{{ cluster }}-{{ item }}
state: absent
with_items: "{{mon_host.split(',')}}"
delegate_to: "{{item}}"
- name: remove monitor from the quorum
command: ceph --cluster {{ cluster }} mon remove {{ item }}
failed_when: false
with_items: "{{mon_host.split(',')}}"
# NOTE (leseb): sorry for the 'sleep' command
# but it will take a couple of seconds for other monitors
# to notice that one member has left.
# 'sleep 5' is not that bad and should be sufficient
- name: verify the monitor is out of the cluster
shell: "sleep 5 && ceph --cluster {{ cluster }} -s | grep monmap | sed 's/.*quorum//' | egrep -sq {{ item }}"
with_items: "{{mon_host.split(',')}}"
failed_when: false
register: ceph_health_mon
- name: please remove the monitor from your ceph configuration file
debug:
msg: "The monitor(s) has/have been successfully removed from the cluster.
Please remove the monitor(s) entry(ies) from the rest of your ceph configuration files, cluster wide."
run_once: true
with_items: "{{ceph_health_mon.results}}"
when:
- item.rc != 0
- name: please remove the monitor from your ceph configuration file
fail:
msg: "Monitor(s) appear(s) to still be part of the cluster, please check what happened."
run_once: true
with_items: "{{ceph_health_mon.results}}"
when:
- item.rc == 0