OpenStack 볼륨 스냅샷 해결: Ceph RBD 이미지 삭제 및 풀 회수

💡 핵심 요약 (Executive Summary)

본 가이드는 bash ceph rbd image delete 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Reference & Guidelines (NOTE)

개선가능점: Child, Snap, Watcher 2개 이상인 경우를 위하여 for문으로 변경

ceph-mon01:/root/deleteImage.sh

V3
bash
#!/bin/bash

# v3.0
# 개선점: 멀티라인 파일 인풋, Image validation 추가
# Created By mh.kim2

VOLUME_IDS="$(cat v3-param.txt | sed -z 's/[\n\r]/ /g')"
if [ -z "$VOLUME_IDS" ]; then
        echo "==========it needs params========="
        exit 1
fi
echo "==========success========="
POOL="volumes"
IMAGE_PREFIX="volume-"

for VOLUME_ID in ${VOLUME_IDS[@]};
do
        IMAGE="${POOL}/${IMAGE_PREFIX}${VOLUME_ID}"
        echo "Image: $IMAGE"
        if [ "$(rbd ls -p $POOL | grep "${IMAGE_PREFIX}${VOLUME_ID}")" ]; then
                echo "==========has image========="
#                while true; do
#                        read -p "Do you wish to delete this Image? (y/n)" yn
#                        case $yn in
#                                [Yy]* ) PASS="0"; break;;
#                                [Nn]* ) PASS="1"; break;;
#                                * ) echo "Please answer y or n.";;
#                        esac
#                done
#                if [[ ${PASS} == "1" ]]; then
#                        continue
#                fi
        else
                echo "==========hasn't image, is stopped========="
                continue
        fi

        CHILD_IMAGES=$(rbd children $IMAGE | sed -z 's/[\n\r]/ /g')
        if [ $CHILD_IMAGES ]; then
                echo "==========has child========="
                for CHILD_IMAGE in ${CHILD_IMAGES[@]};
                do
                        echo "Child Image: $CHILD_IMAGE"
                        rbd flatten $CHILD_IMAGE
                done
        else
                echo "==========hasn't child========="
        fi

        SNAPS=$(rbd snap ls $IMAGE | grep -v 'NAME' | awk '{print $2}' | sed -z 's/[\n\r]/ /g')
        if [ $SNAPS ]; then
                echo "==========has snap========="
                for SNAP in ${SNAPS[@]};
                do
                        echo "Snapshot: $SNAP"
                        rbd snap unprotect --image $IMAGE --snap $SNAP
                        rbd snap purge $IMAGE
                done
        else
                echo "==========hasn't snap========="
        fi

        WATCHERS=$(rbd status $IMAGE | grep -v 'Watchers' | awk '{print $1}' | sed 's/watcher=//g' | sed -z 's/[\n\r]/ /g')
        if [ $WATCHERS ]; then
                echo "==========has watcher========="
                for WATCHER in ${WATCHERS[@]};
                do
                        echo "Watcher: $WATCHER"
                        ceph osd blacklist add $WATCHER
                done
        else
                echo "==========hasn't watcher========="
        fi

        rbd rm $IMAGE

        if [ $WATCHERS ]; then
                for WATCHER in ${WATCHERS[@]};
                do
                        ceph osd blacklist rm $WATCHER
                done
        fi
done
V2
bash
#!/bin/bash

# v2.0
# 개선점: Child, Snap, Watcher 2개 이상일 경우 처리 -> for문으로 변경
# Created By mh.kim2

POOL="volumes"
IMAGE_PREFIX="volume-"

IMAGE="${POOL}/${IMAGE_PREFIX}${1}"

if [ -z ${1} ]; then
        echo "==========it needs params========="
        exit 1
fi
echo "==========success========="
echo "Image: $IMAGE"

CHILD_IMAGES=$(rbd children $IMAGE | sed -z 's/[\n\r]/ /g')
if [ $CHILD_IMAGES ]; then
        for CHILD_IMAGE in ${CHILD_IMAGES[@]};
        do
                echo "==========has child========="
                echo "Child Image: $CHILD_IMAGE"
                rbd flatten $CHILD_IMAGE
        done
fi

SNAPS=$(rbd snap ls $IMAGE | grep -v 'NAME' | awk '{print $2}' | sed -z 's/[\n\r]/ /g')
if [ $SNAPS ]; then
        for SNAP in ${SNAPS[@]};
        do
                echo "==========has snap========="
                echo "Snapshot: $SNAP"
                rbd snap unprotect --image $IMAGE --snap $SNAP
                rbd snap purge $IMAGE
        done
fi

WATCHERS=$(rbd status $IMAGE | grep -v 'Watchers' | awk '{print $1}' | sed 's/watcher=//g' | sed -z 's/[\n\r]/ /g')
if [ $WATCHERS ]; then
        for WATCHER in ${WATCHERS[@]};
        do
                echo "==========has watcher========="
                echo "Watcher: $WATCHER"
                ceph osd blacklist add $WATCHER
        done
fi

rbd rm $IMAGE

if [ $WATCHERS ]; then
        for WATCHER in ${WATCHERS[@]};
        do
                ceph osd blacklist rm $WATCHER
        done
fi
V1
bash
#!/bin/bash

# v1.0
# Created By mh.kim2

POOL="volumes"
IMAGE_PREFIX="volume-"

IMAGE="${POOL}/${IMAGE_PREFIX}${1}"

if [ -z ${1} ]; then
        echo "==========it needs params========="
        exit 1
fi
echo "==========success========="
echo "Image: $IMAGE"

CHILD_IMAGE=$(rbd children $IMAGE)
if [ $CHILD_IMAGE ]; then
        echo "==========has child========="
        echo "Child Image: $CHILD_IMAGE"
        rbd flatten $CHILD_IMAGE
fi
SNAP=$(rbd snap ls $IMAGE | grep -v 'NAME' | awk '{print $2}')
if [ $SNAP ]; then
        echo "==========has snap========="
        echo "Snapshot: $SNAP"
        rbd snap unprotect --image $IMAGE --snap $SNAP
        rbd snap purge $IMAGE
fi
WATCHER=$(rbd status $IMAGE | grep -v 'Watchers' | awk '{print $1}' | sed 's/watcher=//g')
if [ $WATCHER ]; then
        echo "==========has watcher========="
        echo "Watcher: $WATCHER"
        ceph osd blacklist add $WATCHER
fi
rbd rm $IMAGE
if [ $WATCHER ]; then
        ceph osd blacklist rm $WATCHER
fi

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *