code tao vps tu vultr
user_8607526207
python
3 years ago
9.2 kB
15
Indexable
#!/usr/bin/python3
#####################
##### imports #####
#####################
import requests
import json
import time
import sys
from tabulate import tabulate
##############################
##### global variables #####
##############################
base_url = "https://api.vultr.com"
api_token = XXXXXXXXXXXXXXXXXXXXXXXXXXX"
headers = {'Authorization': 'Bearer ' + api_token}
sshkey_id = ["XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX"]
#######################
##### functions #####
#######################
def help():
print("")
print("Usage: vultr_api.py [OPTION]")
print("")
print("\t-lcs\t--list-current-servers")
print("\t-lo\t--list-os")
print("\t-lr\t--list-regions")
print("\t-lp\t--list-plans")
print("\t-di\t--deploy-interactive")
print("\t-Di\t--Destroy-interactive")
print("")
def list_os():
endpoint = "/v2/os"
request = requests.get(base_url + endpoint, headers=headers)
os_master_list = []
oses = request.json()
for os in oses['os']:
os_list = []
os_list.append(os['id'])
os_list.append(os['name'])
os_master_list.append(os_list)
print(tabulate(os_master_list, headers=["id","name"], tablefmt="grid"))
def list_regions():
endpoint = "/v2/regions"
request = requests.get(base_url + endpoint, headers=headers)
region_master_list = []
regions = request.json()
for region in regions['regions']:
region_list = []
region_list.append(region['id'])
region_list.append(region['city'])
region_master_list.append(region_list)
print(tabulate(region_master_list, headers=["id","city"], tablefmt="grid"))
def list_plans():
endpoint = "/v2/plans"
request = requests.get(base_url + endpoint, headers=headers)
plans_master_list = []
plans = request.json()
for plan in plans['plans']:
if plan['type'] == "vc2":
plans_list = []
plans_list.append(plan['id'])
plans_list.append(plan['vcpu_count'])
plans_list.append(plan['ram'])
plans_list.append(plan['disk'])
plans_list.append(plan['bandwidth'])
plans_list.append(plan['monthly_cost'])
plans_list.append(','.join(plan['locations']))
plans_master_list.append(plans_list)
print(tabulate(plans_master_list, headers=["id","vcpu_count","ram","disk size","bandwidth","monthly_cost","locations"], tablefmt="grid"))
def list_current_servers():
endpoint = "/v2/instances"
request = requests.get(base_url + endpoint, headers=headers)
current_servers_master_list = []
current_servers = request.json()
for current_server in current_servers['instances']:
current_server_list = []
current_server_list.append(current_server['id'])
current_server_list.append(current_server['hostname'])
current_server_list.append(current_server['os'])
current_server_list.append(current_server['ram'])
current_server_list.append(current_server['disk'])
current_server_list.append(current_server['main_ip'])
current_server_list.append(current_server['vcpu_count'])
current_server_list.append(current_server['region'])
current_server_list.append(current_server['power_status'])
current_server_list.append(current_server['server_status'])
current_server_list.append(current_server['v6_main_ip'])
current_servers_master_list.append(current_server_list)
print(tabulate(current_servers_master_list, headers=["id","hostname","os","ram","disk size","ipv4","vcpu_count","region","power_status","server_status","ipv6"], tablefmt="grid"))
def configure_instance():
enable_ipv6 = True
instance_details = {}
should_enable_ipv6_question = "enable_ipv6? [Y/n] : "
should_enable_ipv6_answer = input(should_enable_ipv6_question)
if should_enable_ipv6_answer:
if should_enable_ipv6_answer == "n":
enable_ipv6 = False
add_hostname = "add a hostname to this server : "
hostname = input(add_hostname)
add_label = "add a label to this server : "
label = input(add_label)
add_reverse_dns = "add a reverse dns to this server : "
global reverse_dns
reverse_dns = input(add_reverse_dns)
list_os()
select_os = "select os by id : "
os_choice = input(select_os)
list_regions()
select_region = "select region by id : "
region_choice = input(select_region)
list_plans()
select_plan = "select plan by id : "
plan_choice = input(select_plan)
instance_details["sshkey_id"] = sshkey_id
instance_details["enable_ipv6"] = enable_ipv6
instance_details["hostname"] = hostname
instance_details["label"] = label
instance_details["os_id"] = os_choice
instance_details["region"] = region_choice
instance_details["plan"] = plan_choice
return instance_details
def create_reverse_dns(instance_id, endpoint, ipv6_found):
print("instance : " + instance_id + " is ready, creating reverse dns")
instance_v4_request = requests.get(base_url + endpoint + '/' + instance_id + '/ipv4', headers=headers)
instance_v4_details = instance_v4_request.json()
instance_ipv4 = instance_v4_details['ipv4s'][0]['ip']
if ipv6_found:
instance_v6_request = requests.get(base_url + endpoint + '/' + instance_id + '/ipv6', headers=headers)
instance_v6_details = instance_v6_request.json()
instance_ipv6 = instance_v6_details['ipv6s'][0]['ip']
instance_rev_ipv4 = {
"ip" : instance_ipv4,
"reverse" : reverse_dns
}
if ipv6_found:
instance_rev_ipv6 = {
"ip" : instance_ipv6,
"reverse" : reverse_dns
}
instance_ipv4_reverse_request = requests.post(base_url + endpoint + '/' + instance_id + '/ipv4/reverse', data=json.dumps(instance_rev_ipv4), headers=headers)
if ipv6_found:
instance_ipv6_reverse_request = requests.post(base_url + endpoint + '/' + instance_id + '/ipv6/reverse', data=json.dumps(instance_rev_ipv6), headers=headers)
return instance_ipv4, instance_ipv6, reverse_dns, reverse_dns
else:
return instance_ipv4, reverse_dns
def create_instance():
endpoint = "/v2/instances"
instance_details = configure_instance()
create_instance_request = requests.post(base_url + endpoint, data=json.dumps(instance_details), headers=headers)
instance_creation_details = create_instance_request.json()
instance_id = instance_creation_details['instance']['id']
while True :
# query instance status
instance_request = requests.get(base_url + endpoint + '/' + instance_id, headers=headers)
created_instance_details = instance_request.json()
# wait for the instance to be fully populated
if created_instance_details['instance']['status'] == "pending":
print("instance : " + instance_id + " still creating, waiting...")
time.sleep(2)
continue
else:
ipv6_found = created_instance_details['instance']['v6_main_ip']
reverse_dns_result = create_reverse_dns(instance_id, endpoint, ipv6_found)
master_reverse_dns_list = []
master_reverse_dns_list.append(reverse_dns_result)
if ipv6_found:
print(tabulate(master_reverse_dns_list, headers=["ipv4 address","ipv6 address","ipv4 reverse dns","ipv6 reverse dns"], tablefmt="grid"))
print("all done.")
break
else:
print(tabulate(master_reverse_dns_list, headers=["ipv4 address", "ipv4 reverse dns"], tablefmt="grid"))
break
def delete_instance():
endpoint = "/v2/instances"
del_instance = "enter the id of the instance to delete : "
instance_id = input(del_instance)
instance_deletion = requests.delete(base_url + endpoint + '/' + instance_id, headers=headers)
if instance_deletion.status_code == 204:
print("instance " + instance_id + " deleted.")
####################
##### script #####
####################
if len(sys.argv) == 1:
help()
sys.exit(0)
elif sys.argv[1] == "--help" or sys.argv[1] == "-h":
help()
sys.exit(0)
elif sys.argv[1] == "-lo" or sys.argv[1] == "--list-os":
list_os()
sys.exit(0)
elif sys.argv[1] == "-lr" or sys.argv[1] == "--list-regions":
list_regions()
sys.exit(0)
elif sys.argv[1] == "-lp" or sys.argv[1] == "--list-plans":
list_plans()
sys.exit(0)
elif sys.argv[1] == "-lcs" or sys.argv[1] == "--list-current-servers":
list_current_servers()
sys.exit(0)
elif sys.argv[1] == "-di" or sys.argv[1] == "--deploy-interactive":
create_instance()
sys.exit(0)
elif sys.argv[1] == "-Di" or sys.argv[1] == "--Destroy-interactive":
delete_instance()
sys.exit(0)
else:
print("Invalid command")
sys.exit(1)Editor is loading...