--- # This playbook removes the Ceph RBD mirror from your cluster on the given # node. # # Use it like this: # ansible-playbook shrink-rbdmirror.yml -e rbdmirror_to_kill=ceph-rbdmirror01 # 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-rbdmirror.yml # Overrides the prompt using -e option. Can be used in # automation scripts to avoid interactive prompt. - name: gather facts and check the init system hosts: - "{{ mon_group_name|default('mons') }}" - "{{ mon_group_name|default('rbdmirrors') }}" become: true tasks: - debug: msg: gather facts on MONs and RBD mirrors - name: confirm whether user really meant to remove rbd mirror from the ceph cluster hosts: localhost become: true vars_prompt: - name: ireallymeanit prompt: Are you sure you want to shrink the cluster? default: 'no' private: no pre_tasks: - import_role: name: ceph-defaults - import_role: name: ceph-facts - name: exit playbook, if no rbdmirror was given fail: msg: "rbdmirror_to_kill must be declared Exiting shrink-cluster playbook, no RBD mirror was removed. On the command line when invoking the playbook, you can use -e rbdmirror_to_kill=rbd-mirror01 argument. You can only remove a single rbd mirror each time the playbook runs." when: rbdmirror_to_kill is not defined - name: exit playbook, if the rbdmirror is not part of the inventory fail: msg: > It seems that the host given is not part of your inventory, please make sure it is. when: rbdmirror_to_kill not in groups[rbdmirror_group_name] - name: exit playbook, if user did not mean to shrink cluster fail: msg: "Exiting shrink-rbdmirror playbook, no rbd-mirror was 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: set_fact container_exec_cmd for mon0 when: containerized_deployment | bool set_fact: container_exec_cmd: "{{ container_binary }} exec ceph-mon-{{ hostvars[groups[mon_group_name][0]]['ansible_hostname'] }}" - name: exit playbook, if can not connect to the cluster command: "{{ container_exec_cmd | default('') }} timeout 5 ceph --cluster {{ cluster }} -s -f json" register: ceph_health until: ceph_health.rc failed_when: ceph_health.rc != 0 delegate_to: "{{ groups[mon_group_name][0] }}" retries: 5 delay: 2 - name: set_fact rbdmirror_to_kill_hostname set_fact: rbdmirror_to_kill_hostname: "{{ hostvars[rbdmirror_to_kill]['ansible_hostname'] }}" - name: set_fact rbdmirror_gids set_fact: rbdmirror_gids: "{{ rbdmirror_gids | default([]) + [ item ] }}" with_items: "{{ (ceph_health.stdout | from_json)['servicemap']['services']['rbd-mirror']['daemons'].keys() | list }}" when: item != 'summary' - name: set_fact rbdmirror_to_kill_gid set_fact: rbdmirror_to_kill_gid: "{{ (ceph_health.stdout | from_json)['servicemap']['services']['rbd-mirror']['daemons'][item]['gid'] }}" with_items: "{{ rbdmirror_gids }}" when: (ceph_health.stdout | from_json)['servicemap']['services']['rbd-mirror']['daemons'][item]['metadata']['hostname'] == rbdmirror_to_kill_hostname tasks: - name: stop rbdmirror service service: name: ceph-rbd-mirror@rbd-mirror.{{ rbdmirror_to_kill_hostname }} state: stopped enabled: no delegate_to: "{{ rbdmirror_to_kill }}" failed_when: false - name: purge related directories file: path: /var/lib/ceph/bootstrap-rbd-mirror/{{ cluster }}-{{ rbdmirror_to_kill_hostname }} state: absent delegate_to: "{{ rbdmirror_to_kill }}" post_tasks: - name: get servicemap details command: "{{ container_exec_cmd | default('') }} timeout 5 ceph --cluster {{ cluster }} -s -f json" register: ceph_health delegate_to: "{{ groups[mon_group_name][0] }}" - name: set_fact rbdmirror_gids set_fact: post_rbdmirror_gids: "{{ post_rbdmirror_gids | default([]) + [ item ] }}" with_items: "{{ (ceph_health.stdout | from_json)['servicemap']['services']['rbd-mirror']['daemons'].keys() | list }}" when: - "'rbd-mirror' in (ceph_health.stdout | from_json)['servicemap']['services'].keys() | list" - item != 'summary' - name: show ceph health command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} -s" delegate_to: "{{ groups[mon_group_name][0] }}" - name: check presence of "{{ rbdmirror_to_kill_hostname }}" fail: msg: "{{ rbdmirror_to_kill_hostname }} still active!" when: - rbdmirror_to_kill_gid is defined - post_rbdmirror_gids is defined - rbdmirror_to_kill_gid in post_rbdmirror_gids