Skip to content

Instantly share code, notes, and snippets.

@stvnwrgs
Last active October 6, 2020 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stvnwrgs/fbc18d42af25c182e450f7b555a635ac to your computer and use it in GitHub Desktop.
Save stvnwrgs/fbc18d42af25c182e450f7b555a635ac to your computer and use it in GitHub Desktop.
A little script that automatically resizes a gce disk and the partition on the disk.

Google Cloud Bash Scripts

This little script is used to resize and repartition disks in GKE.

Requirements

  • gcloud

Disk Resizer

Usage

Configure gcloud if you haven't yet. You also need to define a zone inside your config.

./dke-disk-resizer <diskName> <newDiskSizeInGb>

Example: ./dke-disk-resizer my-disk 500

You can also use it directly without saving: curl -s -L http://bit.ly/2oTgiwP | bash /dev/stdin <diskName> <diskSize>

Clone VM to other Project

#! /bin/bash
#
# Script to clone a vm to another project by creating a snapshot, a new disk and a new vm.
# does only copy the bootdisk
# check below for parameters
SOURCE_PROJECT=$1
SOURCE_ZONE=$2
SOURCE_VM_NAME=$3
TARGET_PROJECT=$4
TARGET_ZONE=$5
TARGET_VM_NAME=${6:SOURCE_VM_NAME}
random-string()
{
cat /dev/urandom | tr -dc 'a-z0-9' | fold -w ${1:-5} | head -n 1
}
SOURCE_MACHINE_SETTINGS=$(gcloud --project=$SOURCE_PROJECT compute instances list --filter="name=($SOURCE_VM_NAME)" --zones=$SOURCE_ZONE --format=json)
SOURCE_DISK_NAME=$(echo $SOURCE_MACHINE_SETTINGS|jq -r '.[0].disks[0].deviceName')
MACHINE_TYPE=$(echo $SOURCE_MACHINE_SETTINGS|jq -r '.[0].machineType')
echo "Found source disk: $SOURCE_DISK_NAME"
SNAPSHOT_NAME="$SOURCE_DISK_NAME-$(date --iso-8601)-$(random-string)"
echo "Creating snapshot: $SNAPSHOT_NAME"
# create snapshot
gcloud --project=$SOURCE_PROJECT compute disks snapshot $SOURCE_DISK_NAME --zone=$SOURCE_ZONE --snapshot-names $SNAPSHOT_NAME
# get snapshot settings
SOURCE_SNAPSHOT_PATH=$(gcloud --project=$SOURCE_PROJECT compute snapshots list --filter="name=($SNAPSHOT_NAME)" --format=json |jq -r '.[0].selfLink')
#create disk from snapshot in other project
echo "Creating new disk in project=$TARGET_PROJECT from snapshot: $SNAPSHOT_NAME. This can take a while..."
gcloud compute disks create $SOURCE_DISK_NAME --source-snapshot="$SOURCE_SNAPSHOT_PATH" --project=$TARGET_PROJECT --zone=$TARGET_ZONE
echo "Spinning up vm with new disk..."
gcloud --project=$TARGET_PROJECT compute instances create --zone=$TARGET_ZONE --boot-disk-device-name=$SOURCE_DISK_NAME --machine-type=$MACHINE_TYPE
# delete snapshot
echo "You can delete the snapshot now"
gcloud --project=$SOURCE_PROJECT compute snapshots delete $SNAPSHOT_NAME
#! /bin/bash
#
# Usage:
# ./gke-disk-resizer <diskName> <newDiskSize>
#
# gcloud must be configured to the right project and must have a zone specified!
#
set -e
DISK_NAME=$1
DISK_SIZE=$2
ZONE=$(gcloud config get-value compute/zone)
PROJECT=$(gcloud config get-value project)
NODE_NAME=$(gcloud compute disks list --filter "selfLink=https://www.googleapis.com/compute/v1/projects/${PROJECT}/zones/${ZONE}/disks/${DISK_NAME}" --format flattened |grep users | awk '{print $2}' | awk -F'/' '{print $(NF)}')
echo "Disk ${DISK_NAME} is attached to node ${NODE_NAME}"
echo "Resizing disk ..."
gcloud compute disks resize ${DISK_NAME} --size ${DISK_SIZE}
DEV=$(gcloud compute ssh ${NODE_NAME} --command="sudo df -h |grep ${DISK_NAME} ")
DEV=$(echo ${DEV}| awk '{print $1}')
echo "Device is: ${DEV}"
echo "Resizing partition"
gcloud compute ssh ${NODE_NAME} --command="sudo resize2fs ${DEV}"
gcloud compute ssh ${NODE_NAME} --command="sudo df -h | grep ${DISK_NAME}"
echo "Done"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment