loader image

【bash】久しぶりにshell script書いてめんどくさかった事

概要

GCP 上のVMを一括起動/停止し、既に起動/停止済のVMがあったら注意喚起するshellを書いた際にブランクが1年くらいあって忘れてる事が多かったので備忘録を残す。

仕様

  1. 引数にstartかstopを指定して起動と停止を分岐する。
  2. 適切な引数がない場合はエラーメッセージを返す。
  3. 対象VMが既に起動/停止している場合は注意喚起のメッセージを出力する。

ソース

#!/bin/bash
#対象VM
VMs=' #←変数と=の間にスペースを入れると正しく動作しない
GCP_project1.VM1.ZONE1
GCP_project2.VM2.ZONE2
etc...
'
#引数がstartの場合の処理
if [ $1 = "start" ] ; then #←[]内のスペースを空けないとコマンドとして認識される
  for gce in $VMs #←for文はpythonと一緒
  do
    pj=`echo $gce | cut -d "." -f 1`
    vm=`echo $gce | cut -d "." -f 2`
    zone=`echo $gce | cut -d "." -f 3`
    #↓コマンドとして認識させたい時は`(バッククォート)を使う
    status=`gcloud compute instances describe --project=$pj $vm --zone=$zone | \
    grep "status:" | tr -d " " | cut -d ":" -f 2`
    if [ $status = "TERMINATED" ] ; then
      gcloud compute instances start --project=$pj $vm --zone=$zone
    else
      #↓出力する文字色を変えたい時は-eオプションでコードを入れる(31は赤)
      echo -e"\e[31m$pj.$vm は既に起動済みです。起動した人と連絡をとって停止して下さい。"
    fi
  done
#引数がstopの場合の処理
elif [ $1 = "stop" ] ; then
  for gce in $VMs
  do
    pj=`echo $gce | cut -d "." -f 1`
    vm=`echo $gce | cut -d "." -f 2`
    zone=`echo $gce | cut -d "." -f 3`
    status=`gcloud compute instances describe --project=$pj $vm --zone=$zone | \
    grep "status:" | tr -d " " | cut -d ":" -f 2`
    if [ $status = "RUNNING" ] ; then
      gcloud compute instances stop --project=$pj $vm --zone=$zone
    else
      echo -e "\e[31m$pj.$vm は既に停止済みです。"
    fi
  done
#引数がstart , stop 以外の処理
else #←elseに ;(セミコロン)はいらない
  echo "start か stop を引数で渡してください。"
fi

コメント

タイトルとURLをコピーしました