Skip to content

Instantly share code, notes, and snippets.

@Rene-Roscher
Last active July 13, 2025 18:01
Show Gist options
  • Select an option

  • Save Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2 to your computer and use it in GitHub Desktop.

Select an option

Save Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2 to your computer and use it in GitHub Desktop.

Revisions

  1. Rene-Roscher revised this gist Dec 24, 2023. 1 changed file with 2 additions and 4 deletions.
    6 changes: 2 additions & 4 deletions ci-image-producer.sh
    Original file line number Diff line number Diff line change
    @@ -97,10 +97,8 @@ download_and_prepare_image() {
    configure_ssh_settings() {
    echo -e "${WHITE}INFO: Konfiguriere SSH-Einstellungen${NC}"
    sudo virt-customize -a "${imageName}" \
    # --upload first-boot.sh:/etc/first-boot.sh \
    # --upload first-boot.service:/etc/systemd/system/first-boot.service \
    --run-command 'wget -P /etc/systemd/system https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.service?cache=off' \
    --run-command 'wget -P /etc https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.service?cache=off' \
    --run-command 'wget -O /etc/systemd/system/first-boot.service "https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.service"' \
    --run-command 'wget -O /etc/first-boot.sh "https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.sh"' \
    --run-command 'chmod 777 /etc/first-boot.sh' \
    --run-command 'systemctl enable first-boot.service'
    }
  2. Rene-Roscher revised this gist Dec 24, 2023. 1 changed file with 268 additions and 0 deletions.
    268 changes: 268 additions & 0 deletions ci-image-producer.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,268 @@
    #!/bin/bash

    # Farbdefinitionen
    RED='\033[0;31m'
    GREEN='\033[0;32m'
    YELLOW='\033[1;33m'
    BLUE='\033[0;34m'
    WHITE='\033[1;37m'
    NC='\033[0m' # Keine Farbe

    availableVersions="debian11, debian12, ubuntu20, ubuntu22, fedora37, fedora38, centos8, centos9"

    # Check ob alle Parameter mitgegbeen werden
    if [ $# -lt 5 ]; then
    echo ""
    echo -e "${YELLOW}ACHTUNG! Verwendung: $0 <version> <vmid> <templatename> <storage> <vmBridge>"
    echo -e "${BLUE}HINWEIS!<version>: ${availableVersions}"
    echo -e "${BLUE}HINWEIS!<vmid>: ID, die das Template erhalten soll. Diese muss einzigartig sein."
    echo -e "${BLUE}HINWEIS!<templatename>: Wie das Template heißen soll."
    echo -e "${BLUE}HINWEIS!<storage>: Das Storage, wo die VM abgelegt werden soll."
    echo -e "${BLUE}HINWEIS!<vmBridge>: Die bridge, worüber die vom erstellten Template geklonten VMs später Internet erhalten."
    echo -e "${NC}"
    exit 1
    fi

    # Debian Version, mögliche Eingabe: debian11, debian12, ubuntu20, ubuntu22, fedora37, fedora38, centos8, centos9
    version=$1

    # Template ID
    vmid=$2

    # Name des templates
    templatename=$3

    # Storage des Hosts
    storage=$4

    # VM-Bridge des Hosts
    vmBridge=$5

    imageURL=""
    imageName=""
    isFedora="false"
    isCentOS="false"

    start_template_creation(){
    download_and_prepare_image

    # Pakete und Anpassungen vornehmen
    if [ "${isFedora}" == "true" ]; then
    install_packages_fedora
    elif [ "${isCentOS}" == "true" ]; then
    install_packages_centos
    else
    install_packages
    fi

    # Root login erlauben
    configure_ssh_settings

    create_and_configure_vm

    if [ "$isCentOS" == "true" ]; then
    set_template_and_cleanup_centos
    else
    set_template_and_cleanup
    fi
    }

    # Funktion zum Herunterladen und Vorbereiten des Images
    download_and_prepare_image() {
    echo -e "${WHITE}INFO: Lösche mögliches vorhandenes Image und lade die aktuellste Version herunter${NC}"
    rm -f ${imageName}
    wget -q ${imageURL}
    }

    # Funktion zur Installation von Paketen für Ubuntu und Debian
    install_packages() {
    echo -e "${WHITE}INFO: Installiere Pakete für Ubuntu oder Debian${NC}"
    sudo virt-customize -a "${imageName}" --install qemu-guest-agent,htop,nload,iftop,iotop,git,rsync,traceroute,dnsutils,net-tools,curl,wget,cron
    }

    # Funktion zur Installation von Paketen für CentOS
    install_packages_centos() {
    echo -e "${WHITE}INFO: Installiere Pakete für CentOS${NC}"
    sudo virt-customize -a "${imageName}" --install epel-release
    sudo virt-customize -a "${imageName}" --install qemu-guest-agent,htop,nload,iftop,iotop,git,rsync,traceroute,bind-utils,net-tools,curl,wget,crontabs,nano
    }

    # Funktion zur Installation von Paketen für Fedora
    install_packages_fedora() {
    echo -e "${WHITE}INFO: Installiere Pakete für Fedora${NC}"
    sudo virt-customize -a "${imageName}" --install qemu-guest-agent,htop,nload,iftop,iotop,git,rsync,traceroute,bind-utils,net-tools,curl,wget,cronie,nano
    }

    # Funktion zum Konfigurieren der SSH-Einstellungen
    configure_ssh_settings() {
    echo -e "${WHITE}INFO: Konfiguriere SSH-Einstellungen${NC}"
    sudo virt-customize -a "${imageName}" \
    # --upload first-boot.sh:/etc/first-boot.sh \
    # --upload first-boot.service:/etc/systemd/system/first-boot.service \
    --run-command 'wget -P /etc/systemd/system https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.service?cache=off' \
    --run-command 'wget -P /etc https://gist.githubusercontent.com/Rene-Roscher/9bb1d85d436648afb832304e9dbbb9a2/raw/25c093df5a3c4ddee7a8e8720400bea713837cad/first-boot.service?cache=off' \
    --run-command 'chmod 777 /etc/first-boot.sh' \
    --run-command 'systemctl enable first-boot.service'
    }

    # Funktion zum Erstellen und Konfigurieren der VM
    create_and_configure_vm() {
    echo -e "${WHITE}INFO: Erstelle und konfiguriere VM${NC}"
    sudo qm destroy "${vmid}"
    sudo qm create "${vmid}" --name "${templatename}" --memory 2048 --cores 2 --net0 virtio,bridge="${vmBridge}",rate=31.25,firewall=0 --ciuser root --ostype l26 --agent=1,freeze-fs-on-backup=0 --searchdomain 1.1.1.1 --nameserver 8.8.8.8
    sudo qm importdisk "${vmid}" "${imageName}" "${storage}"
    sudo qm set "${vmid}" --scsihw virtio-scsi-pci --scsi0 "$storage":vm-"$vmid"-disk-0
    sudo qm set "${vmid}" --boot c --bootdisk scsi0
    sudo qm set "${vmid}" --ide2 "${storage}":cloudinit
    sudo qm set "${vmid}" --serial0 socket
    sudo qm set "${vmid}" --agent enabled=1
    }

    set_template_and_cleanup(){
    sudo qm template "${vmid}"
    rm -f "${imageName}"
    }

    set_template_and_cleanup_centos(){
    qm set "${vmid}" -cpu host
    sudo qm template "${vmid}"
    rm -f "${imageName}"
    }

    case $version in
    debian11)
    # Befehle für das Erstellen des Debian 11 Templates
    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Debian 11 Template '${templatename}' mit VMID ${vmid}"
    echo ""

    imageURL="https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-genericcloud-amd64.qcow2"
    imageName="debian-11-genericcloud-amd64.qcow2"

    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    debian12)
    # Befehle für das Erstellen des Debian 12 Templates
    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Debian 12 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2"
    imageName="debian-12-genericcloud-amd64.qcow2"

    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    ubuntu20)
    # Befehle für das Erstellen des Ubuntu 20 Templates
    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Ubuntu 20 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
    imageName="focal-server-cloudimg-amd64.img"

    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    ubuntu22)
    # Befehle für das Erstellen des Ubuntu 22 Templates

    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Ubuntu 22 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
    imageName="jammy-server-cloudimg-amd64.img"

    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    fedora37)
    # Befehle für das Erstellen des Fedora 37 Templates

    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Fedora 37 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://ftp.fau.de/fedora/linux/releases/37/Cloud/x86_64/images/Fedora-Cloud-Base-37-1.7.x86_64.qcow2"
    imageName="Fedora-Cloud-Base-37-1.7.x86_64.qcow2"
    isFedora="true"
    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    fedora38)
    # Befehle für das Erstellen des Fedora 38 Templates

    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle Fedora 38 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://ftp.fau.de/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"
    imageName="Fedora-Cloud-Base-38-1.6.x86_64.qcow2"

    isFedora="true"
    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    centos8)
    # Befehle für das Erstellen des CentOS 8 Templates

    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle CentOS 8 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-latest.x86_64.qcow2"
    imageName="CentOS-Stream-GenericCloud-8-latest.x86_64.qcow2"

    isCentOS="true"
    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    centos9)
    # Befehle für das Erstellen des CentOS 9 Templates

    echo ""
    echo -e "${YELLOW}ACHTUNG! Erstelle CentOS 9 Template '${templatename}' mit VMID ${vmid}${NC}"
    echo ""

    imageURL="https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"
    imageName="CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"

    isCentOS="true"
    start_template_creation

    echo -e "${WHITE}INFO: Template wurde erfolgreich erstellt${NC}"

    # Beenden
    ;;
    *)
    echo ""
    echo -e "${RED}FEHLER! Ungültige Version: $version"
    echo -e "${YELLOW}ACHTUNG! Erlaubte Versionen sind: ${availableVersions}"
    echo -e "${NC}"
    exit 1
    ;;
    esac
  3. Rene-Roscher created this gist Dec 24, 2023.
    11 changes: 11 additions & 0 deletions first-boot.service
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    [Unit]
    Description=First Boot Script
    After=network.target

    [Service]
    Type=oneshot
    ExecStart=/etc/first-boot.sh
    RemainAfterExit=true

    [Install]
    WantedBy=multi-user.target
    20 changes: 20 additions & 0 deletions first-boot.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    #!/bin/bash

    # Ändern der SSH-Konfiguration
    sed -i "/^#\\?PasswordAuthentication/c\PasswordAuthentication yes" /etc/ssh/sshd_config
    sed -i "/PasswordAuthentication no/PasswordAuthentication yes" /etc/ssh/sshd_config
    sed -i "/^#\\?PermitRootLogin/c\PermitRootLogin yes" /etc/ssh/sshd_config
    systemctl restart sshd

    # Setzen des Nameservers
    rm /etc/resolv.conf
    touch /etc/resolv.conf
    echo "nameserver 8.8.8.8" > /etc/resolv.conf
    systemctl restart systemd-resolved

    systemctl disable first-boot.service
    rm /etc/systemd/system/first-boot.service
    systemctl daemon-reload

    # Löschen des Skripts nach Ausführung
    rm -- "$0"