コンテンツにスキップ

Python Scirpts

PythonスクリプトからVirty APIを叩いてVMを一気に作成するTipsです。ノードの追加、ストレージの追加、ネットワークの追加などが完了しており、ダッシュボードからVMが作れる状態を想定しています。最小構成

VMの一括作成

import requests

BASE_URL = 'http://localhost:8765'
TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


def main():
    servers = [
        ["dev-nuxt-server",      "192.168.19.1/24"],
        ["prod-nuxt-server",     "192.168.19.2/24"],
        ["prac-apache-server",   "192.168.19.3/24"],
        ["dev-django-server",    "192.168.19.4/24"],
        ["prod-django-server",   "192.168.19.5/24"],
    ]

    for i in servers:
        create_vm(
            # Spec
            vm_name    = i[0],
            node_name  = "node-02",
            core= 8,
            memory= 16,

            # Storage
            src_sotrage_uuid="4df226bb-1a73-4d47-990d-xxxxxxxxxxxx",
            dst_storage_uuid="2ab906b3-8f19-4018-b542-xxxxxxxxxxxx",
            copy_image="noble-server-cloudimg-amd64.img",
            disk_size=128,

            # Login
            login_user="user",
            login_pw="password",
            pubkey="ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",

            # Network
            ip_address=i[1],
            gateway="192.168.19.254",
            nameserver="1.1.1.1",
            network_uuid="bec29dff-21ed-46c1-a526-xxxxxxxxxxxx",
        )



def create_vm(vm_name, node_name, core, memory, src_sotrage_uuid, dst_storage_uuid, copy_image, disk_size, network_uuid, login_user, login_pw, pubkey, ip_address, gateway, nameserver):
    userData = f"""
#cloud-config
password: {login_pw}
chpasswd: {{expire: False}}
user: {login_user}
ssh_pwauth: True
ssh_authorized_keys:
  - {pubkey}
timezone: "Asia/Tokyo"
write_files:
  - path: /etc/netplan/50-cloud-init.yaml
    owner: root:root
    permissions: '0644'
    content: |
      network:
        ethernets:
            ens3:
                dhcp4: false
                addresses:
                - {ip_address}
                routes:
                - to: default
                  via: {gateway}
                nameservers:
                  addresses:
                  - {nameserver}
        version: 2
runcmd:
  - [ netplan, apply ]
"""

    request_data = {
        "type": "manual",
        "name": vm_name,
        "nodeName":node_name,
        "memoryMegaByte": memory*1024,
        "cpu":core,
        "disks":[
            {
                "id":1,
                "type":"copy",
                "savePoolUuid": dst_storage_uuid,
                "originalPoolUuid": src_sotrage_uuid,
                "originalName": copy_image,
                "sizeGigaByte": disk_size
            }
        ],
        "interface":[
            {
                "type":"network",
                "networkUuid":network_uuid,
            }
        ],
        "cloudInit":{
            "hostname": vm_name,
            "userData": userData
        }
    }
    res = requests.request(method="post",url=f'{BASE_URL}/api/tasks/vms', headers=HEADERS, json=request_data)
    print(f"CreateVM: {res.status_code}")



HEADERS = {
    "accept": "application/json, text/plain, */*",
    "accept-language": "ja",
    "authorization": f"Bearer {TOKEN}",
}


if __name__ == "__main__":
    main()

VMの一括削除

import requests

BASE_URL = 'http://localhost:8765'
TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


def main():
    deletion_match = "test-"

    vms = requests.get(f"{BASE_URL}/api/vms?admin=true",headers=HEADERS).json()

    for vm in vms["data"]:
        if deletion_match in vm["name"]:
            print("Delete VM: ",vm["uuid"], vm["name"])

            delete_uuid = vm["uuid"]
            requests.delete(f'{BASE_URL}/api/tasks/vms/{delete_uuid}', headers=HEADERS)

HEADERS = {
    "accept": "application/json, text/plain, */*",
    "accept-language": "ja",
    "authorization": f"Bearer {TOKEN}",
}


if __name__ == "__main__":
    main()

VMの一括ON

import requests

BASE_URL = 'http://localhost:8765'
TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


def main():
    poweron_match = "-"

    vms = requests.get(f"{BASE_URL}/api/vms?admin=true",headers=HEADERS).json()

    for vm in vms["data"]:
        if poweron_match in vm["name"]:
            res = requests.patch(f'{BASE_URL}/api/tasks/vms/{vm["uuid"]}/power', headers=HEADERS, json={"status": "on"})
            print("PowerON VM: ", res.status_code, vm["uuid"], vm["name"])

HEADERS = {
    "accept": "application/json, text/plain, */*",
    "accept-language": "ja",
    "authorization": f"Bearer {TOKEN}",
}


if __name__ == "__main__":
    main()