Skip to content

Instantly share code, notes, and snippets.

@pawaanv
Forked from cloudnull/lab-rises.sh
Created July 12, 2018 06:39
Show Gist options
  • Save pawaanv/c95f4f7866891f1f0e1713f871166bbf to your computer and use it in GitHub Desktop.
Save pawaanv/c95f4f7866891f1f0e1713f871166bbf to your computer and use it in GitHub Desktop.

Revisions

  1. Kevin Carter created this gist Jul 23, 2017.
    941 changes: 941 additions & 0 deletions lab-rises.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,941 @@
    ############################# ON ERL3 #############################
    # First SSH to the ELR3 then edit the configuration
    configure # drops you into the configuration terminal

    # Set the boot file.
    set service dhcp-server shared-network-name LAN1 subnet 172.16.24.0/22 bootfile-name pxelinux.0

    # Set the boot server.
    set service dhcp-server shared-network-name LAN1 subnet 172.16.24.0/22 bootfile-server 172.16.24.90

    # Set the TFTP server to the same as the bootfile-server (assuming they're the same in your case)
    set service dhcp-server shared-network-name LAN1 subnet 172.16.24.0/22 tftp-server-name 172.16.24.90

    # Now commit the changes and save
    commit
    save

    # Exit the configuration terminal
    exit

    # Log out of the ERL3
    exit
    ############################# ON ERL3 #############################






    ############################# ON PXE SERVER #############################
    set -eouv

    export tftpboot_dir="/var/lib/tftpboot"
    export tftp_server="172.16.24.90"
    export tftp_ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvCFVPmVN37Ti2ypHal3k23rSi3/FMhSGoHruyOSRCEobnWl/y86QA8D8I2GgwWi4z1qNv62KQyYGLDW6gHoBdx+X/jktu6DbyejY3h55T3fxo0gUPkQnBVGvg6KmtHNGMLzv+GExMuYnp2hSJ5ATgvh2edlYEqMIdAnMazecQ3Ia86qPiYcuB75V7t65NsDa5Io1iIiqLOaHXH//MXXXlfKr+RGnvv9VuhTy+dErYPa1Bl/mPvlist7zw860Wb3aQyFTObomIPbJIojpw/AKXKT4lyDRmdsqj8qKcCEIXW9zgFMUqbdF+lBtmOI05FU9csVrMTDrsz+jIQSIYbcGX [email protected]"
    export image_url="http://releases.ubuntu.com/16.04.2/ubuntu-16.04.2-server-amd64.iso"
    export image_name="$(basename ${image_url})"
    export image_short_name="$(basename -s .iso ${image_name})"

    # Web server setup
    apt install -y tftpd-hpa inetutils-inetd nginx p7zip-full p7zip-rar
    cat > /etc/nginx/sites-enabled/default <<EOF
    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/pxe;
    location / {
    autoindex on;
    }
    }
    EOF

    systemctl restart nginx

    cat > /etc/default/tftpd-hpa <<EOF
    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/var/lib/tftpboot"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="--secure"
    RUN_DAEMON="yes"
    OPTIONS="-l -s /var/lib/tftpboot"
    EOF

    cat > /etc/inetd.conf <<EOF
    tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
    EOF

    systemctl restart tftpd-hpa
    systemctl restart inetutils-inetd

    # PXE server setup
    mkdir -p /var/www/pxe
    mkdir -p /var/www/pxe/scripts
    mkdir -p /var/www/pxe/networking
    mkdir -p /var/www/pxe/iso
    mkdir -p /var/www/pxe/images

    chown -R www-data:www-data /var/www
    chmod -R 2774 /var/www

    pushd /var/www/pxe
    pushd iso
    if [[ ! -f "${image_name}" ]]; then
    wget "${image_url}" -O "${image_name}"
    fi
    popd
    pushd images
    if [[ -d "${image_short_name}" ]]; then
    rm -rf "${image_short_name}"
    fi
    mkdir "${image_short_name}"
    pushd "${image_short_name}"
    7z x "/var/www/pxe/iso/${image_name}"
    popd
    popd
    popd

    mkdir -p "${tftpboot_dir}"
    mkdir -p "${tftpboot_dir}/boot-screens"
    mkdir -p "${tftpboot_dir}/preseed"
    mkdir -p "${tftpboot_dir}/pxelinux.cfg"

    cp -av "/var/www/pxe/images/${image_short_name}/install/netboot/ubuntu-installer" "${tftpboot_dir}/${image_short_name}"

    pushd "/var/www/pxe/images/${image_short_name}/isolinux"
    cp ldlinux.c32 "${tftpboot_dir}/"
    popd

    pushd "${tftpboot_dir}/${image_short_name}/amd64/"
    cp pxelinux.0 "${tftpboot_dir}/"
    pushd boot-screens
    cp libcom32.c32 "${tftpboot_dir}/boot-screens/"
    cp libutil.c32 "${tftpboot_dir}/boot-screens/"
    cp vesamenu.c32 "${tftpboot_dir}/boot-screens/"
    popd
    popd

    cat > ${tftpboot_dir}/pxelinux.cfg/default <<EOF
    path boot-screens
    include boot-screens/menu.cfg
    default boot-screens/vesamenu.c32
    prompt 0
    timeout 100
    EOF

    pushd ${tftpboot_dir}/boot-screens
    ln -f ../pxelinux.cfg/default syslinux.cfg
    popd

    cat > ${tftpboot_dir}/boot-screens/menu.cfg <<EOF
    menu hshift 13
    menu width 49
    menu margin 8
    menu tabmsg
    menu title Boot Menu
    label local
    menu label ^Boot local hard drive
    LOCALBOOT 0
    label auto-ubuntu-16.04-vm
    menu label ^Ubuntu 16.04 vm automated install
    kernel ${image_short_name}/amd64/linux
    append biosdevname=0 net.ifnames=0 auto=true priority=critical vga=789 initrd=${image_short_name}/amd64/initrd.gz preseed/url=tftp://${tftp_server}/preseed/ubuntu-16.04-vm-preseed.cfg preseed/interactive=false netcfg/choose_interface=eth0
    label auto-ubuntu-16.04-mnaio
    menu label ^Ubuntu 16.04 mnaio automated install
    kernel ${image_short_name}/amd64/linux
    append biosdevname=0 net.ifnames=0 auto=true priority=critical vga=789 initrd=${image_short_name}/amd64/initrd.gz preseed/url=tftp://${tftp_server}/preseed/ubuntu-16.04-mnaio-preseed.cfg preseed/interactive=false netcfg/choose_interface=eth0
    menu begin ubuntu-16.04
    menu title Ubuntu 16.04
    label mainmenu
    menu label ^Back..
    menu exit
    include ${image_short_name}/amd64/boot-screens/menu.cfg
    menu end
    EOF

    # create the default profile for a given mac address
    count=1
    for i in infra1 infra2 infra3 compute1 swift1 cinder1; do
    VM_NAME="${i}"
    cat > "${tftpboot_dir}/pxelinux.cfg/01-52-54-00-bd-80-$(printf "%02d" ${count})" <<EOF
    default linux
    prompt 0
    timeout 1
    label linux
    kernel ${image_short_name}/amd64/linux
    append hostname=${VM_NAME} biosdevname=0 net.ifnames=0 auto=true priority=critical vga=789 initrd=${image_short_name}/amd64/initrd.gz preseed/url=tftp://${tftp_server}/preseed/ubuntu-16.04-vm-preseed.cfg preseed/interactive=false netcfg/choose_interface=eth0
    EOF
    count=$((count + 1))
    done

    cat > ${tftpboot_dir}/preseed/ubuntu-16.04-vm-preseed.cfg <<EOF
    # Ubuntu Server 16.04 Preseed
    # Kernel Options
    # Use the following option to add additional boot parameters for the
    # installed system (if supported by the bootloader installer).
    # Note: options passed to the installer will be added automatically.
    d-i debian-installer/add-kernel-opts string biosdevname=0 net.ifnames=0
    # Networking
    d-i netcfg/choose_interface select eth0
    d-i netcfg/dhcp_timeout string 60
    d-i netcfg/get_hostname string common1
    d-i netcfg/get_domain string common1.openstackci.local
    ## USE THIS FOR STATIC NETWORKING
    # d-i netcfg/disable_autoconfig boolean true
    # d-i netcfg/dhcp_failed note
    # d-i netcfg/dhcp_options select Configure network manually
    # # Static network configuration.
    # d-i netcfg/get_ipaddress string 10.0.0.100
    # d-i netcfg/get_netmask string 255.255.255.0
    # d-i netcfg/get_gateway string 10.0.0.200
    # d-i netcfg/get_nameservers string 8.8.8.8
    # d-i netcfg/confirm_static boolean true
    ## USE THIS FOR STATIC NETWORKING
    # Disable that annoying WEP key dialog.
    d-i netcfg/wireless_wep string
    # Pre Install
    # Command Line 1: This is necessary otherwise you will be prompted to umount /dev/vda. See Ubuntu bug #1347726.
    d-i preseed/early_command string \
    umount /media || true
    # Net Image
    # Required at least for 12.10+
    d-i live-installer/net-image string http://${tftp_server}/images/${image_short_name}/install/filesystem.squashfs
    # Localization
    d-i debian-installer/locale string en
    d-i debian-installer/country string US
    d-i debian-installer/locale string en_US.UTF-8
    d-i debian-installer/language string en
    # Keyboard
    # Disable automatic (interactive) keymap detection.
    d-i console-setup/ask_detect boolean false
    d-i console-setup/layoutcode string us
    d-i console-setup/variantcode string
    d-i keyboard-configuration/layoutcode string us
    # Mirror
    d-i mirror/country string manual
    d-i mirror/http/proxy string
    d-i mirror/http/hostname string archive.ubuntu.com
    d-i mirror/http/directory string /ubuntu
    # Clock and Time Zone
    # Controls whether to use NTP to set the clock during the install
    d-i clock-setup/ntp boolean true
    d-i clock-setup/ntp-server string ntp.ubuntu.com
    # You may set this to any valid setting for TZ; see the contents of
    # /usr/share/zoneinfo/ for valid values.
    d-i time/zone string US/Central
    # Controls whether or not the hardware clock is set to UTC.
    d-i clock-setup/utc boolean true
    # Partitioning
    # If one of the disks that are going to be automatically partitioned
    # contains an old LVM configuration, the user will normally receive a
    # warning. This can be preseeded away...
    d-i partman-lvm/device_remove_lvm boolean true
    d-i partman-lvm/device_remove_lvm_span boolean true
    d-i partman-auto/purge_lvm_from_device boolean true
    # The same applies to pre-existing software RAID array:
    d-i partman-md/device_remove_md boolean true
    # And the same goes for the confirmation to write the lvm partitions.
    d-i partman-lvm/confirm boolean true
    d-i partman-lvm/confirm_nooverwrite boolean true
    d-i partman-auto/method string lvm
    d-i partman-auto/disk string /dev/[sv]da
    # For LVM partitioning, you can select how much of the volume group to use
    # for logical volumes.
    d-i partman-auto-lvm/guided_size string max
    d-i partman-auto/choose_recipe select custompartitioning
    d-i partman-auto/expert_recipe string \
    custompartitioning :: \
    512 1 512 ext2 \
    \$primary{ } \
    \$bootable{ } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ ext2 } \
    label{ boot } \
    mountpoint{ /boot } \
    . \
    1024 1 100% ext4 \
    \$primary{ } \
    method{ lvm } \
    vg_name{ vg00 } \
    . \
    1024 512 800% linux-swap \
    \$lvmok{ } \
    in_vg{ vg00 } \
    lv_name{ swap00 } \
    method{ swap } \
    label{ swap } \
    format{ } \
    . \
    16384 5000 100% ext4 \
    \$lvmok{ } \
    in_vg{ vg00 } \
    lv_name{ root00 } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ ext4 } \
    label{ root } \
    mountpoint{ / } \
    . \
    81920 1000 100% ext4 \
    \$lvmok{ } \
    in_vg{ vg00 } \
    lv_name{ openstack00 } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ ext4 } \
    label{ openstack } \
    mountpoint{ /openstack } \
    . \
    81920 1000 100% btrfs \
    \$lvmok{ } \
    in_vg{ vg00 } \
    lv_name{ machines00 } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ btrfs } \
    label{ machines } \
    mountpoint{ /var/lib/machines } \
    . \
    # This makes partman automatically partition without confirmation, provided
    # that you told it what to do using one of the methods above.
    d-i partman-partitioning/confirm_write_new_label boolean true
    d-i partman/choose_partition select finish
    d-i partman/confirm boolean true
    d-i partman/confirm_nooverwrite boolean true
    # Packages
    # Package selection
    tasksel tasksel/first multiselect openssh-server
    # Whether to upgrade packages after debootstrap.
    # Allowed values: none, safe-upgrade, full-upgrade
    d-i pkgsel/upgrade select none
    d-i pkgsel/include string bridge-utils \
    dstat \
    ethtool \
    git \
    htop \
    ifenslave \
    lvm2 \
    openssh-server \
    parted \
    python-all \
    tmux \
    vim \
    vlan
    d-i pkgsel/update-policy select none
    # Some versions of the installer can report back on what software you have
    # installed, and what software you use. The default is not to report back,
    # but sending reports helps the project determine what software is most
    # popular and include it on CDs.
    popularity-contest popularity-contest/participate boolean false
    # Users and Password
    # Skip creation of a root account (normal user account will be able to
    # use sudo). The default is false; preseed this to true if you want to set
    # a root password.
    d-i passwd/root-login boolean true
    # Alternatively, to skip creation of a normal user account.
    d-i passwd/make-user boolean false
    # The installer will warn about weak passwords. If you are sure you know
    # what you're doing and want to override it, uncomment this.
    d-i user-setup/allow-password-weak boolean true
    # Root password, either in clear text
    d-i passwd/root-password password secrete
    d-i passwd/root-password-again password secrete
    # Bootloader
    # This is fairly safe to set, it makes grub install automatically to the MBR
    # if no other operating system is detected on the machine.
    d-i grub-installer/only_debian boolean true
    # Post Install
    d-i preseed/late_command string \
    in-target bash -c 'apt-get remove --purge snap* lxc* lxd* || true'; \
    sed -i 's/\(GRUB_CMDLINE_LINUX_DEFAULT=\).*/\1\"\"/g' /target/etc/default/grub; \
    in-target bash -c 'update-grub'; \
    sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \
    mkdir /target/root/.ssh; \
    chmod 0700 /target/root/.ssh; \
    echo "${tftp_ssh_key}" >> /target/root/.ssh/authorized_keys; \
    in-target bash -c "wget http://${tftp_server}/networking/\$(hostname)-bridges.cfg -O /etc/network/interfaces.d/vm-bridges.cfg"; \
    in-target bash -c "wget http://${tftp_server}/networking/basic-interface.cfg -O /etc/network/interfaces"
    # Finish
    # Reboot after the install is finished.
    finish-install finish-install/reboot_in_progress note
    EOF

    cat > ${tftpboot_dir}/preseed/ubuntu-16.04-mnaio-preseed.cfg <<EOF
    # Ubuntu Server 16.04 Preseed
    # Kernel Options
    # Use the following option to add additional boot parameters for the
    # installed system (if supported by the bootloader installer).
    # Note: options passed to the installer will be added automatically.
    d-i debian-installer/add-kernel-opts string biosdevname=0 net.ifnames=0
    # Networking
    d-i netcfg/choose_interface select eth0
    d-i netcfg/dhcp_timeout string 60
    d-i netcfg/get_hostname string host1
    d-i netcfg/get_domain string host1.openstack.local
    ## USE THIS FOR STATIC NETWORKING
    # d-i netcfg/disable_autoconfig boolean true
    # d-i netcfg/dhcp_failed note
    # d-i netcfg/dhcp_options select Configure network manually
    # # Static network configuration.
    # d-i netcfg/get_ipaddress string 10.0.0.100
    # d-i netcfg/get_netmask string 255.255.255.0
    # d-i netcfg/get_gateway string 10.0.0.200
    # d-i netcfg/get_nameservers string 8.8.8.8
    # d-i netcfg/confirm_static boolean true
    ## USE THIS FOR STATIC NETWORKING
    # Disable that annoying WEP key dialog.
    d-i netcfg/wireless_wep string
    # Pre Install
    # Command Line 1: This is necessary otherwise you will be prompted to umount /dev/vda. See Ubuntu bug #1347726.
    d-i preseed/early_command string \
    umount /media || true
    # Net Image
    # Required at least for 12.10+
    d-i live-installer/net-image string http://${tftp_server}/images/${image_short_name}/install/filesystem.squashfs
    # Localization
    d-i debian-installer/locale string en
    d-i debian-installer/country string US
    d-i debian-installer/locale string en_US.UTF-8
    d-i debian-installer/language string en
    # Keyboard
    # Disable automatic (interactive) keymap detection.
    d-i console-setup/ask_detect boolean false
    d-i console-setup/layoutcode string us
    d-i console-setup/variantcode string
    d-i keyboard-configuration/layoutcode string us
    # Mirror
    d-i mirror/country string manual
    d-i mirror/http/proxy string
    d-i mirror/http/hostname string archive.ubuntu.com
    d-i mirror/http/directory string /ubuntu
    # Clock and Time Zone
    # Controls whether to use NTP to set the clock during the install
    d-i clock-setup/ntp boolean true
    d-i clock-setup/ntp-server string ntp.ubuntu.com
    # You may set this to any valid setting for TZ; see the contents of
    # /usr/share/zoneinfo/ for valid values.
    d-i time/zone string US/Central
    # Controls whether or not the hardware clock is set to UTC.
    d-i clock-setup/utc boolean true
    # Partitioning
    # If one of the disks that are going to be automatically partitioned
    # contains an old LVM configuration, the user will normally receive a
    # warning. This can be preseeded away...
    d-i partman-lvm/device_remove_lvm boolean true
    d-i partman-lvm/device_remove_lvm_span boolean true
    d-i partman-auto/purge_lvm_from_device boolean true
    # The same applies to pre-existing software RAID array:
    d-i partman-md/device_remove_md boolean true
    # And the same goes for the confirmation to write the lvm partitions.
    d-i partman-lvm/confirm boolean true
    d-i partman-lvm/confirm_nooverwrite boolean true
    d-i partman-md/confirm boolean true
    d-i partman-md/confirm_nooverwrite boolean true
    d-i partman-basicfilesystems/choose_label string gpt
    d-i partman-basicfilesystems/default_label string gpt
    d-i partman-partitioning/choose_label string gpt
    d-i partman-partitioning/default_label string gpt
    d-i partman/choose_label string gpt
    d-i partman/default_label string gpt
    d-i partman-auto/method string raid
    d-i partman-auto/disk string /dev/[sv]da /dev/[sv]db
    # For LVM partitioning, you can select how much of the volume group to use
    # for logical volumes.
    d-i partman-auto-lvm/guided_size string max
    d-i partman-auto-lvm/new_vg_name string vg00
    d-i partman-auto/choose_recipe select custompartitioning
    d-i partman-auto/expert_recipe string \
    custompartitioning :: \
    1 1 1 free \
    \$gptonly{ } \
    \$primary{ } \
    \$bios_boot{ } \
    method{ biosgrub } \
    . \
    256 1 512 raid \
    \$gptonly{ } \
    \$lvmignore{ } \
    \$primary{ } \
    \$bootable{ } \
    method{ raid } \
    raidid{ 1 } \
    . \
    204800 1 -1 raid \
    \$gptonly{ } \
    \$lvmignore{ } \
    method{ raid } \
    raidid{ 2 } \
    . \
    1024 512 400% linux-swap \
    \$defaultignore{ } \
    \$lvmok{ } \
    method{ swap } \
    format{ } \
    . \
    16384 5000 100% ext4 \
    \$defaultignore{ } \
    \$lvmok{ } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ ext4 } \
    mountpoint{ / } \
    . \
    81920 1000 100% ext4 \
    \$defaultignore{ } \
    \$lvmok{ } \
    lv_name{ openstack00 } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ ext4 } \
    label{ openstack } \
    mountpoint{ /openstack } \
    . \
    81920 1000 100% btrfs \
    \$defaultignore{ } \
    \$lvmok{ } \
    lv_name{ machines00 } \
    method{ format } \
    format{ } \
    use_filesystem{ } \
    filesystem{ btrfs } \
    label{ machines } \
    mountpoint{ /var/lib/machines } \
    . \
    d-i partman-auto-raid/recipe string \
    0 2 0 ext2 /boot raidid=1 \
    /dev/[sv]da1#/dev/[sv]db1 \
    . \
    0 2 0 lvm - raidid=2 \
    /dev/[sv]da5#/dev/[sv]db5 \
    . \
    # This makes partman automatically partition without confirmation, provided
    # that you told it what to do using one of the methods above.
    d-i partman-partitioning/confirm_write_new_label boolean true
    d-i partman/choose_partition select finish
    d-i partman/confirm boolean true
    d-i partman/confirm_nooverwrite boolean true
    # Packages
    # Package selection
    tasksel tasksel/first multiselect openssh-server
    # Whether to upgrade packages after debootstrap.
    # Allowed values: none, safe-upgrade, full-upgrade
    d-i pkgsel/upgrade select full-upgrade
    d-i pkgsel/include string bridge-utils \
    dstat \
    ethtool \
    git \
    htop \
    ifenslave \
    libvirt-bin \
    lvm2 \
    openssh-server \
    parted \
    python3-all \
    python-all \
    qemu-kvm \
    systemd-container \
    tmux \
    vim \
    virt-manager \
    virtinst \
    vlan
    d-i pkgsel/update-policy select none
    # Some versions of the installer can report back on what software you have
    # installed, and what software you use. The default is not to report back,
    # but sending reports helps the project determine what software is most
    # popular and include it on CDs.
    popularity-contest popularity-contest/participate boolean false
    # Users and Password
    # Skip creation of a root account (normal user account will be able to
    # use sudo). The default is false; preseed this to true if you want to set
    # a root password.
    d-i passwd/root-login boolean true
    # Alternatively, to skip creation of a normal user account.
    d-i passwd/make-user boolean false
    # The installer will warn about weak passwords. If you are sure you know
    # what you're doing and want to override it, uncomment this.
    d-i user-setup/allow-password-weak boolean true
    # Root password, either in clear text
    d-i passwd/root-password password secrete
    d-i passwd/root-password-again password secrete
    # Bootloader
    # This is fairly safe to set, it makes grub install automatically to the MBR
    # if no other operating system is detected on the machine.
    d-i grub-installer/only_debian boolean true
    # Post Install
    d-i preseed/late_command string \
    in-target bash -c 'apt-get remove --purge snap* lxc* lxd* || true'; \
    sed -i 's/\(GRUB_CMDLINE_LINUX_DEFAULT=\).*/\1\"\"/g' /target/etc/default/grub; \
    in-target bash -c 'update-grub'; \
    sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \
    mkdir /target/root/.ssh; \
    chmod 0700 /target/root/.ssh; \
    echo "${tftp_ssh_key}" >> /target/root/.ssh/authorized_keys; \
    in-target bash -c "wget http://${tftp_server}/networking/mnaio-bridges.cfg -O /etc/network/interfaces.d/mnaio-bridges.cfg"; \
    in-target bash -c "wget http://${tftp_server}/networking/basic-interface.cfg -O /etc/network/interfaces"
    # Finish
    # Reboot after the install is finished.
    finish-install finish-install/reboot_in_progress note
    EOF

    cat > /var/www/pxe/networking/vm-bridges.cfg <<EOF
    # Physical interface, could be bond. This only needs to be set once
    # for the physical device MANAGEMENT Network
    auto eth1
    iface eth1 inet manual
    # FLAT Network
    auto eth2
    iface eth2 inet manual
    # VLAN Network
    auto eth3
    iface eth3 inet manual
    # TUNNEL Network
    auto eth4
    iface eth4 inet manual
    # STORAGE Network
    auto eth5
    iface eth5 inet manual
    auto br-dhcp
    iface br-dhcp inet dhcp
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports eth0
    offload-sg off
    auto br-mgmt
    iface br-mgmt inet static
    bridge_stp off
    bridge_waitport 10
    bridge_fd 0
    bridge_ports eth1
    address 10.0.236.__COUNT__
    netmask 255.255.252.0
    offload-sg off
    auto br-flat
    iface br-flat inet static
    bridge_stp off
    bridge_waitport 10
    bridge_fd 0
    bridge_ports eth2
    address 10.0.248.__COUNT__
    netmask 255.255.252.0
    offload-sg off
    auto br-vlan
    iface br-vlan inet manual
    bridge_stp off
    bridge_waitport 10
    bridge_fd 0
    bridge_ports eth3
    offload-sg off
    auto br-vxlan
    iface br-vxlan inet static
    bridge_stp off
    bridge_waitport 10
    bridge_fd 0
    bridge_ports eth4
    address 10.0.240.__COUNT__
    netmask 255.255.252.0
    offload-sg off
    # To ensure ssh checksum is correct
    up /sbin/iptables -A POSTROUTING -t mangle -p tcp --dport 22 -j CHECKSUM --checksum-fill
    down /sbin/iptables -D POSTROUTING -t mangle -p tcp --dport 22 -j CHECKSUM --checksum-fill
    # To provide internet connectivity to instances
    up /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    down /sbin/iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    # Make sure instances can talk to the metadata server
    up /sbin/iptables -t mangle -A POSTROUTING -p tcp --sport 80 -j CHECKSUM --checksum-fill
    auto br-storage
    iface br-storage inet static
    bridge_stp off
    bridge_waitport 10
    bridge_fd 0
    bridge_ports eth5
    address 10.0.244.__COUNT__
    netmask 255.255.252.0
    offload-sg off
    EOF

    cat > /var/www/pxe/networking/mnaio-bridges.cfg <<EOF
    #### SYSTEM INTEGRATION DEVICES ####
    auto br-dhcp
    iface br-dhcp inet dhcp
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports eth0
    offload-sg off
    iface br-dhcp inet static
    address 10.29.234.200
    netmask 255.255.255.0
    # This is an autoconfigured IPv6 interface
    iface br-dhcp inet6 auto
    #### SYSTEM INTEGRATION DEVICES ####
    #### BRIDGES USED FOR VM INTERFACES ####
    # MANAGEMENT Network
    auto vm-br-eth1
    iface vm-br-eth1 inet static
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports none
    address 10.29.236.200
    netmask 255.255.252.0
    offload-sg off
    # FLAT Network
    auto vm-br-eth2
    iface vm-br-eth2 inet static
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports none
    address 10.29.248.200
    netmask 255.255.252.0
    offload-sg off
    # VLAN Network
    auto vm-br-eth3
    iface vm-br-eth3 inet manual
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports none
    offload-sg off
    # TUNNEL Network
    auto vm-br-eth4
    iface vm-br-eth4 inet manual
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports none
    offload-sg off
    # STORAGE Network
    auto vm-br-eth5
    iface vm-br-eth5 inet manual
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0
    bridge_ports none
    offload-sg off
    #### INTERFACES USED FOR VM BRIDGES ####
    EOF

    cat > /var/www/pxe/networking/basic-interface.cfg <<EOF
    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5).
    # The loopback network interface
    auto lo
    iface lo inet loopback
    # The primary network interface
    auto eth0
    iface eth0 inet manual
    source /etc/network/interfaces.d/*.cfg
    EOF

    count=1
    for i in infra1 infra2 infra3 compute1 swift1 cinder1; do
    VM_NAME="${i}"
    sed "s|__COUNT__|$(printf "%02d" ${count})|g" /var/www/pxe/networking/vm-bridges.cfg > /var/www/pxe/networking/${VM_NAME}-bridges.cfg
    count=$((count + 1))
    done

    # Fix perms if needed
    find "${tftpboot_dir}" -type d -exec chmod 0755 {} \;
    find "${tftpboot_dir}" -type f -exec chmod 0644 {} \;
    ############################# ON PXE SERVER #############################






    ############################# ON BOOTED VM HOST #############################
    # on the mnaio host this is used to setup the libvirt network default configs
    mkdir -p /opt/mnaio/templates
    cat > /opt/mnaio/templates/libvirt-network-template.xml <<EOF
    <network>
    <name>__NETWORK__</name>
    <forward mode="bridge"/>
    <bridge name="__NETWORK__"/>
    </network>
    EOF

    # Remove the original virsh network, we will not need this, then create the integration bridges
    mkdir -p /opt/mnaio/scripts
    cat > /opt/mnaio/scripts/libvirt-networking.sh <<EOF
    if virsh net-list | grep -qw "default"; then
    virsh net-autostart default --disable
    virsh net-destroy default
    fi
    # Create the libvirt networks used for the Host VMs
    for network in br-dhcp vm-br-eth1 vm-br-eth2 vm-br-eth3 vm-br-eth4 vm-br-eth5; do
    if ! virsh net-list | grep -qw "\${network}"; then
    sed "s/__NETWORK__/\${network}/g" /opt/mnaio/templates/libvirt-network-template.xml > /etc/libvirt/qemu/networks/\${network}.xml
    virsh net-define --file /etc/libvirt/qemu/networks/\${network}.xml
    virsh net-create --file /etc/libvirt/qemu/networks/\${network}.xml
    virsh net-autostart \${network}
    fi
    done
    EOF

    # Create the volume group vg01 on our space disk
    vgcreate vg01 /dev/sdc1

    # Create a storage pool on our volume group so that VMs can use it
    virsh pool-create-as vg01 logical
    virsh pool-dumpxml vg01 > /etc/libvirt/storage/vg01.xml
    virsh pool-define /etc/libvirt/storage/vg01.xml
    virsh pool-autostart vg01
    ############################# ON BOOTED VM HOST #############################






    ############################# CREATE VM #############################
    count=1
    for i in infra1 infra2 infra3 compute1 swift1 cinder1; do
    VM_NAME="${i}"
    VM_SIZE=$((${#VM_NAME} * 16))
    echo y | lvcreate -n ${VM_NAME} -L ${VM_SIZE}G vg01
    sed "s|__name__|${VM_NAME}|g" /opt/mnaio/templates/vm.xml > /etc/libvirt/qemu/${VM_NAME}.xml
    sed -i "s|__mac__|$(printf "%02d" ${count})|g" /etc/libvirt/qemu/${VM_NAME}.xml
    virsh define /etc/libvirt/qemu/${VM_NAME}.xml
    virsh create /etc/libvirt/qemu/${VM_NAME}.xml
    virsh start ${VM_NAME} || true
    count=$((count + 1))
    done
    ############################# CREATE VM #############################






    ############################# DELETE VM #############################
    for i in infra1 infra2 infra3 compute1 swift1 cinder1; do
    VM_NAME="${i}"
    virsh destroy ${VM_NAME} || true
    virsh undefine ${VM_NAME}
    echo y | lvremove /dev/mapper/vg01-${VM_NAME}
    rm /etc/libvirt/qemu/${VM_NAME}.xml
    done
    ############################# DELETE VM #############################