Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import crypt
- import yaml
- import os
- import random
- import string
- import subprocess
- import shutil
- import time
- import os
- def create_iso_from_config(config, directory):
- """Erstellt eine cloud-init.iso aus einem YAML-Config-Objekt und speichert sie im gegebenen Verzeichnis."""
- content = '#cloud-config\n'
- yaml_content = yaml.dump(config)
- lines = yaml_content.split('\n')[1:-1]
- content += '\n'.join(lines)
- with open(f'{directory}/cloud-init.cfg', 'w') as file:
- file.write(content)
- # Erzeugen der ISO
- subprocess.run(
- ['sudo', 'cloud-localds', f'{directory}/cloud-init.iso', f'{directory}/cloud-init.cfg'],
- check=True,
- )
- def create_vms(num_vms, base_name, parent_directory):
- for i in range(1, num_vms + 1):
- hostname = f"{base_name}{i:02d}"
- directory = f"{parent_directory}/vm_{hostname}"
- qcow2_path = f"{directory}/{hostname}.qcow2"
- iso_path = f"{directory}/cloud-init.iso"
- # Erstellen der VM
- subprocess.run(
- [
- "sudo",
- "virt-install",
- "--name", f"{hostname}",
- "--memory", "2048",
- "--disk", f"{qcow2_path},device=disk,bus=virtio,size=10",
- "--disk", f"{iso_path},device=cdrom",
- "--os-variant", "debian10",
- "--virt-type", "kvm",
- "--graphics", "none",
- "--network", "network=default,model=virtio",
- "--import",
- "--noautoconsole",
- ],
- check=True,
- )
- print(f"VM {i} erstellt.")
- def get_vm_ips():
- """Gibt die IP-Adressen der erstellten VMs zurück."""
- try:
- output = subprocess.check_output(['sudo', 'virsh', 'net-dhcp-leases', 'default']).decode('utf-8').split('\n')
- ips = [line.split()[4] for line in output[2:] if line]
- return ips
- except subprocess.CalledProcessError:
- return []
- # Hauptteil des Skripts
- num_vms = int(input("Gib die Anzahl der zu erstellenden VMs ein: "))
- print(f"Anzahl der VMs: {num_vms}")
- base_name = input("Gib den gewünschten Grundnamen für die VMs ein (z.B. debiantestvm): ")
- print(f"Grundname für die VMs: {base_name}")
- username = input("Gib den Usernamen für den System User ein: ")
- print(f"Username: {username}")
- password = input("Gib das Password für den System User ein und merke es dir bitte, da es nicht mehr im Klartext angezeigt wird: ")
- random_salt_string = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
- print(f"Random Salt String: {random_salt_string}")
- ssh_public_keys = input("Gib bitte dem Public SSH Key für den User ein: ")
- print(f"SSH Public Keys: {ssh_public_keys}")
- # home_direcotry = os.path.expanduser('~')
- # parent_directory = "/home/mehrentraut/cloudimages"
- home_directory = os.path.expanduser("~")
- parent_directory = os.path.join(home_directory, "cloudimages")
- print(parent_directory)
- for i in range(1, num_vms + 1):
- print(f"\nEinstellungen für VM {i}")
- hostname = f"{base_name}{i:02d}"
- print(f"Hostname für VM {i}: {hostname}")
- hashed_password = crypt.crypt(password, '$6$rounds=4096$' + random_salt_string)
- print(f"Hashed Password für VM {i}: {hashed_password}")
- root_user = {
- 'name': 'root',
- 'ssh_authorized_keys': ssh_public_keys,
- }
- main_user = {
- 'name': username,
- 'hashed_passwd': hashed_password,
- 'sudo': 'ALL=(ALL) NOPASSWD:ALL',
- 'shell': "/bin/bash",
- 'lock-passwd': False,
- 'ssh_authorized_keys': ssh_public_keys,
- }
- users = [root_user, main_user]
- print(f"Konfigurierte Benutzer für VM {i}: {users}")
- config = {
- 'hostname': hostname,
- 'manage_etc_hosts': False,
- 'ssh_pwauth': False,
- 'disable_root': True,
- 'users': users,
- 'locale': 'de_DE.UTF-8',
- 'keyboard': {
- 'layout': 'de'
- }
- }
- print(f"Konfiguration für VM {i}: {config}")
- directory = f"{parent_directory}/vm_{hostname}"
- if not os.path.exists(directory):
- os.makedirs(directory)
- print(f"Verzeichnis für VM {i}: {directory}")
- create_iso_from_config(config, directory)
- print(f"ISO-Datei und Config für VM {i} erstellt.")
- src_qcow2 = "/home/mehrentraut/Downloads/debian-12-generic-amd64.qcow2"
- dest_qcow2 = f"{parent_directory}/vm_{hostname}/{hostname}.qcow2"
- shutil.copy(src_qcow2, dest_qcow2)
- print(f"QCOW2-Datei für VM {i} kopiert.")
- create_vms(num_vms, base_name, parent_directory)
- print("\nWarte 10 Sekunden, um sicherzustellen, dass VMs gestartet sind...")
- time.sleep(10)
- # Anzeigen der IP-Adressen der VMs
- vm_ips = get_vm_ips()
- if vm_ips:
- print("\nIP-Adressen der erstellten VMs:")
- for i, ip in enumerate(vm_ips, 1):
- print(f"VM {i}: {ip}")
- else:
- print("\nEs wurden keine IP-Adressen für die VMs gefunden.")
- print("\nVM-Erstellung abgeschlossen! Hier sind die IP Adressen:")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement