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__ )
logger . setLevel ( logging . DEBUG )
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 12:23:45 +03:00
with open ( ' run/vm_ids ' , ' w ' ) as ofile :
2023-10-13 16:48:05 +03:00
vm_ids = f ' { vm_id_master } \t { vm_names [ " master " ] } \n '
vm_ids + = f ' { vm_id_worker1 } \t { vm_names [ " worker1 " ] } \n '
vm_ids + = f ' { vm_id_worker2 } \t { vm_names [ " worker2 " ] } \n '
2023-10-13 15:30:35 +03:00
logger . info ( vm_ids )
2023-03-27 21:13:36 +03:00
ofile . write ( vm_ids )
2023-10-24 12:23:45 +03:00
with open ( ' run/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 12:22:14 +03:00
with open ( ' run/generated_inventory.yaml ' , ' w ' ) as ofile :
yaml . dump ( inventory , ofile )
2023-03-24 16:31:22 +03:00
if __name__ == ' __main__ ' :
main ( )