165 lines
4.6 KiB
Python
165 lines
4.6 KiB
Python
import os
|
|
import logging
|
|
import urllib3
|
|
from typing import Callable, List
|
|
from time import sleep
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
from proxmoxer import ProxmoxAPI
|
|
|
|
from functions import clone_template, get_vm_ip
|
|
|
|
urllib3.disable_warnings()
|
|
|
|
FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
|
|
logging.basicConfig(format=FORMAT)
|
|
logger = logging.getLogger(__name__)
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
|
|
PROXMOX_HOST = 'pve.office.basealt.ru'
|
|
PROXMOX_USER = 'stepchenkoas'
|
|
PROXMOX_USER_FULL = PROXMOX_USER + '@BaseALT'
|
|
PROXMOX_PASSWORD = Path('pve_secret').read_text().strip()
|
|
|
|
|
|
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
|
|
|
|
def main():
|
|
proxmox = ProxmoxAPI(
|
|
PROXMOX_HOST, user=PROXMOX_USER_FULL, password=PROXMOX_PASSWORD, verify_ssl=False
|
|
)
|
|
|
|
nodes = proxmox.nodes.get()
|
|
nodes = list(filter(lambda node: node['status'] == 'online', nodes))
|
|
node = min(nodes, key=lambda node: node['disk'])['node']
|
|
template_id = 374
|
|
prefix = PROXMOX_USER + '-test-k8s'
|
|
vm_names = {
|
|
'master': f'{prefix}-master',
|
|
'worker1': f'{prefix}-node1',
|
|
'worker2': f'{prefix}-node2',
|
|
}
|
|
vm_ids = {
|
|
'master': 500,
|
|
'worker1': 501,
|
|
'worker2': 502,
|
|
}
|
|
|
|
vm_id_master, upid_master = clone_template(
|
|
proxmox,
|
|
node,
|
|
template_id,
|
|
newid=vm_ids['master'],
|
|
name=vm_names['master'],
|
|
)
|
|
assert vm_id_master == vm_ids['master']
|
|
|
|
vm_id_worker1, upid_worker1 = clone_template(
|
|
proxmox,
|
|
node,
|
|
template_id,
|
|
newid=vm_ids['worker1'],
|
|
name=vm_names['worker1'],
|
|
)
|
|
assert vm_id_worker1 == vm_ids['worker1']
|
|
|
|
vm_id_worker2, upid_worker2 = clone_template(
|
|
proxmox,
|
|
node,
|
|
template_id,
|
|
newid=vm_ids['worker2'],
|
|
name=vm_names['worker2'],
|
|
)
|
|
assert vm_id_worker2 == vm_ids['worker2']
|
|
|
|
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...')
|
|
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()
|
|
wait_status(
|
|
[
|
|
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,
|
|
],
|
|
'running'
|
|
)
|
|
|
|
sleep(40)
|
|
logger.info('VMs are running!')
|
|
|
|
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'])
|
|
proxmox.logout()
|
|
|
|
tmp_path = './tmp'
|
|
if not os.path.exists(tmp_path):
|
|
os.makedirs(tmp_path)
|
|
|
|
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:
|
|
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'
|
|
logger.info(hosts)
|
|
ofile.write(hosts)
|
|
|
|
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'
|
|
},
|
|
},
|
|
}
|
|
|
|
with open(f'{tmp_path}/generated_inventory.yaml', 'w') as ofile:
|
|
yaml.dump(inventory, ofile)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|