--- # 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: - mons - rbdmirrors become: true tasks: - name: Gather facts on MONs and RBD mirrors ansible.builtin.debug: msg: gather facts on MONs and RBD mirrors - name: Confirm whether user really meant to remove rbd mirror from the ceph cluster hosts: mons[0] become: true vars_prompt: - name: ireallymeanit # noqa: name[casing] prompt: Are you sure you want to shrink the cluster? default: 'no' private: false pre_tasks: - name: Import ceph-defaults role ansible.builtin.import_role: name: ceph-defaults - name: Import ceph-facts role ansible.builtin.import_role: name: ceph-facts tasks_from: container_binary - name: Exit playbook, if no rbdmirror was given ansible.builtin.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 ansible.builtin.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 ansible.builtin.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 ansible.builtin.set_fact: container_exec_cmd: "{{ container_binary }} exec ceph-mon-{{ ansible_facts['hostname'] }}" - name: Exit playbook, if can not connect to the cluster ansible.builtin.command: "{{ container_exec_cmd | default('') }} timeout 5 ceph --cluster {{ cluster }} service dump -f json" register: ceph_health changed_when: false until: ceph_health is succeeded retries: 5 delay: 2 - name: Set_fact rbdmirror_to_kill_hostname ansible.builtin.set_fact: rbdmirror_to_kill_hostname: "{{ hostvars[rbdmirror_to_kill]['ansible_facts']['hostname'] }}" - name: Set_fact rbdmirror_gids ansible.builtin.set_fact: rbdmirror_gids: "{{ rbdmirror_gids | default([]) + [item] }}" with_items: "{{ (ceph_health.stdout | from_json)['services']['rbd-mirror']['daemons'].keys() | list }}" when: item != 'summary' - name: Set_fact rbdmirror_to_kill_gid ansible.builtin.set_fact: rbdmirror_to_kill_gid: "{{ (ceph_health.stdout | from_json)['services']['rbd-mirror']['daemons'][item]['gid'] }}" with_items: "{{ rbdmirror_gids }}" when: (ceph_health.stdout | from_json)['services']['rbd-mirror']['daemons'][item]['metadata']['id'] == rbdmirror_to_kill_hostname tasks: - name: Stop rbdmirror service ansible.builtin.service: name: ceph-rbd-mirror@rbd-mirror.{{ rbdmirror_to_kill_hostname }} state: stopped enabled: false delegate_to: "{{ rbdmirror_to_kill }}" failed_when: false - name: Purge related directories ansible.builtin.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 ansible.builtin.command: "{{ container_exec_cmd | default('') }} timeout 5 ceph --cluster {{ cluster }} service dump -f json" register: ceph_health failed_when: - "'rbd-mirror' in (ceph_health.stdout | from_json)['services'].keys() | list" - rbdmirror_to_kill_gid in (ceph_health.stdout | from_json)['services']['rbd-mirror']['daemons'].keys() | list until: - "'rbd-mirror' in (ceph_health.stdout | from_json)['services'].keys() | list" - rbdmirror_to_kill_gid not in (ceph_health.stdout | from_json)['services']['rbd-mirror']['daemons'].keys() | list changed_when: false when: rbdmirror_to_kill_gid is defined retries: 12 delay: 10 - name: Show ceph health ansible.builtin.command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} -s" changed_when: false