--- # This playbook shrinks the Ceph manager from your cluster # # Use it like this: # ansible-playbook shrink-mgr.yml -e mgr_to_kill=ceph-mgr1 # Prompts for confirmation to shrink, defaults to no and # doesn't shrink the cluster and yes shrinks the cluster. # # ansible-playbook -e ireallymeanit=yes|no shrink-mgr.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') }}" - "{{ mgr_group_name | default('mgrs') }}" become: true tasks: - name: Gather facts on all Ceph hosts for following reference ansible.builtin.debug: msg: gather facts on all Ceph hosts for following reference - name: Confirm if user really meant to remove manager 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: Set_fact container_exec_cmd 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 }} health" register: ceph_health changed_when: false until: ceph_health is succeeded retries: 5 delay: 2 - name: Get total number of mgrs in cluster block: - name: Save mgr dump output ansible.builtin.command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} mgr dump -f json" register: mgr_dump changed_when: false - name: Get active and standbys mgr list ansible.builtin.set_fact: active_mgr: "{{ [mgr_dump.stdout | from_json] | map(attribute='active_name') | list }}" standbys_mgr: "{{ (mgr_dump.stdout | from_json)['standbys'] | map(attribute='name') | list }}" - name: Exit playbook, if there's no standby manager ansible.builtin.fail: msg: "You are about to shrink the only manager present in the cluster." when: standbys_mgr | length | int < 1 - name: Exit playbook, if no manager was given ansible.builtin.fail: msg: "mgr_to_kill must be declared Exiting shrink-cluster playbook, no manager was removed. On the command line when invoking the playbook, you can use -e mgr_to_kill=ceph-mgr01 argument. You can only remove a single manager each time the playbook runs." when: mgr_to_kill is not defined - name: Exit playbook, if user did not mean to shrink cluster ansible.builtin.fail: msg: "Exiting shrink-mgr playbook, no manager 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 mgr_to_kill_hostname ansible.builtin.set_fact: mgr_to_kill_hostname: "{{ hostvars[mgr_to_kill]['ansible_facts']['hostname'] }}" - name: Exit playbook, if the selected manager is not present in the cluster ansible.builtin.fail: msg: "It seems that the host given is not present in the cluster." when: - mgr_to_kill_hostname not in active_mgr - mgr_to_kill_hostname not in standbys_mgr tasks: - name: Stop manager services and verify it block: - name: Stop manager service ansible.builtin.service: name: ceph-mgr@{{ mgr_to_kill_hostname }} state: stopped enabled: false delegate_to: "{{ mgr_to_kill }}" failed_when: false - name: Ensure that the mgr is stopped ansible.builtin.command: "systemctl is-active ceph-mgr@{{ mgr_to_kill_hostname }}" # noqa command-instead-of-module register: mgr_to_kill_status failed_when: mgr_to_kill_status.rc == 0 delegate_to: "{{ mgr_to_kill }}" changed_when: false retries: 5 delay: 2 - name: Fail if the mgr is reported in ceph mgr dump ansible.builtin.command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} mgr dump -f json" register: mgr_dump changed_when: false failed_when: mgr_to_kill_hostname in (([mgr_dump.stdout | from_json] | map(attribute='active_name') | list) + (mgr_dump.stdout | from_json)['standbys'] | map(attribute='name') | list) until: mgr_to_kill_hostname not in (([mgr_dump.stdout | from_json] | map(attribute='active_name') | list) + (mgr_dump.stdout | from_json)['standbys'] | map(attribute='name') | list) retries: 12 delay: 10 - name: Purge manager store ansible.builtin.file: path: /var/lib/ceph/mgr/{{ cluster }}-{{ mgr_to_kill_hostname }} state: absent delegate_to: "{{ mgr_to_kill }}" post_tasks: - name: Show ceph health ansible.builtin.command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} -s" changed_when: false