2023-10-24 21:09:53 +03:00
import os
2023-10-13 15:30:35 +03:00
import logging
import urllib3
from typing import Callable , List
2023-03-27 21:13:36 +03:00
from time import sleep
2023-03-24 16:31:22 +03:00
from pathlib import Path
2023-10-24 12:22:14 +03:00
import yaml
2023-03-24 16:31:22 +03:00
from proxmoxer import ProxmoxAPI
2023-10-13 15:30:35 +03:00
from functions import clone_template , get_vm_ip
2023-03-24 16:31:22 +03:00
2023-10-11 14:38:56 +03:00
urllib3 . disable_warnings ( )
2023-10-24 12:21:21 +03:00
FORMAT = " %(asctime)s %(name)s %(levelname)s %(message)s "
logging . basicConfig ( format = FORMAT )
2023-10-13 15:30:35 +03:00
logger = logging . getLogger ( __name__ )
2023-10-24 21:10:53 +03:00
logger . setLevel ( logging . INFO )
2023-10-11 14:38:56 +03:00
2023-03-24 16:31:22 +03:00
PROXMOX_HOST = ' pve.office.basealt.ru '
2023-10-24 12:22:52 +03:00
PROXMOX_USER = ' stepchenkoas '
PROXMOX_USER_FULL = PROXMOX_USER + ' @BaseALT '
2023-03-24 16:31:22 +03:00
PROXMOX_PASSWORD = Path ( ' pve_secret ' ) . read_text ( ) . strip ( )
2023-03-27 15:51:32 +03:00
2023-10-13 15:30:35 +03:00
def wait_status ( funcs : List [ Callable ] , status : str ) :
statuses = [ False ] * len ( funcs )
while not all ( statuses ) :
logger . debug ( statuses )
sleep ( 5 )
for i in range ( len ( funcs ) ) :
statuses [ i ] = funcs [ i ] ( ) [ ' status ' ] == status
2023-03-24 16:31:22 +03:00
def main ( ) :
proxmox = ProxmoxAPI (
2023-10-24 12:22:52 +03:00
PROXMOX_HOST , user = PROXMOX_USER_FULL , password = PROXMOX_PASSWORD , verify_ssl = False
2023-03-24 16:31:22 +03:00
)
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-10-24 12:22:52 +03:00
prefix = PROXMOX_USER + ' -test-k8s '
2023-10-13 16:48:05 +03:00
vm_names = {
' master ' : f ' { prefix } -master ' ,
' worker1 ' : f ' { prefix } -node1 ' ,
' worker2 ' : f ' { prefix } -node2 ' ,
}
2023-10-24 21:08:11 +03:00
vm_ids = {
' master ' : 500 ,
' worker1 ' : 501 ,
' worker2 ' : 502 ,
}
2023-03-27 21:13:36 +03:00
2023-10-13 15:30:35 +03:00
vm_id_master , upid_master = clone_template (
2023-03-27 21:13:36 +03:00
proxmox ,
node ,
template_id ,
2023-10-24 21:08:11 +03:00
newid = vm_ids [ ' master ' ] ,
2023-10-13 16:48:05 +03:00
name = vm_names [ ' master ' ] ,
2023-03-27 21:13:36 +03:00
)
2023-10-24 21:08:11 +03:00
assert vm_id_master == vm_ids [ ' master ' ]
2023-03-24 16:31:22 +03:00
2023-10-13 15:30:35 +03:00
vm_id_worker1 , upid_worker1 = clone_template (
2023-03-27 21:13:36 +03:00
proxmox ,
node ,
template_id ,
2023-10-24 21:08:11 +03:00
newid = vm_ids [ ' worker1 ' ] ,
2023-10-13 16:48:05 +03:00
name = vm_names [ ' worker1 ' ] ,
2023-03-27 21:13:36 +03:00
)
2023-10-24 21:08:11 +03:00
assert vm_id_worker1 == vm_ids [ ' worker1 ' ]
2023-03-27 21:13:36 +03:00
2023-10-13 15:30:35 +03:00
vm_id_worker2 , upid_worker2 = clone_template (
2023-03-27 21:13:36 +03:00
proxmox ,
node ,
template_id ,
2023-10-24 21:08:11 +03:00
newid = vm_ids [ ' worker2 ' ] ,
2023-10-13 16:48:05 +03:00
name = vm_names [ ' worker2 ' ] ,
2023-03-27 21:13:36 +03:00
)
2023-10-24 21:08:11 +03:00
assert vm_id_worker2 == vm_ids [ ' worker2 ' ]
2023-03-27 21:13:36 +03:00
2023-10-13 15:30:35 +03:00
logger . info ( ' Waiting for clone tasks to complete... ' )
wait_status (
[
proxmox . nodes ( node ) . tasks ( upid_master ) . status . get ,
proxmox . nodes ( node ) . tasks ( upid_worker1 ) . status . get ,
proxmox . nodes ( node ) . tasks ( upid_worker2 ) . status . get ,
] ,
' stopped '
)
logger . info ( ' Tasks completed! ' )
logger . info ( ' Starting VMs... ' )
2023-10-24 21:08:11 +03:00
proxmox . nodes ( node ) . qemu ( vm_ids [ ' master ' ] ) . status . start . post ( )
proxmox . nodes ( node ) . qemu ( vm_ids [ ' worker1 ' ] ) . status . start . post ( )
proxmox . nodes ( node ) . qemu ( vm_ids [ ' worker2 ' ] ) . status . start . post ( )
2023-10-13 15:30:35 +03:00
wait_status (
[
2023-10-24 21:08:11 +03:00
proxmox . nodes ( node ) . qemu ( vm_ids [ ' master ' ] ) . status . current . get ,
proxmox . nodes ( node ) . qemu ( vm_ids [ ' worker1 ' ] ) . status . current . get ,
proxmox . nodes ( node ) . qemu ( vm_ids [ ' worker2 ' ] ) . status . current . get ,
2023-10-13 15:30:35 +03:00
] ,
' running '
)
2023-10-11 14:38:56 +03:00
2023-10-13 15:30:35 +03:00
sleep ( 40 )
logger . info ( ' VMs are running! ' )
2023-03-27 21:13:36 +03:00
2023-10-24 21:08:11 +03:00
vm_ip_master = get_vm_ip ( proxmox , node , vm_ids [ ' master ' ] )
vm_ip_worker1 = get_vm_ip ( proxmox , node , vm_ids [ ' worker1 ' ] )
vm_ip_worker2 = get_vm_ip ( proxmox , node , vm_ids [ ' worker2 ' ] )
2023-10-24 12:24:28 +03:00
proxmox . logout ( )
2023-03-27 21:13:36 +03:00
2023-10-24 21:09:53 +03:00
tmp_path = ' ./tmp '
if not os . path . exists ( tmp_path ) :
os . makedirs ( tmp_path )
2023-03-27 21:13:36 +03:00
2023-10-24 21:09:53 +03:00
with open ( f ' { tmp_path } /vm_ids ' , ' w ' ) as ofile :
vm_ids_file = f ' { vm_ids [ " master " ] } \t { vm_names [ " master " ] } \n '
vm_ids_file + = f ' { vm_ids [ " worker1 " ] } \t { vm_names [ " worker1 " ] } \n '
vm_ids_file + = f ' { vm_ids [ " worker2 " ] } \t { vm_names [ " worker2 " ] } \n '
logger . info ( vm_ids_file )
ofile . write ( vm_ids_file )
with open ( f ' { tmp_path } /hosts ' , ' w ' ) as ofile :
2023-10-13 16:48:05 +03:00
hosts = f ' { vm_ip_master } \t { vm_names [ " master " ] } \n '
hosts + = f ' { vm_ip_worker1 } \t { vm_names [ " worker1 " ] } \n '
hosts + = f ' { vm_ip_worker2 } \t { vm_names [ " worker2 " ] } \n '
2023-10-13 15:30:35 +03:00
logger . info ( hosts )
2023-03-27 21:13:36 +03:00
ofile . write ( hosts )
2023-03-24 16:31:22 +03:00
2023-10-24 12:22:14 +03:00
inventory = {
' workers ' : {
' hosts ' : {
' worker1 ' : {
' ansible_host ' : vm_ip_worker1 ,
' ansible_user ' : ' root ' ,
} ,
' worker2 ' : {
' ansible_host ' : vm_ip_worker2 ,
' ansible_user ' : ' root ' ,
} ,
} ,
} ,
' all_vms ' : {
' hosts ' : {
' master ' : {
' ansible_host ' : vm_ip_master ,
' ansible_user ' : ' root ' ,
} ,
} ,
' children ' : {
' workers '
} ,
} ,
}
2023-03-24 16:31:22 +03:00
2023-10-24 21:09:53 +03:00
with open ( f ' { tmp_path } /generated_inventory.yaml ' , ' w ' ) as ofile :
2023-10-24 12:22:14 +03:00
yaml . dump ( inventory , ofile )
2023-03-24 16:31:22 +03:00
if __name__ == ' __main__ ' :
main ( )