-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate_oracle_arm_instance.sh
More file actions
190 lines (153 loc) · 7.25 KB
/
create_oracle_arm_instance.sh
File metadata and controls
190 lines (153 loc) · 7.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/bin/bash
# Script para criar instância ARM gratuita no Oracle Cloud
# Baseado no projeto original: https://github.com/HotNoob/Oracle-Free-Arm-VPS-PS
# Convertido de PowerShell para Bash para uso no Linux
# --- INSTRUÇÕES ---
# 1. Instale a CLI do OCI: https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm
# 2. Configure a CLI com suas chaves de API: execute `oci setup config` e siga as instruções.
# Isso criará o arquivo ~/.oci/config e as chaves de API.
# 3. Adicione a chave de API pública na sua conta da Oracle Cloud (em Identity & Security -> Users -> seu usuário -> API Keys).
# 4. Preencha as variáveis na seção "CONFIGURAÇÕES" abaixo.
# 5. Para obter os IDs necessários (Imagem, Subnet, etc.), altere SETUP=1 e execute o script.
# Ele listará as opções disponíveis na sua conta. Copie os valores e cole nas variáveis.
# 6. Após configurar tudo, altere SETUP=0 e execute o script para iniciar as tentativas.
# --- CONFIGURAÇÕES ---
# ID da tenância da sua conta (Tenancy OCID)
# Encontre em: Perfil -> Tenancy -> OCID
TENANCY_ID="ocid1.tenancy.oc1..aaaaaaaa[SEU_TENANCY_ID_AQUI]"
# ID do Compartimento onde a instância e a rede estão localizadas.
# Se for o compartimento principal (root), pode ser o mesmo que o TENANCY_ID.
# Caso contrário, encontre o OCID do compartimento específico.
COMPARTMENT_ID="ocid1.tenancy.oc1..aaaaaaaa[SEU_COMPARTMENT_ID_AQUI]"
# ID da Imagem (Image OCID) - Deve ser uma imagem ARM (aarch64)
# Ex: Canonical-Ubuntu-22.04-aarch64-2024.05.29-0
IMAGE_ID="ocid1.image.oc1.[SUA_REGIAO].[SEU_IMAGE_ID_AQUI]"
# ID da Subnet na VCN onde a instância será criada
SUBNET_ID="ocid1.subnet.oc1.[SUA_REGIAO].[SEU_SUBNET_ID_AQUI]"
# Domínio de Disponibilidade (Availability Domain)
# Ex: IGuL:SA-SAOPAULO-1-AD-1
AVAIL_DOMAIN="[SEU_AVAILABILITY_DOMAIN_AQUI]"
# Sua chave SSH pública para acessar a instância
# O conteúdo do seu arquivo ~/.ssh/id_rsa.pub
SSH_KEY='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDExample... [SUA_CHAVE_SSH_PUBLICA_AQUI] ...Example usuario@exemplo.com'
# --- MODO DE OPERAÇÃO ---
# SETUP=1 para listar IDs e configurar. SETUP=0 para criar a instância.
SETUP=0
# SILENT=1 para suprimir a saída da API, mostrando apenas o status.
SILENT=0
# --- CONFIGURAÇÕES DA VM ---
VM_DISPLAY_NAME="ARM-Instance-Gratuita"
CPUS=4 # Número de OCPUs
RAM=24 # Memória em GB
# --- CONTROLE DE TENTATIVAS ---
REQUEST_INTERVAL=10 # Intervalo inicial em segundos entre as tentativas
MAX_RETRIES=8640 # Máximo de tentativas (8640 * 10s = 24h)
# --- FUNÇÕES AUXILIARES ---
# Verifica se uma dependência de linha de comando existe
check_dep() {
if ! command -v "$1" &> /dev/null; then
echo "ERRO: Dependência '$1' não encontrada."
case "$1" in
"jq")
echo "Instale com: sudo apt update && sudo apt install jq"
;;
"oci")
echo "Instale a OCI CLI seguindo o guia oficial:"
echo "https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm"
;;
esac
exit 1
fi
}
# --- EXECUÇÃO ---
# Verificar dependências
check_dep "jq"
check_dep "oci"
# MODO SETUP: Listar informações para o usuário
if [ "$SETUP" = "1" ]; then
echo "--- MODO SETUP ATIVADO ---"
echo "Use os valores abaixo para preencher as variáveis no script."
echo
echo ">> Domínios de Disponibilidade (Availability Domains):"
oci iam availability-domain list -c "$TENANCY_ID" | jq -r '.data[].name'
echo
echo ">> Imagens ARM (aarch64) Disponíveis:"
oci compute image list -c "$TENANCY_ID" --all | jq -r '.data[] | select(."operating-system" != "Oracle Linux Cloud Developer") | select(.["display-name"] | contains("aarch64")) | "\(.["display-name"]): \(.id)"'
echo
echo ">> Subnets Disponíveis:"
oci network subnet list -c "$TENANCY_ID" --all | jq -r '.data[] | "\(.["display-name"]): \(.id)"'
echo
echo "--- FIM DO MODO SETUP ---"
exit 0
fi
# Validação das configurações
if [ -z "$TENANCY_ID" ] || [ -z "$IMAGE_ID" ] || [ -z "$SUBNET_ID" ] || [ -z "$AVAIL_DOMAIN" ] || [ -z "$SSH_KEY" ]; then
echo "ERRO: Uma ou mais variáveis de configuração estão vazias."
echo "Por favor, preencha todas as variáveis na seção 'CONFIGURAÇÕES' ou execute o script com SETUP=1."
exit 1
fi
echo "--- INICIANDO TENTATIVAS DE CRIAÇÃO DA INSTÂNCIA ---"
echo "Configuração:"
echo " - Nome: $VM_DISPLAY_NAME"
echo " - OCPUs: $CPUS"
echo " - RAM: ${RAM}GB"
echo " - Imagem: $IMAGE_ID"
echo " - Subnet: $SUBNET_ID"
echo " - AD: $AVAIL_DOMAIN"
echo "----------------------------------------------------"
for ((i=1; i<=MAX_RETRIES; i++)); do
echo -n "Tentativa $i/$MAX_RETRIES ($(date +'%Y-%m-%d %H:%M:%S'))... "
# Prepara os parâmetros complexos em arquivos temporários para evitar erros de sintaxe do shell
display_name="$VM_DISPLAY_NAME-$(date +%s)"
ssh_key_file=$(mktemp)
echo "$SSH_KEY" > "$ssh_key_file"
shape_config_file=$(mktemp)
printf '{"ocpus":%s,"memoryInGBs":%s}' "$CPUS" "$RAM" > "$shape_config_file"
# Comando para criar a instância
response=$(oci compute instance launch --availability-domain "$AVAIL_DOMAIN" --compartment-id "$COMPARTMENT_ID" \
--image-id "$IMAGE_ID" \
--subnet-id "$SUBNET_ID" \
--shape "VM.Standard.A1.Flex" \
--shape-config "file://$shape_config_file" \
--ssh-authorized-keys-file "$ssh_key_file" \
--display-name "$display_name" \
2>&1)
# Limpa os arquivos temporários
rm -f "$ssh_key_file" "$shape_config_file"
# Se a resposta contiver "id", a criação foi bem-sucedida
if echo "$response" | jq -e '.data.id' > /dev/null; then
echo "SUCESSO!"
echo "Instância criada com sucesso!"
echo "$response" | jq
exit 0
fi
# Tenta extrair a mensagem de erro do JSON. Se não for JSON, usa a resposta bruta.
error_message=$(echo "$response" | jq -r '.message' 2>/dev/null || echo "$response")
if [ "$SILENT" != "1" ]; then
echo "FALHA. Resposta da API:"
echo "$response"
else
echo "FALHA."
fi
# Tenta extrair o código de erro para a lógica de repetição
error_code=$(echo "$response" | jq -r '.code' 2>/dev/null || echo "")
# Lógica para lidar com erros comuns
if [[ "$error_code" == "Out of host capacity"* ]]; then
# Erro de capacidade, continua tentando
:
elif [[ "$error_message" == *"Too many requests"* ]]; then
# Aumenta o intervalo se receber erro de "Too many requests"
echo " Aviso: Muitas requisições. Aumentando o intervalo em 5s."
REQUEST_INTERVAL=$((REQUEST_INTERVAL + 5))
elif [[ "$error_message" == *"InvalidParameter"* ]]; then
echo " ERRO CRÍTICO: Parâmetro inválido. Verifique as configurações (IDs, Nomes, etc)."
exit 1
elif [[ "$error_message" == *"NotAuthorizedOrNotFound"* ]]; then
echo " ERRO CRÍTICO: Falha na autorização ou recurso não encontrado."
echo " Verifique se a CLI está configurada corretamente e se os OCIDs estão corretos."
exit 1
fi
sleep $REQUEST_INTERVAL
done
echo "Máximo de tentativas atingido ($MAX_RETRIES). Tente novamente mais tarde."
exit 1