--- # This playbook purges Ceph # It removes: packages, configuration files and ALL THE DATA # # Use it like this: # ansible-playbook purge-cluster.yml # Prompts for confirmation to purge, defaults to no and # doesn't purge the cluster. yes purges the cluster. # # ansible-playbook -e ireallymeanit=yes|no purge-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 purge the cluster hosts: localhost vars_prompt: - name: ireallymeanit prompt: Are you sure you want to purge the cluster? default: 'no' private: no tasks: - name: exit playbook, if user didn't mean to purge cluster fail: msg: > "Exiting purge-cluster playbook, cluster was NOT purged. To purge 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: stop ceph cluster hosts: - mons - osds - mdss - rgws become: yes vars: osd_group_name: osds mon_group_name: mons rgw_group_name: rgws mds_group_name: mdss # When set to true both groups of packages are purged. # This can cause problem with qemu-kvm purge_all_packages: true # When set to true and raw _multi_journal is used then journal disk are also zapped zap_journal_disks: true ceph_packages: - ceph - ceph-common - ceph-fs-common - ceph-fuse - ceph-mds - ceph-release - ceph-radosgw ceph_remaining_packages: - libcephfs1 - librados2 - libradosstriper1 - librbd1 - python-cephfs - python-rados - python-rbd handlers: - name: restart machine shell: sleep 2 && shutdown -r now "Ansible updates triggered" async: 1 poll: 0 ignore_errors: true - name: wait for server to boot local_action: wait_for port=22 host={{ inventory_hostname }} state=started delay=10 timeout=400 - name: remove data file: path: /var/lib/ceph state: absent tasks: - name: check for a device list fail: msg: "OSD automatic discovery was detected, purge cluster does not support this scenario. If you want to purge the cluster, manually provide the list of devices in group_vars/osds using the devices variable." when: devices is not defined and osd_auto_discovery - name: get osd numbers shell: "if [ -d /var/lib/ceph/osd ] ; then ls /var/lib/ceph/osd | cut -d '-' -f 2 ; fi" register: osd_ids changed_when: false - name: are we using systemd shell: "if [ -d /usr/lib/systemd ] ; then find /usr/lib/systemd/system -name 'ceph*' | wc -l ; else echo 0 ; fi" register: systemd_unit_files # Infernalis - name: stop ceph.target with systemd service: name: ceph.target state: stopped enabled: no when: ansible_os_family == 'RedHat' and systemd_unit_files.stdout != "0" - name: stop ceph-osd with systemd service: name: ceph-osd@{{item}} state: stopped enabled: no with_items: "{{ osd_ids.stdout_lines }}" when: ansible_os_family == 'RedHat' and systemd_unit_files.stdout != "0" and osd_group_name in group_names - name: stop ceph mons with systemd service: name: ceph-mon@{{ ansible_hostname }} state: stopped enabled: no when: ansible_os_family == 'RedHat' and systemd_unit_files.stdout != "0" and mon_group_name in group_names - name: stop ceph mdss with systemd service: name: ceph-mds@{{ ansible_hostname }} state: stopped when: ansible_os_family == 'RedHat' and systemd_unit_files.stdout != "0" and mds_group_name in group_names # before infernalis - name: stop ceph osds command: service ceph stop osd when: ansible_os_family == 'RedHat' and osd_group_name in group_names and systemd_unit_files.stdout == "0" - name: stop ceph mons command: service ceph stop mon when: ansible_os_family == 'RedHat' and mon_group_name in group_names and systemd_unit_files.stdout == "0" - name: stop ceph mdss command: service ceph stop mds when: ansible_os_family == 'RedHat' and mds_group_name in group_names and systemd_unit_files.stdout == "0" # Ubuntu 14.04 - name: stop ceph osds on ubuntu command: stop ceph-osd id={{ item }} failed_when: false when: ansible_distribution == 'Ubuntu' and osd_group_name in group_names with_items: "{{ osd_ids.stdout_lines }}" - name: stop ceph mons on ubuntu command: stop ceph-mon id={{ ansible_hostname }} failed_when: false when: ansible_distribution == 'Ubuntu' and mon_group_name in group_names - name: stop ceph mdss on ubuntu command: stop ceph-mds-all failed_when: false when: ansible_distribution == 'Ubuntu' and mds_group_name in group_names - name: check for anything running ceph shell: "ps awux | grep -v grep | grep -q -- ceph-" register: check_for_running_ceph failed_when: check_for_running_ceph.rc == 0 - name: get osd data mount points shell: "(grep /var/lib/ceph/osd /proc/mounts || echo -n) | awk '{ print $2 }'" register: mounted_osd changed_when: false - name: drop all cache shell: "sync && sleep 1 && echo 3 > /proc/sys/vm/drop_caches" when: osd_group_name in group_names - name: umount osd data partition shell: umount {{ item }} with_items: - "{{ mounted_osd.stdout_lines }}" when: osd_group_name in group_names - name: remove osd mountpoint tree shell: rm -rf /var/lib/ceph/osd register: remove_osd_mountpoints failed_when: false when: osd_group_name in group_names - name: remove monitor store and bootstrap keys shell: rm -rf /var/lib/ceph/ failed_when: false when: mon_group_name in group_names - name: is reboot needed local_action: shell echo requesting reboot notify: - restart machine - wait for server to boot - remove data when: osd_group_name in group_names and remove_osd_mountpoints.rc != 0 - name: zap osd disks shell: ceph-disk zap "{{ item }}" with_items: devices when: osd_group_name in group_names - name: zap journal devices shell: ceph-disk zap "{{ item }}" with_items: "{{ raw_journal_devices|default([])|unique }}" when: osd_group_name in group_names and raw_multi_journal and zap_journal_disks - name: purge ceph packages with yum yum: name: "{{ item }}" state: absent with_items: - "{{ ceph_packages }}" when: ansible_pkg_mgr == 'yum' - name: purge ceph packages with dnf dnf: name: "{{ item }}" state: absent with_items: - "{{ ceph_packages }}" when: ansible_pkg_mgr == 'dnf' - name: purge ceph packages with apt apt: name: "{{ item }}" state: absent with_items: - "{{ ceph_packages }}" when: ansible_pkg_mgr == 'apt' - name: purge remaining ceph packages with yum yum: name: "{{ item }}" state: absent with_items: - "{{ ceph_remaining_packages }}" when: ansible_pkg_mgr == 'yum' and purge_all_packages == true - name: purge remaining ceph packages with dnf dnf: name: "{{ item }}" state: absent with_items: - "{{ ceph_remaining_packages }}" when: ansible_pkg_mgr == 'dnf' and purge_all_packages == true - name: purge remaining ceph packages with apt apt: name: "{{ item }}" state: absent with_items: - "{{ ceph_remaining_packages }}" when: ansible_pkg_mgr == 'apt' and purge_all_packages == true - name: remove config file: path: /etc/ceph state: absent - name: remove logs file: path: /var/log/ceph state: absent - name: remove from SysV shell: "update-rc.d -f ceph remove" when: ansible_distribution == 'Ubuntu' - name: remove Upstart nad SysV files shell: "find /etc -name '*ceph*' -delete" when: ansible_distribution == 'Ubuntu' - name: remove Upstart and apt logs and cache shell: "find /var -name '*ceph*' -delete" when: ansible_distribution == 'Ubuntu' - name: request data removal local_action: shell echo requesting data removal notify: - remove data