
This adds the ability for the ceph-osd osd-directory.sh script to handle existing deployments that place data in hosts via CRUSH and modify those deployments to place data in racks instead. The existing data remains intact but is redistributed across the new rack-level failure domains by updating the CRUSH map and assigning new rules to existing pools. Change-Id: Ida79f876d0cae3d99e796e4de1aac55a7978986c
108 lines
3.6 KiB
Smarty
108 lines
3.6 KiB
Smarty
#!/bin/bash
|
|
|
|
{{/*
|
|
Copyright 2017 The Openstack-Helm Authors.
|
|
|
|
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.
|
|
*/}}
|
|
|
|
set -ex
|
|
export LC_ALL=C
|
|
|
|
source /tmp/osd-common.sh
|
|
|
|
: "${JOURNAL_DIR:=/var/lib/ceph/journal}"
|
|
|
|
if [[ ! -d /var/lib/ceph/osd ]]; then
|
|
echo "ERROR- could not find the osd directory, did you bind mount the OSD data directory?"
|
|
echo "ERROR- use -v <host_osd_data_dir>:/var/lib/ceph/osd"
|
|
exit 1
|
|
fi
|
|
|
|
# check if anything is present, if not, create an osd and its directory
|
|
if [[ -n "$(find /var/lib/ceph/osd -prune -empty)" ]]; then
|
|
echo "Creating osd"
|
|
UUID=$(uuidgen)
|
|
OSD_SECRET=$(ceph-authtool --gen-print-key)
|
|
OSD_ID=$(echo "{\"cephx_secret\": \"${OSD_SECRET}\"}" | ceph osd new ${UUID} -i - -n client.bootstrap-osd -k "$OSD_BOOTSTRAP_KEYRING")
|
|
|
|
# test that the OSD_ID is an integer
|
|
if [[ "$OSD_ID" =~ ^-?[0-9]+$ ]]; then
|
|
echo "OSD created with ID: ${OSD_ID}"
|
|
else
|
|
echo "OSD creation failed: ${OSD_ID}"
|
|
exit 1
|
|
fi
|
|
|
|
OSD_PATH="$OSD_PATH_BASE-$OSD_ID/"
|
|
if [ -n "${JOURNAL_DIR}" ]; then
|
|
OSD_JOURNAL="${JOURNAL_DIR}/journal.${OSD_ID}"
|
|
chown -R ceph. ${JOURNAL_DIR}
|
|
else
|
|
if [ -n "${JOURNAL}" ]; then
|
|
OSD_JOURNAL=${JOURNAL}
|
|
chown -R ceph. $(dirname ${JOURNAL_DIR})
|
|
else
|
|
OSD_JOURNAL=${OSD_PATH%/}/journal
|
|
fi
|
|
fi
|
|
# create the folder and own it
|
|
mkdir -p "${OSD_PATH}"
|
|
chown "${CHOWN_OPT[@]}" ceph. "${OSD_PATH}"
|
|
echo "created folder ${OSD_PATH}"
|
|
# write the secret to the osd keyring file
|
|
ceph-authtool --create-keyring ${OSD_PATH%/}/keyring --name osd.${OSD_ID} --add-key ${OSD_SECRET}
|
|
OSD_KEYRING="${OSD_PATH%/}/keyring"
|
|
# init data directory
|
|
ceph-osd -i ${OSD_ID} --mkfs --osd-uuid ${UUID} --mkjournal --osd-journal ${OSD_JOURNAL} --setuser ceph --setgroup ceph
|
|
# add the osd to the crush map
|
|
# NOTE(supamatt): set the initial crush weight of the OSD to 0 to prevent automatic rebalancing
|
|
OSD_WEIGHT=0
|
|
# NOTE(supamatt): add or move the OSD's CRUSH location
|
|
crush_location
|
|
fi
|
|
|
|
# create the directory and an empty Procfile
|
|
mkdir -p /etc/forego/"${CLUSTER}"
|
|
echo "" > /etc/forego/"${CLUSTER}"/Procfile
|
|
|
|
for OSD_ID in $(ls /var/lib/ceph/osd | sed 's/.*-//'); do
|
|
OSD_PATH="$OSD_PATH_BASE-$OSD_ID/"
|
|
OSD_KEYRING="${OSD_PATH%/}/keyring"
|
|
if [ -n "${JOURNAL_DIR}" ]; then
|
|
OSD_JOURNAL="${JOURNAL_DIR}/journal.${OSD_ID}"
|
|
chown -R ceph. ${JOURNAL_DIR}
|
|
else
|
|
if [ -n "${JOURNAL}" ]; then
|
|
OSD_JOURNAL=${JOURNAL}
|
|
chown -R ceph. $(dirname ${JOURNAL_DIR})
|
|
else
|
|
OSD_JOURNAL=${OSD_PATH%/}/journal
|
|
chown ceph. ${OSD_JOURNAL}
|
|
fi
|
|
fi
|
|
# log osd filesystem type
|
|
FS_TYPE=`stat --file-system -c "%T" ${OSD_PATH}`
|
|
echo "OSD $OSD_PATH filesystem type: $FS_TYPE"
|
|
|
|
# NOTE(supamatt): Just in case permissions do not align up, we recursively set them correctly.
|
|
if [ $(stat -c%U ${OSD_PATH}) != ceph ]; then
|
|
chown -R ceph. ${OSD_PATH};
|
|
fi
|
|
|
|
crush_location
|
|
echo "${CLUSTER}-${OSD_ID}: /usr/bin/ceph-osd --cluster ${CLUSTER} -f -i ${OSD_ID} --osd-journal ${OSD_JOURNAL} -k ${OSD_KEYRING}" | tee -a /etc/forego/"${CLUSTER}"/Procfile
|
|
done
|
|
|
|
exec /usr/local/bin/forego start -f /etc/forego/"${CLUSTER}"/Procfile
|