Skip to content

Instantly share code, notes, and snippets.

@futuretea
Created April 26, 2022 13:49
Show Gist options
  • Save futuretea/bc377d125ee751b3cf88418210ecbe89 to your computer and use it in GitHub Desktop.
Save futuretea/bc377d125ee751b3cf88418210ecbe89 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
[[ -n "$DEBUG" ]] && set -x
set -eou pipefail
usage() {
cat <<HELP
USAGE:
export-openstack-volume VOLUME_ID [CLEAN]
HELP
}
if [ $# -lt 1 ]; then
usage
exit 1
fi
VOLUME_ID=$1
CLEAN=${2:-"true"}
TIMESTAMP=$(date +%s)
NEW_VOLUME_ID=""
# 获取卷的信息
VOLUME_INFO=$(openstack volume show "${VOLUME_ID}" -f json)
VOLUME_STATUS=$(echo "${VOLUME_INFO}" | jq -r '.status')
case "${VOLUME_STATUS}" in
"available")
# 如果卷不被使用,则不需要创建备份
AVAILABLE_VOLUME_NAME=$(echo "${VOLUME_INFO}" | jq -r '.name')
;;
"in-use")
# 如果卷在被使用中,则需要先通过快照复制一份
# 从卷创建快照
echo "create snapshot"
SNAPSHOT_NAME="${VOLUME_ID}-snapshot-${TIMESTAMP}"
SNAPSHOT_ID=$(openstack volume snapshot create --volume "${VOLUME_ID}" --force "${SNAPSHOT_NAME}" -f json | jq -r '.id')
echo "snapshot id: ${SNAPSHOT_ID}"
# 等待就绪
while true
do
STATUS=$(openstack volume snapshot show "${SNAPSHOT_ID}" -f json | jq -r '.status')
if [ "${STATUS}" == "available" ];then
break
fi
echo "waiting snapshot become ready ..."
sleep 3
done
# 从快照创建新的卷
echo "create volume from snapshot"
NEW_VOLUME_SIZE=$(echo "${VOLUME_INFO}" | jq -r '.size')
NEW_VOLUME_NAME="${VOLUME_ID}-copy-${TIMESTAMP}"
NEW_VOLUME_ID=$(openstack volume create --snapshot "${SNAPSHOT_ID}" --size "${NEW_VOLUME_SIZE}" "${NEW_VOLUME_NAME}" -f json | jq -r '.id')
echo "new volume name: ${NEW_VOLUME_NAME}"
echo "new volume id: ${NEW_VOLUME_ID}"
echo "new volume size: ${NEW_VOLUME_SIZE}"
# 等待就绪
while true
do
STATUS=$(openstack volume show "${NEW_VOLUME_ID}" -f json | jq -r '.status')
if [ "${STATUS}" == "available" ];then
break
fi
echo "waiting volume become ready ..."
sleep 3
done
AVAILABLE_VOLUME_NAME="${NEW_VOLUME_NAME}"
# 删除快照
if [ ${CLEAN} != "false" ];then
echo "delete snapshot: ${SNAPSHOT_ID}"
openstack volume snapshot delete "${SNAPSHOT_ID}"
fi
;;
"*")
echo "unknown volume status: ${VOLUME_STATUS}"
exit 1
;;
esac
# 从卷创建镜像
echo "create image from volume"
IMAGE_NAME="${VOLUME_ID}-image-${TIMESTAMP}"
IMAGE_ID=$(openstack image create --disk-format qcow2 --volume "${AVAILABLE_VOLUME_NAME}" "${IMAGE_NAME}" -f json | jq -r '.id')
echo "volume name: ${AVAILABLE_VOLUME_NAME}"
echo "new image name: ${IMAGE_NAME}"
echo "new image id: ${IMAGE_ID}"
# 等待就绪
while true
do
STATUS=$(openstack image show "${IMAGE_NAME}" -f json | jq -r '.status')
if [ "${STATUS}" == "active" ];then
break
fi
echo "waiting image become ready ..."
sleep 3
done
# 删除复制的卷
if [ "${NEW_VOLUME_ID}" != "" ] && [ ${CLEAN} != "false" ]; then
echo "delete the volume created from snapshot: ${NEW_VOLUME_ID}"
openstack volume delete "${NEW_VOLUME_ID}"
fi
# 下载镜像文件
echo "download image file"
IMAGE_FILE="${IMAGE_NAME}.qcow2"
openstack image save --file "${IMAGE_FILE}" "${IMAGE_NAME}"
echo "image file: ${IMAGE_FILE}"
# 删除镜像
if [ ${CLEAN} != "false" ];then
echo "delete image: ${IMAGE_NAME}"
openstack image delete "${IMAGE_NAME}"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment