2023-03-27 21:13:36 +03:00
from time import sleep
2023-10-11 14:38:56 +03:00
from typing import Optional
2023-03-24 16:31:22 +03:00
from pathlib import Path
2023-10-11 14:38:56 +03:00
import urllib3
2023-03-24 16:31:22 +03:00
from proxmoxer import ProxmoxAPI
2023-10-11 14:38:56 +03:00
urllib3 . disable_warnings ( )
2023-03-24 16:31:22 +03:00
PROXMOX_HOST = ' pve.office.basealt.ru '
PROXMOX_USER = ' stepchenkoas@BaseALT '
PROXMOX_PASSWORD = Path ( ' pve_secret ' ) . read_text ( ) . strip ( )
def create_vm (
proxmox ,
2023-10-11 14:38:56 +03:00
node : Optional [ str ] = None ,
vmid : Optional [ int ] = None ,
name : Optional [ str ] = None ,
2023-03-27 21:13:36 +03:00
prefix : str = ' stepchenkoas ' ,
cores : int = 2 ,
memory : int = 2048 ,
disk_size : int = 16 ,
start : int = 1 ,
2023-03-24 16:31:22 +03:00
) :
if node is None :
nodes = proxmox . nodes . get ( )
nodes = list ( filter ( lambda node : node [ ' status ' ] == ' online ' , nodes ) )
node = min ( nodes , key = lambda node : node [ ' disk ' ] ) [ ' node ' ]
if vmid is None :
vmid = proxmox . cluster . get ( ' nextid ' )
if name is None :
name = f ' { prefix } - { vmid } '
proxmox . nodes ( node ) . qemu . post (
node = node ,
vmid = vmid ,
description = ' This VM was created automatically through Proxmox VE API ' ,
cores = cores ,
cpu = ' host ' ,
memory = memory ,
name = name ,
net0 = ' virtio,bridge=vmbr0,tag=103,firewall=1 ' ,
ostype = ' l26 ' ,
pool = ' Virt_LAB ' ,
#alt-server-v-10.1-rc3-x86_64.iso
sata2 = ' templates:iso/alt-server-v-10.1-rc3-x86_64.iso,media=cdrom ' ,
scsi0 = f ' rbd-storage: { disk_size } ,discard=on ' ,
scsihw = ' virtio-scsi-pci ' ,
sockets = 1 ,
2023-03-27 21:13:36 +03:00
start = start ,
2023-03-24 16:31:22 +03:00
)
print ( f ' VM { vmid } was created successfully! ' )
def delete_vm (
proxmox ,
node ,
vmid ,
) :
proxmox . nodes ( node ) . qemu ( vmid ) . delete (
node = node ,
vmid = vmid ,
)
print ( f ' VM { vmid } was deleted successfully! ' )
def clone_template (
proxmox ,
2023-03-27 15:51:32 +03:00
node : str ,
vmid : int ,
2023-10-11 14:38:56 +03:00
newid : Optional [ int ] = None ,
name : Optional [ str ] = None ,
2023-03-27 21:13:36 +03:00
prefix : str = ' stepchenkoas ' ,
) - > int :
2023-03-24 16:31:22 +03:00
if newid is None :
newid = proxmox . cluster . get ( ' nextid ' )
2023-03-27 21:13:36 +03:00
if name is None :
name = f ' { prefix } - { newid } '
2023-10-11 14:38:56 +03:00
res = proxmox . nodes ( node ) . qemu ( vmid ) . clone . post (
2023-03-27 15:51:32 +03:00
newid = newid ,
node = node ,
vmid = vmid ,
format = ' raw ' ,
full = 1 ,
2023-03-27 21:13:36 +03:00
name = name ,
2023-03-27 15:51:32 +03:00
pool = ' Virt_LAB ' ,
storage = ' rbd-storage ' ,
target = node ,
)
2023-10-11 14:38:56 +03:00
print ( res )
2023-03-27 21:13:36 +03:00
print ( f ' VM { vmid } was cloned to { newid } successfully! ' )
return newid
def get_vm_ip (
proxmox ,
node : ' str ' ,
vmid : int ,
) :
res = proxmox . nodes ( node ) . qemu ( vmid ) . agent ( ' network-get-interfaces ' ) . get ( )
vm_ip_address = None
for net in res [ ' result ' ] :
if net [ ' name ' ] == ' eth0 ' :
for ip in net [ ' ip-addresses ' ] :
if ip [ ' ip-address-type ' ] == ' ipv4 ' :
vm_ip_address = ip [ ' ip-address ' ]
return vm_ip_address
2023-03-27 15:51:32 +03:00
2023-03-24 16:31:22 +03:00
def main ( ) :
proxmox = ProxmoxAPI (
PROXMOX_HOST , user = PROXMOX_USER , password = PROXMOX_PASSWORD , verify_ssl = False
)
2023-03-27 21:13:36 +03:00
nodes = proxmox . nodes . get ( )
nodes = list ( filter ( lambda node : node [ ' status ' ] == ' online ' , nodes ) )
node = min ( nodes , key = lambda node : node [ ' disk ' ] ) [ ' node ' ]
2023-10-11 14:38:56 +03:00
template_id = 374
2023-03-27 21:13:36 +03:00
prefix = ' stepchenkaos-test-k8s '
vm_id_master = clone_template (
proxmox ,
node ,
template_id ,
name = f ' { prefix } -master ' ,
)
proxmox . nodes ( node ) . qemu ( vm_id_master ) . status . start . post ( )
2023-03-24 16:31:22 +03:00
2023-03-27 21:13:36 +03:00
vm_id_worker1 = clone_template (
proxmox ,
node ,
template_id ,
name = f ' { prefix } -node1 ' ,
)
proxmox . nodes ( node ) . qemu ( vm_id_worker1 ) . status . start . post ( )
vm_id_worker2 = clone_template (
proxmox ,
node ,
template_id ,
name = f ' { prefix } -node2 ' ,
)
proxmox . nodes ( node ) . qemu ( vm_id_worker2 ) . status . start . post ( )
vms_statuses = [ False , False , False ]
2023-10-11 14:38:56 +03:00
print ( vms_statuses )
while not all ( vms_statuses ) :
sleep ( 5 )
vms_statuses [ 0 ] = proxmox . nodes ( node ) . qemu ( vm_id_master ) . status . current . get ( ) [ ' status ' ] == ' running '
vms_statuses [ 1 ] = proxmox . nodes ( node ) . qemu ( vm_id_worker1 ) . status . current . get ( ) [ ' status ' ] == ' running '
vms_statuses [ 2 ] = proxmox . nodes ( node ) . qemu ( vm_id_worker2 ) . status . current . get ( ) [ ' status ' ] == ' running '
print ( vms_statuses )
sleep ( 60 )
2023-03-27 21:13:36 +03:00
vm_ip_master = get_vm_ip ( proxmox , node , vm_id_master )
vm_ip_worker1 = get_vm_ip ( proxmox , node , vm_id_worker1 )
vm_ip_worker2 = get_vm_ip ( proxmox , node , vm_id_worker2 )
with open ( ' vm_ids ' , ' w ' ) as ofile :
vm_ids = f ' { vm_id_master } \t master \n '
vm_ids + = f ' { vm_id_worker1 } \t worker1 \n '
vm_ids + = f ' { vm_id_worker2 } \t worker2 \n '
ofile . write ( vm_ids )
with open ( ' hosts ' , ' w ' ) as ofile :
hosts = f ' { vm_ip_master } \t master \n '
hosts + = f ' { vm_ip_worker1 } \t worker1 \n '
hosts + = f ' { vm_ip_worker2 } \t worker2 \n '
ofile . write ( hosts )
2023-03-24 16:31:22 +03:00
proxmox . logout ( )
if __name__ == ' __main__ ' :
main ( )