91 lines
2.8 KiB
Python
Executable File
91 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
|
||
import subprocess
|
||
from pprint import pprint
|
||
|
||
import yaml
|
||
|
||
|
||
with open('vars.yaml') as data:
|
||
vars_dict = yaml.safe_load(data)
|
||
|
||
|
||
def check_vm(id):
|
||
"""
|
||
Проверка существования ВМ.
|
||
|
||
:param id: (int), идентификатор ВМ.
|
||
:return: None
|
||
"""
|
||
proc = subprocess.run(f'qm status {id}'.split(), capture_output=True, text=True)
|
||
if not proc.stderr:
|
||
print(f'Вероятно ВМ с идентификатором - {id} уже существует')
|
||
print(proc.stderr)
|
||
exit(1)
|
||
|
||
|
||
def shell_run(cmd):
|
||
"""
|
||
Выполнение shell команды.
|
||
|
||
:param cmd: (str), команда.
|
||
:return: proc.stdout: (subprocess object), вывод команды
|
||
proc.stderr: (subprocess object), код завершения.
|
||
"""
|
||
proc = subprocess.run(
|
||
cmd.split(), capture_output=True, text=True, timeout=60)
|
||
if proc.stderr:
|
||
print(f'Команда - "{cmd}"')
|
||
print(proc.stderr)
|
||
exit(1)
|
||
return proc.stdout, proc.stderr
|
||
|
||
|
||
def gen_vm_commands(all_dict):
|
||
"""
|
||
Генерация списка команд для создания группировки ВМ ALD Pro.
|
||
:param all_dict: (dict), словарь с переменными для генерации.
|
||
:return: (dict), словарь списков команд.
|
||
"""
|
||
tmpl_id = all_dict['template']['id']
|
||
gw = all_dict['proxmox_node']['vmbr_gw']
|
||
commands = {}
|
||
for vm in vars_dict['vms']:
|
||
vm_cmds = [f'qm clone {tmpl_id} {vm["id"]} --name {vm["name"]} --full',
|
||
f'qm set {vm["id"]} --ipconfig0 ip={vm["ip"]}/24,gw={gw}',
|
||
f'qm resize {vm["id"]} scsi0 32G']
|
||
if vm["name"] == 'dc01' or vm["name"] == 'dc02':
|
||
vm_cmds.append(f'qm set {vm["id"]} --cores 4 --memory 8192')
|
||
vm_cmds.remove(f'qm resize {vm["id"]} scsi0 32G')
|
||
vm_cmds.append(f'qm resize {vm["id"]} scsi0 64G')
|
||
elif vm["name"] == 'repo':
|
||
vm_cmds.remove(f'qm resize {vm["id"]} scsi0 32G')
|
||
vm_cmds.append(f'qm resize {vm["id"]} scsi0 64G')
|
||
commands.update({vm["name"]: vm_cmds})
|
||
return commands
|
||
|
||
|
||
def create_vms(commands_dict):
|
||
"""
|
||
Создание группировки ВМ ALD Pro.
|
||
|
||
:param commands_dict: (dict), словарь списков команд для создания ВМ.
|
||
:return: None
|
||
"""
|
||
for role in commands_dict.items():
|
||
print(f'Создаётся ВМ - {role[0]}')
|
||
for cmd in role[1]:
|
||
shell_run(cmd)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
ids = [vars_dict['template']['id']]
|
||
for id in vars_dict['vms']['id']:
|
||
ids.append(id)
|
||
for id in ids:
|
||
check_vm(id)
|
||
|
||
cmds = gen_vm_commands(vars_dict)
|
||
create_vms(cmds)
|
||
# pprint(cmds)
|