recipes/maint_osd_remove_zap.rb (56 lines of code) (raw):

# # Author:: Hans Chris Jones <chris.jones@lambdastack.io> # Cookbook Name:: ceph # # Copyright 2017, Bloomberg Finance L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Maintenance recipe # IMPORTANT: If your you are only wanting to remove a few OSDs from a larger cluster then bringing the 'reweight' # down to 0 in one step should not degrade performance that much. However, if you're needing to say, swap drives out, # then you should consider 'reweight' is small but reasonable increments until you reach 0. A good rule-of-thumb # has been .25 increments (even smaller in some cases) to keep the degrade percentage less than 10%. You can change # 'reweight' to a lower increment once the degrade percentage is around 1% - 2% or less. This technique can help # save PG headaches in some environments. Of course, there are other ways to do this but this is a simple way. # This recipe will zap all of the devices in the node['ceph']['osd']['devices'] List # This also assumes that all needed packages were installed alread (when the OSDs were created - default) service_type = node['ceph']['osd']['init_style'] if node['ceph']['osd']['remove'] devices = node['ceph']['osd']['remove'] devices = Hash[(0...devices.size).zip devices] unless devices.is_a? Hash include_recipe 'ceph-chef::osd_scrubbing_off' devices.each do |_index, osd_device| # Maybe put this section in provider execute "ceph osd out #{osd_device['device']}" do command lazy { "ceph osd out #{osd_device['osd']}" } end if service_type == 'upstart' execute 'upstart osd stop' do command lazy { "stop ceph-osd id=#{osd_device['osd']}" } end else execute 'rhel osd stop' do command lazy { "service ceph stop osd.#{osd_device['osd']}" } end end execute "ceph osd remove #{osd_device['device']}" do command <<-EOH ceph osd crush remove osd.#{osd_device['osd']} ceph auth del osd.#{osd_device['osd']} ceph osd rm #{osd_device['osd']} EOH end execute "unmount on #{osd_device['device']}" do command lazy { "umount #{osd_device['device']}#{osd_device['partition']}" } end # TODO: delete the journal partition IF the journal is on a device other than the data device (i.e., SSDs) # Use sgdisk -d <journal partition> /dev/<whatever device> if osd_device['osd'] != osd_device['journal'] execute 'ceph journal partition delete' do command <<-EOH journal=$(/etc/ceph/scripts/ceph_journal.sh 2 #{osd_device['osd']}) sgdisk -d $journal #{osd_device['journal']} EOH end end execute "remove mount directory - #{osd_device['device']}" do command lazy { "rm -rf /var/lib/ceph/osd/#{node['ceph']['cluster']}-#{osd_device['osd']}" } only_if "test -d /var/lib/ceph/osd/#{node['ceph']['cluster']}-#{osd_device['osd']}" end # No guard on this - zap!! The only psuedo guard is if the 'zap' attribute was missing. if !osd_device['zap'].nil? && osd_device['zap'] execute "ceph-disk-zap on #{osd_device['device']}" do command lazy { "ceph-disk zap #{osd_device['device']}" } end end # If the journal is on a device other than the data device (i.e., SSDs) then removal of the partition # is handled earlier but letting the kernel know to update the partition table needs to be done before # exiting. If you don't then 'ceph-disk list' will still see the old partition but it will be next unless osd_device['osd'] != osd_device['journal'] execute 'partition table kernel update' do command <<-EOH partprobe #{osd_device['journal']} EOH end end include_recipe 'ceph-chef::osd_scrubbing_on' else Log.info("node['ceph']['osd']['remove'] empty") end