2023-03-11 17:19:54 +03:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
|
|
import subprocess
|
|
|
|
|
from pprint import pprint
|
|
|
|
|
|
|
|
|
|
import yaml
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with open('vars.yaml') as data:
|
|
|
|
|
vars_dict = yaml.safe_load(data)
|
|
|
|
|
|
|
|
|
|
|
2023-03-11 22:32:11 +03:00
|
|
|
|
def check_vm(id):
|
|
|
|
|
"""
|
|
|
|
|
Проверка существования ВМ.
|
|
|
|
|
|
|
|
|
|
:param id: (int), идентификатор ВМ.
|
|
|
|
|
:return: None
|
|
|
|
|
"""
|
|
|
|
|
proc = subprocess.run(f'qm status {id}'.split(), capture_output=True, text=True)
|
2023-03-11 22:37:45 +03:00
|
|
|
|
if not proc.stderr:
|
|
|
|
|
print(f'Вероятно ВМ с идентификатором - {id} уже существует')
|
2023-03-11 22:32:11 +03:00
|
|
|
|
print(proc.stderr)
|
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
|
|
2023-03-11 17:19:54 +03:00
|
|
|
|
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__":
|
2023-03-11 22:32:11 +03:00
|
|
|
|
ids = [vars_dict['template']['id']]
|
|
|
|
|
for id in vars_dict['vms']['id']:
|
|
|
|
|
ids.append(id)
|
|
|
|
|
for id in ids:
|
|
|
|
|
check_vm(id)
|
|
|
|
|
|
2023-03-11 17:19:54 +03:00
|
|
|
|
cmds = gen_vm_commands(vars_dict)
|
|
|
|
|
create_vms(cmds)
|
|
|
|
|
# pprint(cmds)
|