deploy_aldpro/deploy_aldpro_vm.py

91 lines
2.8 KiB
Python
Raw Permalink Normal View History

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)