Advertisement
PhoenyxRLP

Create multiple VM with libvirt

Dec 29th, 2023
1,040
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.05 KB | Source Code | 0 0
  1. #!/usr/bin/python3
  2.  
  3. import crypt
  4. import yaml
  5. import os
  6. import random
  7. import string
  8. import subprocess
  9. import shutil
  10. import time
  11. import os
  12.  
  13. def create_iso_from_config(config, directory):
  14.     """Erstellt eine cloud-init.iso aus einem YAML-Config-Objekt und speichert sie im gegebenen Verzeichnis."""
  15.     content = '#cloud-config\n'
  16.     yaml_content = yaml.dump(config)
  17.     lines = yaml_content.split('\n')[1:-1]
  18.     content += '\n'.join(lines)
  19.    
  20.     with open(f'{directory}/cloud-init.cfg', 'w') as file:
  21.         file.write(content)
  22.  
  23.     # Erzeugen der ISO
  24.     subprocess.run(
  25.         ['sudo', 'cloud-localds', f'{directory}/cloud-init.iso', f'{directory}/cloud-init.cfg'],
  26.         check=True,
  27.     )
  28.  
  29. def create_vms(num_vms, base_name, parent_directory):
  30.     for i in range(1, num_vms + 1):
  31.         hostname = f"{base_name}{i:02d}"
  32.         directory = f"{parent_directory}/vm_{hostname}"
  33.  
  34.         qcow2_path = f"{directory}/{hostname}.qcow2"
  35.         iso_path = f"{directory}/cloud-init.iso"
  36.  
  37.         # Erstellen der VM
  38.         subprocess.run(
  39.             [
  40.                 "sudo",
  41.                 "virt-install",
  42.                 "--name", f"{hostname}",
  43.                 "--memory", "2048",
  44.                 "--disk", f"{qcow2_path},device=disk,bus=virtio,size=10",
  45.                 "--disk", f"{iso_path},device=cdrom",
  46.                 "--os-variant", "debian10",
  47.                 "--virt-type", "kvm",
  48.                 "--graphics", "none",
  49.                 "--network", "network=default,model=virtio",
  50.                 "--import",
  51.                 "--noautoconsole",
  52.             ],
  53.             check=True,
  54.         )
  55.  
  56.         print(f"VM {i} erstellt.")
  57.  
  58. def get_vm_ips():
  59.     """Gibt die IP-Adressen der erstellten VMs zurück."""
  60.     try:
  61.         output = subprocess.check_output(['sudo', 'virsh', 'net-dhcp-leases', 'default']).decode('utf-8').split('\n')
  62.         ips = [line.split()[4] for line in output[2:] if line]
  63.         return ips
  64.     except subprocess.CalledProcessError:
  65.         return []
  66.  
  67. # Hauptteil des Skripts
  68. num_vms = int(input("Gib die Anzahl der zu erstellenden VMs ein: "))
  69. print(f"Anzahl der VMs: {num_vms}")
  70.  
  71. base_name = input("Gib den gewünschten Grundnamen für die VMs ein (z.B. debiantestvm): ")
  72. print(f"Grundname für die VMs: {base_name}")
  73.  
  74. username = input("Gib den Usernamen für den System User ein: ")
  75. print(f"Username: {username}")
  76. password = input("Gib das Password für den System User ein und merke es dir bitte, da es nicht mehr im Klartext angezeigt wird: ")
  77.  
  78. random_salt_string = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
  79. print(f"Random Salt String: {random_salt_string}")
  80.  
  81. ssh_public_keys = input("Gib bitte dem Public SSH Key für den User ein: ")
  82. print(f"SSH Public Keys: {ssh_public_keys}")
  83.  
  84. # home_direcotry = os.path.expanduser('~')
  85. # parent_directory = "/home/mehrentraut/cloudimages"
  86. home_directory = os.path.expanduser("~")
  87. parent_directory = os.path.join(home_directory, "cloudimages")
  88.  
  89. print(parent_directory)
  90.  
  91. for i in range(1, num_vms + 1):
  92.     print(f"\nEinstellungen für VM {i}")
  93.  
  94.     hostname = f"{base_name}{i:02d}"
  95.     print(f"Hostname für VM {i}: {hostname}")
  96.  
  97.     hashed_password = crypt.crypt(password, '$6$rounds=4096$' + random_salt_string)
  98.     print(f"Hashed Password für VM {i}: {hashed_password}")
  99.  
  100.     root_user = {
  101.         'name': 'root',
  102.         'ssh_authorized_keys': ssh_public_keys,
  103.     }
  104.  
  105.     main_user = {
  106.         'name': username,
  107.         'hashed_passwd': hashed_password,
  108.         'sudo': 'ALL=(ALL) NOPASSWD:ALL',
  109.         'shell': "/bin/bash",
  110.         'lock-passwd': False,
  111.         'ssh_authorized_keys': ssh_public_keys,
  112.     }
  113.  
  114.     users = [root_user, main_user]
  115.     print(f"Konfigurierte Benutzer für VM {i}: {users}")
  116.  
  117.     config = {
  118.         'hostname': hostname,
  119.         'manage_etc_hosts': False,
  120.         'ssh_pwauth': False,
  121.         'disable_root': True,
  122.         'users': users,
  123.         'locale': 'de_DE.UTF-8',
  124.         'keyboard': {
  125.             'layout': 'de'
  126.         }
  127.     }
  128.     print(f"Konfiguration für VM {i}: {config}")
  129.  
  130.     directory = f"{parent_directory}/vm_{hostname}"
  131.     if not os.path.exists(directory):
  132.         os.makedirs(directory)
  133.     print(f"Verzeichnis für VM {i}: {directory}")
  134.  
  135.     create_iso_from_config(config, directory)
  136.     print(f"ISO-Datei und Config für VM {i} erstellt.")
  137.  
  138.     src_qcow2 = "/home/mehrentraut/Downloads/debian-12-generic-amd64.qcow2"
  139.     dest_qcow2 = f"{parent_directory}/vm_{hostname}/{hostname}.qcow2"
  140.     shutil.copy(src_qcow2, dest_qcow2)
  141.     print(f"QCOW2-Datei für VM {i} kopiert.")
  142.  
  143. create_vms(num_vms, base_name, parent_directory)
  144.  
  145. print("\nWarte 10 Sekunden, um sicherzustellen, dass VMs gestartet sind...")
  146. time.sleep(10)
  147.  
  148. # Anzeigen der IP-Adressen der VMs
  149. vm_ips = get_vm_ips()
  150. if vm_ips:
  151.     print("\nIP-Adressen der erstellten VMs:")
  152.     for i, ip in enumerate(vm_ips, 1):
  153.         print(f"VM {i}: {ip}")
  154. else:
  155.     print("\nEs wurden keine IP-Adressen für die VMs gefunden.")
  156.  
  157. print("\nVM-Erstellung abgeschlossen! Hier sind die IP Adressen:")
Tags: python vm libvirt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement