Created
April 26, 2022 13:49
-
-
Save futuretea/bc377d125ee751b3cf88418210ecbe89 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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