Initial commit: Vultr API v2 Python wrapper with FastAPI server
- vultr_api/: Python library wrapping Vultr API v2 - 17 resource modules (instances, dns, firewall, vpc, etc.) - Pagination support, error handling - server/: FastAPI REST server - All API endpoints exposed via HTTP - X-API-Key header authentication - Swagger docs at /docs - Podman quadlet config for systemd deployment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
119
examples/acl_management.py
Normal file
119
examples/acl_management.py
Normal file
@@ -0,0 +1,119 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Vultr ACL (IP 접근 제어) 관리 예제
|
||||
|
||||
IP를 등록해야 API에 접근할 수 있을 때 사용하는 예제입니다.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from vultr_api import VultrClient
|
||||
from vultr_api.client import VultrAPIError
|
||||
|
||||
|
||||
def get_client():
|
||||
api_key = os.environ.get("VULTR_API_KEY")
|
||||
if not api_key:
|
||||
print("VULTR_API_KEY 환경 변수를 설정해주세요")
|
||||
sys.exit(1)
|
||||
return VultrClient(api_key=api_key)
|
||||
|
||||
|
||||
def list_acl(client):
|
||||
"""현재 ACL 목록 조회"""
|
||||
acl = client.account.get_acl()
|
||||
print(f"ACL 활성화: {acl.get('acl_enabled', False)}")
|
||||
acls = acl.get("acls", [])
|
||||
if acls:
|
||||
print("허용된 IP/CIDR:")
|
||||
for ip in acls:
|
||||
print(f" - {ip}")
|
||||
else:
|
||||
print("허용된 IP 없음 (모든 IP 허용)")
|
||||
|
||||
|
||||
def add_ip(client, ip):
|
||||
"""IP 추가"""
|
||||
print(f"IP 추가 중: {ip}")
|
||||
client.account.add_acl(ip)
|
||||
print("완료!")
|
||||
list_acl(client)
|
||||
|
||||
|
||||
def remove_ip(client, ip):
|
||||
"""IP 제거"""
|
||||
print(f"IP 제거 중: {ip}")
|
||||
client.account.remove_acl(ip)
|
||||
print("완료!")
|
||||
list_acl(client)
|
||||
|
||||
|
||||
def set_ips(client, ips):
|
||||
"""IP 목록 설정"""
|
||||
print(f"IP 목록 설정 중: {ips}")
|
||||
client.account.set_acl(ips)
|
||||
print("완료!")
|
||||
list_acl(client)
|
||||
|
||||
|
||||
def clear_acl(client):
|
||||
"""ACL 초기화"""
|
||||
print("ACL 초기화 중 (모든 IP 허용)...")
|
||||
client.account.clear_acl()
|
||||
print("완료!")
|
||||
list_acl(client)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Vultr ACL 관리")
|
||||
subparsers = parser.add_subparsers(dest="command", help="명령")
|
||||
|
||||
# list 명령
|
||||
subparsers.add_parser("list", help="ACL 목록 조회")
|
||||
|
||||
# add 명령
|
||||
add_parser = subparsers.add_parser("add", help="IP 추가")
|
||||
add_parser.add_argument("ip", help="추가할 IP/CIDR (예: 192.168.1.1/32)")
|
||||
|
||||
# remove 명령
|
||||
remove_parser = subparsers.add_parser("remove", help="IP 제거")
|
||||
remove_parser.add_argument("ip", help="제거할 IP/CIDR")
|
||||
|
||||
# set 명령
|
||||
set_parser = subparsers.add_parser("set", help="IP 목록 설정")
|
||||
set_parser.add_argument("ips", nargs="+", help="설정할 IP/CIDR 목록")
|
||||
|
||||
# clear 명령
|
||||
subparsers.add_parser("clear", help="ACL 초기화 (모든 IP 허용)")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.command:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
client = get_client()
|
||||
|
||||
if args.command == "list":
|
||||
list_acl(client)
|
||||
elif args.command == "add":
|
||||
add_ip(client, args.ip)
|
||||
elif args.command == "remove":
|
||||
remove_ip(client, args.ip)
|
||||
elif args.command == "set":
|
||||
set_ips(client, args.ips)
|
||||
elif args.command == "clear":
|
||||
clear_acl(client)
|
||||
|
||||
except VultrAPIError as e:
|
||||
print(f"API 오류: {e.message}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
105
examples/basic_usage.py
Normal file
105
examples/basic_usage.py
Normal file
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Vultr API 기본 사용 예제
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# vultr_api 패키지 경로 추가 (개발용)
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from vultr_api import VultrClient
|
||||
from vultr_api.client import VultrAPIError
|
||||
|
||||
|
||||
def main():
|
||||
# API 키 설정 (환경 변수에서 가져오기)
|
||||
api_key = os.environ.get("VULTR_API_KEY")
|
||||
if not api_key:
|
||||
print("VULTR_API_KEY 환경 변수를 설정해주세요")
|
||||
print("export VULTR_API_KEY='your-api-key'")
|
||||
sys.exit(1)
|
||||
|
||||
# 클라이언트 생성
|
||||
client = VultrClient(api_key=api_key)
|
||||
|
||||
try:
|
||||
# 1. 계정 정보 조회
|
||||
print("=" * 50)
|
||||
print("계정 정보")
|
||||
print("=" * 50)
|
||||
account = client.account.get()
|
||||
print(f"이메일: {account.get('email')}")
|
||||
print(f"이름: {account.get('name')}")
|
||||
print(f"잔액: ${account.get('balance')}")
|
||||
print(f"보류 요금: ${account.get('pending_charges')}")
|
||||
print()
|
||||
|
||||
# 2. ACL 정보 조회
|
||||
print("=" * 50)
|
||||
print("ACL (IP 접근 제어)")
|
||||
print("=" * 50)
|
||||
acl = client.account.get_acl()
|
||||
print(f"ACL 활성화: {acl.get('acl_enabled', False)}")
|
||||
acls = acl.get("acls", [])
|
||||
if acls:
|
||||
print("허용된 IP:")
|
||||
for ip in acls:
|
||||
print(f" - {ip}")
|
||||
else:
|
||||
print("허용된 IP: 없음 (모든 IP 허용)")
|
||||
print()
|
||||
|
||||
# 3. 인스턴스 목록
|
||||
print("=" * 50)
|
||||
print("인스턴스 목록")
|
||||
print("=" * 50)
|
||||
instances_resp = client.instances.list()
|
||||
instances = instances_resp.get("instances", [])
|
||||
if instances:
|
||||
for inst in instances:
|
||||
status = inst.get("status", "unknown")
|
||||
power = inst.get("power_status", "unknown")
|
||||
print(f"- {inst.get('label', 'No Label')}")
|
||||
print(f" ID: {inst.get('id')}")
|
||||
print(f" IP: {inst.get('main_ip')}")
|
||||
print(f" 리전: {inst.get('region')}")
|
||||
print(f" 상태: {status} ({power})")
|
||||
print(f" 플랜: {inst.get('plan')}")
|
||||
print()
|
||||
else:
|
||||
print("인스턴스가 없습니다")
|
||||
print()
|
||||
|
||||
# 4. 리전 목록 (일부만)
|
||||
print("=" * 50)
|
||||
print("사용 가능한 리전 (일부)")
|
||||
print("=" * 50)
|
||||
regions_resp = client.regions.list(per_page=10)
|
||||
regions = regions_resp.get("regions", [])
|
||||
for region in regions[:5]:
|
||||
print(f"- {region.get('id')}: {region.get('city')}, {region.get('country')}")
|
||||
print()
|
||||
|
||||
# 5. 플랜 목록 (일부만)
|
||||
print("=" * 50)
|
||||
print("사용 가능한 플랜 (일부)")
|
||||
print("=" * 50)
|
||||
plans_resp = client.plans.list(per_page=10)
|
||||
plans = plans_resp.get("plans", [])
|
||||
for plan in plans[:5]:
|
||||
print(f"- {plan.get('id')}")
|
||||
print(f" CPU: {plan.get('vcpu_count')}vCPU, RAM: {plan.get('ram')}MB")
|
||||
print(f" 가격: ${plan.get('monthly_cost')}/월")
|
||||
print()
|
||||
|
||||
except VultrAPIError as e:
|
||||
print(f"API 오류 발생: {e.message}")
|
||||
if e.status_code:
|
||||
print(f"상태 코드: {e.status_code}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user