Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

Tương tác với Swift bằng Python


Đoạn code này là ví dụ để sử dụng để tương tác với OpenStack Swift Storage, một dịch vụ lưu trữ đối tượng phân tán.

image

Dưới đây là một số hàm chính trong đoạn code Python này:

  • create_connection: Tạo một kết nối đến OpenStack bằng cách sử dụng thông tin xác thực được cung cấp.
  • create_container: Tạo một container mới trong Swift Storage.
  • list_containers: Liệt kê tất cả các container trong Swift Storage.
  • delete_container: Xóa một container từ Swift Storage.
  • upload_object: Tải một file lên một container trong Swift Storage.
  • upload_folder: Tải tất cả các file trong một thư mục lên một container trong Swift Storage.
  • delete_all_objects: Xóa tất cả các file từ một container trong Swift Storage.
  • get_file: Lấy một file từ một container trong Swift Storage.
  • list_objects: Liệt kê tất cả các file trong một container trong Swift Storage.
  • get_object_public_url: Lấy URL công khai của một file trong Swift Storage.
import os, glob, logging
from openstack import connection

logging.basicConfig(level=logging.ERROR)

def create_connection(auth_url, region, project_name, username, password, user_domain_name, project_domain_name):
    return connection.Connection(
        auth_url=auth_url,
        project_name=project_name,
        username=username,
        password=password,
        user_domain_name=user_domain_name,
        project_domain_name=project_domain_name,
    )

def create_container(conn, container_name):
    return conn.object_store.create_container(name=container_name)

def list_containers(conn):
    for container in conn.object_store.containers():
        print(container.name)

def delete_container(conn, container_name):
    return conn.object_store.delete_container(container=container_name)

def upload_object(conn, container_name, file_path, base_path):
    if os.path.isfile(file_path):
        with open(file_path, 'rb') as data:
            object_name = os.path.relpath(file_path, base_path)
            conn.object_store.upload_object(container=container_name, name=object_name, data=data)

def upload_folder(conn, container_name, folder_path):
    for file_path in glob.glob(folder_path + '/**', recursive=True):
        upload_object(conn, container_name, file_path, folder_path)

def delete_all_objects(conn, container_name):
    for obj in conn.object_store.objects(container_name):
        conn.object_store.delete_object(container=container_name, obj=obj.name)

def get_file(conn, container_name, file_name):
    try:
        file = conn.object_store.get_object(container=container_name, obj=file_name)
        return file
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

def list_objects(conn, container_name):
    return list(conn.object_store.objects(container_name))

def get_object_public_url(conn, container_name, object_name):
    swift_endpoint = conn.object_store.get_endpoint()
    public_url = f"{swift_endpoint}/{container_name}/{object_name}"
    return public_url

auth_url = os.getenv('OS_AUTH_URL')
region = os.getenv('OS_REGION')
project_name = os.getenv('OS_PROJECT_NAME')
username = os.getenv('OS_USERNAME')
password = os.getenv('OS_PASSWORD')
project_domain_name = os.getenv('OS_PROJECT_DOMAIN_NAME')
user_domain_name = os.getenv('OS_USER_DOMAIN_NAME')
file_path = "/home/openrc.sh"
folder_path = "/home/swift"
container_name = "swift_repo"

conn = create_connection(auth_url, region, project_name, username, password, user_domain_name, project_domain_name)

create_container(conn, container_name)
list_containers(conn)
upload_folder(conn, container_name, folder_path)
delete_all_objects(conn, container_name)
delete_container(conn, container_name)

# List all object from container
objects = list_objects(conn, container_name)
for obj in objects:
    print(obj.name)

# Use it to get the public URL of an object
public_url = get_object_public_url(conn, container_name, 'tools/playbooks/saio_single_node_setup/add_s3api.yaml')
print(public_url)

Như vậy tổng kết lại là đoạn code Python này sẽ tạo một kết nối đến OpenStack, tạo một container, tải tất cả các file trong một thư mục lên container đó, sau đó xóa tất cả các file và container. Nó cũng liệt kê tất cả các file trong container và in ra URL công khai của một file cụ thể.