使用 OCI 自动刷 Oracle 实例脚本。
甲骨文的账号越难越申请,升级为付费账号的成功几率也越来越低,再想开出 4C+24G 这样的 ARM 实例已经几乎不可能 (东京、首尔、圣何塞是重灾区),本文教大家利用甲骨文官方的 Oracle Cloud Infrastructure (OCI) 工具定时检测是否有闲置实例,如果有就自动创建,直到创建成功。

邮件提醒
创建名为sendmail.py的文件,添加以下内容:
import smtplib
from email.mime.text import MIMEText
import sys
# === 配置区 ===
SMTP_SERVER = "SMTP 服务器地址"
SMTP_PORT = 端口
SENDER_EMAIL = "发件人邮箱"
AUTH_CODE = "发件人密码"
RECEIVER_EMAIL = "收件人邮箱"
def send_mail(subject, content):
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = SENDER_EMAIL
msg['To'] = RECEIVER_EMAIL
try:
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER_EMAIL, AUTH_CODE)
server.sendmail(SENDER_EMAIL, [RECEIVER_EMAIL], msg.as_string())
server.quit()
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败:{e}")
if __name__ == "__main__":
if len(sys.argv) > 2:
send_mail(sys.argv[1], sys.argv[2])检测 ARM 实例并创建
检测脚本
创建名为reaper.sh的文件,添加以下内容:
#!/bin/bash
# ======================= Oracle 参数配置区 =======================
COMPARTMENT_ID="COMPARTMENT_ID"
AD_NAME="AD_NAME"
SUBNET_ID="SUBNET_ID"
IMAGE_ID="IMAGE_ID"
SSH_KEY_FILE="SSH_KEY_FILE"
# =================================================================
python3 sendmail.py "OCI 脚本提醒" "ARM创建脚本已重启。"
echo "------------------------------------------------"
echo "创建任务开始"
echo "------------------------------------------------"
while true; do
# 执行创建命令
RESPONSE=$(oci compute instance launch \
--availability-domain "$AD_NAME" \
--compartment-id "$COMPARTMENT_ID" \
--shape "VM.Standard.A1.Flex" \
--shape-config '{"ocpus": 4, "memoryInGB": 24}' \
--assign-public-ip true \
--image-id "$IMAGE_ID" \
--subnet-id "$SUBNET_ID" \
--ssh-authorized-keys-file "$SSH_KEY_FILE" 2>&1)
# 1. 成功捕获到实例 OCID
if [[ $RESPONSE == *"ocid1.instance"* ]]; then
echo "$(date): [SUCCESS] 实例创建成功!"
python3 sendmail.py "【成功】Oracle ARM 已开通" "恭喜!4核24G 实例已成功创建。详情如下:\n\n$RESPONSE"
break
# 2. 无库存 (500 或 Out of host capacity)
elif [[ $RESPONSE == *"Out of host capacity"* ]] || [[ $RESPONSE == *"InternalError"* ]]; then
echo "$(date): 暂无库存,持续监控中..."
# 3. 重点:处理 429 Too Many Requests
elif [[ $RESPONSE == *"Too many requests"* ]] || [[ $RESPONSE == *"429"* ]]; then
echo "$(date): [WARN] 触发频率限制(429)。暂停15分钟..."
# 频率限制时发送警告信
python3 sendmail.py "【警告】触发 429 频率限制" "检测到频率超限,脚本将暂停15分钟以保护账号安全。"
sleep 900
# 4. 其他致命错误
else
echo "$(date): [ERROR] 遇到异常:$RESPONSE"
python3 sendmail.py "【停止】脚本异常" "脚本遇到非预期错误已停止运行:\n\n$RESPONSE"
exit 1
fi
# 随机创建时间间隔为 240 到 360 秒(4-6 分钟)
SLEEP_TIME=$(( ( RANDOM % 120 ) + 240 ))
echo "下一轮尝试将在 $SLEEP_TIME 秒后进行..."
sleep $SLEEP_TIME
done脚本参数
脚本中顶部的五个参数必须设置,如果不完整设置,无法创建成功。
COMPARTMENT_ID Oracle Cloud 后台 - 用户设置 - 区间 - 租户 - 详细信息。显示的 OCID 就是值,前缀是ocid1.tenancy。
AD_NAME 在你账号权限范围内可申请的区域名称,比如首尔是saBi:AP-SEOUL-1-AD-1。
SUBNET_ID Oracle Cloud 后台 - 网络 - 虚拟云网络 - 子网 - 公共子网 - 详细信息。显示的 OCID 就是值,前缀是ocid1.subnet。
IMAGE_ID 点击此处找到对应的区域和系统映像的值,ARM 必须用aarch64的映像。
SSH_KEY_FILE SSH KEY 文件。
备注:
1、将
sendmail.py reaper.sh ssh-authorized-keys-file放置在相同的目录,方便管理。2、此脚本运行的前提是已经安装并配置好 OCI CLI,点击此处查看对应系统的安装命令。
3、为避免 429 错误,我将间隔时间设定到了 4-6 分钟,如果是已升级的付费号,可以将间隔时间缩短。
4、使用
nohup ./reaper.sh > oci_log.txt 2>&1 &让脚本在后台自动运行,使用tail -f oci_log.txt查看日志。5、使用
ps -ef | grep reaper.sh检查进程,使用pkill -f reaper.sh关闭进程。6、可以在脚本中自定义 CPU 核心数和内存大小(1C+6G 2C+12G 3C+18G 4C+24G),支持 AMD 实例,需自己修改。


评论