2022-03-18 17:41:43 +00:00
|
|
|
#!/bin/bash
|
2018-07-07 17:34:56 +00:00
|
|
|
#
|
|
|
|
# Copyright (C) 2013,2014 Loic Dachary <loic@dachary.org>
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU Affero General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
set -e
|
|
|
|
set -x
|
|
|
|
set -u
|
|
|
|
|
|
|
|
DIR=${1}
|
|
|
|
|
|
|
|
# reset
|
|
|
|
pkill ceph || true
|
2022-03-18 17:41:43 +00:00
|
|
|
rm -rf "${DIR:?}"/*
|
|
|
|
LOG_DIR="${DIR}/log"
|
|
|
|
MON_DATA="${DIR}/mon"
|
|
|
|
MDS_DATA="${DIR}/mds"
|
|
|
|
MOUNTPT="${MDS_DATA}/mnt"
|
|
|
|
OSD_DATA="${DIR}/osd"
|
|
|
|
RGW_DATA="${DIR}/radosgw"
|
|
|
|
mkdir "${LOG_DIR}" "${MON_DATA}" "${OSD_DATA}" "${MDS_DATA}" "${MOUNTPT}" "${RGW_DATA}"
|
2018-10-10 03:56:52 +00:00
|
|
|
MDS_NAME="Z"
|
2023-02-06 19:26:41 +00:00
|
|
|
FS_NAME="cephfs"
|
|
|
|
ALT_MDS_NAME="Y"
|
|
|
|
ALT_FS_NAME="altfs"
|
2018-10-10 22:06:47 +00:00
|
|
|
MON_NAME="a"
|
|
|
|
MGR_NAME="x"
|
2021-03-03 17:06:01 +00:00
|
|
|
MIRROR_ID="m"
|
2021-05-12 12:38:18 +00:00
|
|
|
RGW_ID="r"
|
2018-07-07 17:34:56 +00:00
|
|
|
|
2023-12-08 06:00:26 +00:00
|
|
|
# Following are examples for S3 credentials taken from official AWS docs:
|
|
|
|
# https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html#access-keys-and-secret-access-keys
|
|
|
|
# These does not represent real/valid credentials for AWS in any form.
|
|
|
|
# They are exclusively used for testing S3 compatible API from Ceph RGW.
|
|
|
|
S3_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE
|
|
|
|
S3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
|
|
|
|
|
|
|
HOST_IP=$(getent ahostsv4 "${HOSTNAME}" | grep STREAM | head -n 1 | awk '{print $1}')
|
2022-03-18 17:25:06 +00:00
|
|
|
FSID="$(uuidgen)"
|
|
|
|
export CEPH_CONF=${DIR}/ceph.conf
|
|
|
|
|
|
|
|
generate_ceph_conf() {
|
|
|
|
# cluster wide parameters
|
|
|
|
cat >> "${CEPH_CONF}" <<EOF
|
2018-07-07 17:34:56 +00:00
|
|
|
[global]
|
2022-03-18 17:25:06 +00:00
|
|
|
fsid = ${FSID}
|
2018-07-07 17:34:56 +00:00
|
|
|
osd crush chooseleaf type = 0
|
|
|
|
run dir = ${DIR}/run
|
|
|
|
auth cluster required = none
|
|
|
|
auth service required = none
|
|
|
|
auth client required = none
|
|
|
|
osd pool default size = 1
|
2021-03-03 17:06:01 +00:00
|
|
|
mon host = ${HOSTNAME}
|
2018-07-07 17:34:56 +00:00
|
|
|
|
2018-10-10 03:56:52 +00:00
|
|
|
[mds.${MDS_NAME}]
|
2021-03-03 17:06:01 +00:00
|
|
|
host = ${HOSTNAME}
|
2018-10-10 03:56:52 +00:00
|
|
|
|
2018-10-10 22:06:47 +00:00
|
|
|
[mon.${MON_NAME}]
|
2018-07-07 17:34:56 +00:00
|
|
|
log file = ${LOG_DIR}/mon.log
|
|
|
|
chdir = ""
|
|
|
|
mon cluster log file = ${LOG_DIR}/mon-cluster.log
|
|
|
|
mon data = ${MON_DATA}
|
2020-07-26 20:31:58 +00:00
|
|
|
mon data avail crit = 0
|
2023-04-25 04:10:31 +00:00
|
|
|
mon addr = ${HOST_IP}:6789
|
2018-07-07 17:34:56 +00:00
|
|
|
mon allow pool delete = true
|
|
|
|
|
|
|
|
[osd.0]
|
|
|
|
log file = ${LOG_DIR}/osd.log
|
|
|
|
chdir = ""
|
|
|
|
osd data = ${OSD_DATA}
|
|
|
|
osd journal = ${OSD_DATA}.journal
|
|
|
|
osd journal size = 100
|
|
|
|
osd objectstore = memstore
|
|
|
|
osd class load list = *
|
|
|
|
osd class default list = *
|
2021-05-12 12:38:18 +00:00
|
|
|
|
2022-03-10 19:48:55 +00:00
|
|
|
[mgr.${MGR_NAME}]
|
|
|
|
log_file = ${LOG_DIR}/mgr.log
|
|
|
|
|
2021-05-12 12:38:18 +00:00
|
|
|
[client.rgw.${RGW_ID}]
|
|
|
|
rgw dns name = ${HOSTNAME}
|
|
|
|
rgw enable usage log = true
|
|
|
|
rgw usage log tick interval = 1
|
|
|
|
rgw usage log flush threshold = 1
|
|
|
|
rgw usage max shards = 32
|
|
|
|
rgw usage max user shards = 1
|
2022-03-18 18:05:08 +00:00
|
|
|
log file = ${LOG_DIR}/client.rgw.${RGW_ID}.log
|
2021-05-12 12:38:18 +00:00
|
|
|
rgw frontends = beast port=80
|
2022-03-18 18:14:16 +00:00
|
|
|
ms mon client mode = crc
|
2018-07-07 17:34:56 +00:00
|
|
|
EOF
|
2022-03-18 17:25:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
launch_mon() {
|
|
|
|
ceph-mon --id ${MON_NAME} --mkfs --keyring /dev/null
|
2022-03-18 17:41:43 +00:00
|
|
|
touch "${MON_DATA}/keyring"
|
2022-03-18 17:25:06 +00:00
|
|
|
ceph-mon --id ${MON_NAME}
|
|
|
|
}
|
|
|
|
|
|
|
|
launch_osd() {
|
|
|
|
OSD_ID=$(ceph osd create)
|
2022-03-18 17:41:43 +00:00
|
|
|
ceph osd crush add "osd.${OSD_ID}" 1 root=default
|
|
|
|
ceph-osd --id "${OSD_ID}" --mkjournal --mkfs
|
|
|
|
ceph-osd --id "${OSD_ID}" || ceph-osd --id "${OSD_ID}" || ceph-osd --id "${OSD_ID}"
|
2022-03-18 17:25:06 +00:00
|
|
|
}
|
|
|
|
|
2023-02-06 19:26:41 +00:00
|
|
|
launch_mds_server() {
|
|
|
|
local mds="$1"
|
|
|
|
local fs="$2"
|
|
|
|
|
|
|
|
ceph auth get-or-create "mds.${mds}" mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' >> "${MDS_DATA}/keyring"
|
|
|
|
ceph osd pool create "${fs}_data" 8
|
|
|
|
ceph osd pool create "${fs}_metadata" 8
|
|
|
|
ceph fs new "${fs}" "${fs}_metadata" "${fs}_data"
|
2022-03-18 17:25:06 +00:00
|
|
|
ceph fs ls
|
2023-02-06 19:26:41 +00:00
|
|
|
ceph-mds -i "${mds}"
|
2022-03-18 17:25:06 +00:00
|
|
|
ceph status
|
2022-03-18 17:41:43 +00:00
|
|
|
while ! ceph mds stat | grep -q "up:active"; do sleep 1; done
|
2023-02-06 19:26:41 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
launch_mds() {
|
|
|
|
launch_mds_server "${MDS_NAME}" "${FS_NAME}"
|
|
|
|
}
|
|
|
|
|
|
|
|
launch_mds2() {
|
|
|
|
launch_mds_server "${ALT_MDS_NAME}" "${ALT_FS_NAME}"
|
|
|
|
echo "${ALT_FS_NAME}" > "${DIR}/altfs.txt"
|
2022-03-18 17:25:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
launch_mgr() {
|
|
|
|
ceph-mgr --id ${MGR_NAME}
|
|
|
|
}
|
|
|
|
|
|
|
|
launch_rbd_mirror() {
|
|
|
|
ceph auth get-or-create client.rbd-mirror.${MIRROR_ID} mon 'profile rbd-mirror' osd 'profile rbd'
|
2022-03-18 17:41:43 +00:00
|
|
|
rbd-mirror --id ${MIRROR_ID} --log-file "${LOG_DIR}/rbd-mirror.log"
|
2022-03-18 17:25:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
launch_cephfs_mirror() {
|
|
|
|
ceph auth get-or-create "client.cephfs-mirror.${MIRROR_ID}" \
|
|
|
|
mon 'profile cephfs-mirror' \
|
|
|
|
mds 'allow r' \
|
|
|
|
osd 'allow rw tag cephfs metadata=*, allow r tag cephfs data=*' \
|
|
|
|
mgr 'allow r'
|
|
|
|
cephfs-mirror --id "cephfs-mirror.${MIRROR_ID}" \
|
|
|
|
--log-file "${LOG_DIR}/cephfs-mirror.log"
|
|
|
|
ceph fs authorize cephfs client.cephfs-mirror-remote / rwps > "${DIR}/cephfs-mirror-remote.out"
|
|
|
|
# the .out file above is not used by the scripts but can be used for debugging
|
|
|
|
}
|
|
|
|
|
|
|
|
launch_radosgw() {
|
2022-03-18 17:41:43 +00:00
|
|
|
ceph auth get-or-create client.rgw."${RGW_ID}" osd 'allow rwx' mon 'allow rw' -o "${RGW_DATA}/keyring"
|
|
|
|
radosgw -n client.rgw."${RGW_ID}" -k "${RGW_DATA}/keyring"
|
|
|
|
# not going to try to make shellcheck happy with this line at this time
|
|
|
|
# shellcheck disable=SC2016
|
2022-03-18 17:25:06 +00:00
|
|
|
timeout 60 sh -c 'until [ $(ceph -s | grep -c "rgw:") -eq 1 ]; do echo "waiting for rgw to show up" && sleep 1; done'
|
|
|
|
radosgw-admin user create --uid admin --display-name "Admin User" --caps "buckets=*;users=*;usage=read;metadata=read" --access-key="$S3_ACCESS_KEY" --secret-key="$S3_SECRET_KEY"
|
|
|
|
}
|
|
|
|
|
2023-10-26 14:46:47 +00:00
|
|
|
launch_radosgw2() {
|
|
|
|
radosgw-admin caps add --uid=admin --caps="info=read"
|
|
|
|
}
|
|
|
|
|
2022-03-18 17:25:06 +00:00
|
|
|
selftest() {
|
|
|
|
ceph --version
|
|
|
|
ceph status
|
|
|
|
test_pool=$(uuidgen)
|
|
|
|
temp_file=$(mktemp)
|
2022-03-18 17:41:43 +00:00
|
|
|
ceph osd pool create "${test_pool}" 0
|
|
|
|
rados --pool "${test_pool}" put group /etc/group
|
|
|
|
rados --pool "${test_pool}" get group "${temp_file}"
|
|
|
|
diff /etc/group "${temp_file}"
|
|
|
|
ceph osd pool delete "${test_pool}" "${test_pool}" --yes-i-really-really-mean-it
|
|
|
|
rm "${temp_file}"
|
2022-03-18 17:25:06 +00:00
|
|
|
}
|
|
|
|
|
2022-03-18 17:41:43 +00:00
|
|
|
FEATURESET="${CEPH_FEATURESET-}"
|
2022-03-18 17:25:06 +00:00
|
|
|
if [ -z "$FEATURESET" ] ; then
|
2022-03-18 17:41:43 +00:00
|
|
|
case "${CEPH_VERSION-}" in
|
2022-03-18 17:25:06 +00:00
|
|
|
nautilus|octopus)
|
|
|
|
FEATURESET="mon osd mgr mds rbd-mirror rgw selftest"
|
|
|
|
;;
|
2023-10-26 14:46:47 +00:00
|
|
|
pacific)
|
2023-02-06 19:26:41 +00:00
|
|
|
FEATURESET="mon osd mgr mds mds2 rbd-mirror cephfs-mirror rgw selftest"
|
2022-03-18 17:25:06 +00:00
|
|
|
;;
|
2023-10-26 14:46:47 +00:00
|
|
|
*)
|
|
|
|
FEATURESET="mon osd mgr mds mds2 rbd-mirror cephfs-mirror rgw rgw2 selftest"
|
|
|
|
;;
|
2022-03-18 17:25:06 +00:00
|
|
|
esac
|
|
|
|
fi
|
|
|
|
|
|
|
|
generate_ceph_conf
|
2022-03-18 17:41:43 +00:00
|
|
|
for fname in ${FEATURESET} ; do
|
2022-03-18 17:25:06 +00:00
|
|
|
case "${fname}" in
|
|
|
|
mon) launch_mon ;;
|
|
|
|
osd) launch_osd ;;
|
|
|
|
mds) launch_mds ;;
|
2023-02-06 19:26:41 +00:00
|
|
|
mds2) launch_mds2 ;;
|
2022-03-18 17:25:06 +00:00
|
|
|
mgr) launch_mgr ;;
|
|
|
|
rbd-mirror) launch_rbd_mirror ;;
|
|
|
|
cephfs-mirror) launch_cephfs_mirror ;;
|
|
|
|
rgw|radosgw) launch_radosgw ;;
|
2023-10-26 14:46:47 +00:00
|
|
|
rgw2|radosgw2) launch_radosgw2 ;;
|
2022-03-18 17:25:06 +00:00
|
|
|
selftest) selftest ;;
|
|
|
|
*)
|
|
|
|
echo "Invalid feature: ${fname}"
|
|
|
|
exit 2
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
2021-03-03 17:06:01 +00:00
|
|
|
|
2022-03-18 17:41:43 +00:00
|
|
|
touch "${DIR}/.ready"
|
2021-05-10 16:00:58 +00:00
|
|
|
|
|
|
|
# vim: set ts=4 sw=4 sts=4 et:
|