forked from ceph/ceph-ansible
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shrink-osd.yml
131 lines (110 loc) · 4.2 KB
/
shrink-osd.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
---
# This playbook shrinks Ceph OSDs.
# It can remove any number of OSD(s) from the cluster and ALL THEIR DATA
#
# Use it like this:
# ansible-playbook shrink-osd.yml -e osd_id=0,2,6
# 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-osd.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 osd(s) from the 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-osd playbook, no osd(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 osd(s) was/were given
fail:
msg: "osd_ids must be declared
Exiting shrink-osd playbook, no OSD()s was/were removed.
On the command line when invoking the playbook, you can use
-e osd_ids=0,1,2,3 argument."
when: osd_ids 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
# NOTE (leseb): just in case, the complex filters mechanism below does not work anymore.
# This will be a quick and easy fix but will require using the shell module.
# - name: find the host where the osd(s) is/are running on
# shell: |
# ceph --cluster {{ cluster }} osd find {{ item }} | grep -Po '(?<="ip": ")[^:]*'
# with_items: "{{osd_ids.split(',')}}"
# register: osd_hosts
#
- name: find the host where the osd(s) is/are running on
command: ceph --cluster {{ cluster }} osd find {{ item }}
with_items: "{{osd_ids.split(',')}}"
register: osd_hosts
- set_fact: ip_item="{{(item.stdout | from_json).ip}}"
with_items: "{{osd_hosts.results}}"
register: ip_result
- set_fact: ips="{{ ip_result.results | map(attribute='ansible_facts.ip_item') | list }}"
- set_fact: real_ips="{{ ips | regex_replace(':[0-9][0-9][0-9][0-9]\/[0-9][0-9][0-9][0-9]', '') }}"
- name: check if ceph admin key exists on the osd nodes
stat:
path: "/etc/ceph/{{ cluster }}.client.admin.keyring"
register: ceph_admin_key
with_items: "{{real_ips}}"
delegate_to: "{{item}}"
failed_when: false
- fail:
msg: "The Ceph admin key is not present on the OSD node, please add it and remove it after the playbook is done."
with_items: "{{ceph_admin_key.results}}"
when:
- item.stat.exists == false
- name: deactivating osd(s)
command: ceph-disk deactivate --cluster {{ cluster }} --deactivate-by-id {{ item.0 }} --mark-out
with_together:
- "{{osd_ids.split(',')}}"
- "{{real_ips}}"
delegate_to: "{{item.1}}"
- name: destroying osd(s)
command: ceph-disk destroy --cluster {{ cluster }} --destroy-by-id {{ item.0 }} --zap
with_together:
- "{{osd_ids.split(',')}}"
- "{{real_ips}}"
delegate_to: "{{item.1}}"