Profile picture

[Shell Script] 오라클 인스턴스 생성 자동화 스크립트

JaehyoJJAng2024년 01월 25일

▶︎ 개요

오라클 무료 계정을 만들고 A1 인스턴스를 생성하려고 하니 Out of host capacity 라는 오류 메시지가 자꾸 뜨면서 생성이 되지 않았다.

찾아보니 오라클에서 무료 계정을 사용하는 유저들이 생성할 수 있는 인스턴스 수를 제한했기 때문이라고 하는데 ..

구글을 찾아보니 인스턴스가 생성이 될 때까지 손으로 노가다하지 않고 스크립트를 돌려서 생성할 수 있는 방법이 하나 있어 기록해보려고 한다.


▶︎ 스크립트

‣ API 키 생성

오라클 클라우드 접속 후 사용자 설정 - API 추가 및 키 다운로드
image


프라이빗 키, 퍼블릭 키 다운로드 후 추가
image

🔑

추가 후 나오는 config 내용과 pem 파일은 추후 테라폼에 기재됨.


‣ 컴퓨트 인스턴스 스택 저장 및 다운로드

원하는 내용으로 이름 / Region / OS / 구성 등을 적용하면 된다.
image image
SSH 키의 경우 공용키 붙여 넣기로 하였다. 따로 키파일 관리를 하지 않아도 되니 편하다.

모든 정보를 입력했으면 생성 버튼이 아닌 "스택으로 저장"을 눌러 해당 내용을 저장하자.


저장 후 스택으로 이동하여 저장된 내용을 다운로드 받자.
image


다운로드 받은 zip 파일을 풀면 main.tf 파일이 나올 것이다.

이 파일을 아까 받은 pem 파일과 같은 경로에 저장하고 보관하도록 하자.

본인의 경우 아래 경로에 pem키와 .tf 파일이 저장되어있다.

$ ls -lh ~/Oracle

-rw-r--r--@ 1 jaehyolee  staff   3.7K  3 22 04:01 main.tf
-rw-r--r--@ 1 jaehyolee  staff   458B  3 22 12:47 yshrim12@naver.com_2024-03-22T03_47_20.626Z_public.pem
-rw-r--r--@ 1 jaehyolee  staff   1.7K  3 22 12:47 yshrim12@naver.com_2024-03-22T03_47_20.701Z.pem

이제 OCI 화면에서 할 작업은 모두 끝났다.


‣ 테라폼 설치


설치하려는 시스템에 맞는 테라폼 zip URL을 확인하여 설치하도록 하자.

본인의 경우 amd ubuntu 22.04에서 설치를 진행하고 있기 때문에 linux amd zip url을 다운로드 받겠다.
image


1. URL을 복사하여 zip 파일을 다운로드 받자.

wget -O amd64.zip https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip

2. 압축 해제 (7zip으로 해제)

$ sudo apt-get install -y p7zip-full
$ 7z x amd64.zip

image


압축 해제 후 나온 terraform/usr/bin 디렉토리로 이동

sudo mv terraform /usr/bin

잘 되는지 확인

$ terraform -v

Terraform v1.7.5
on linux_amd64

‣ main.tf 수정

provider "oci" {
  tenancy_ocid = "ocid1.XXXX"
  user_ocid = "ocid1.XXXX"
  fingerprint = "1f:XX:XXX"
  private_key_path = "/home/dev/Oracle/{PEM 파일명}.pem"
  region = "ap-osaka-1"
}

...

API키 생성할 때 받은 Config 정보를 provider에 기입.


‣ plan 생성

main.tf 수정이 완료 되었다면 terraform plan을 생성해보자.

$ terraform init
$ terraform plan -out="/home/dev/Oracle/oracle.plan"

image


‣ 스크립트 작성

이제 screen 패키지를 설치하고

$ sudo apt-get install -y screen

방금 생성한 oracle.plan을 셸 스크립트로 돌려보자. {% include codeHeader.html name="scripts/autoSet.sh" %}

#!/usr/bin/bash

source /home/$USER/Oracle/sendDiscord.sh

wait="5s"
plan="/home/$USER/Oracle/oracle.plan"
logFile="logs/oracle.log"
tfState="/home/$USER/Oracle/terraform.tfstate"
now="$(date +"%Y-%m-%d %T")"

exec 3>> "$logFile"
if [[ ! -f "$plan" ]]; then
  echo "[$now] $plan이 존재하지 않습니다!" >&3
  exit 1
else
  echo "[$now] $plan" >&3
  echo "[$now] plan Start!" >&3
fi

count=0
while true
do
  (( count ++ ))
  rm -rf "${tfState}"
  terraform apply -auto-approve "$plan"
  if [[ $? != 0 ]]; then
    send_discord_notification "A1 instance $count번째 시도 중 .." "16711680"
    sleep "$wait"
  else
    send_discord_notification "$count번째 만에 Succeeded" "65280"
    echo "[$now] Succeeded" >&3
    exit 0
  fi
done

{% include codeHeader.html name="scripts/sendDiscord.sh" %}

#!/usr/bin/bash

DISCORD_WEBHOOK_URI="$(cat /home/$USER/Oracle/discord/.webhook | awk -F '=' '{print $2}')"
send_discord_notification() {
    local payload=$(cat <<EOF
    {
      "embeds": [{
          "title": "Alarm",
          "description": "$1",
          "color": "$2"
      }]
    }
EOF
)

  curl -H "Content-Type: application/json" -X POST -d "$payload" "$DISCORD_WEBHOOK_URI"
}

실행 권한 부여

chmod u+x autoSet.sh

실행해보자.

screen -s bash /home/dev/Oracle/autoSet.sh

image
이제 등록될 때까지 기다리면 된다 ....


Loading script...