Giter Site home page Giter Site logo

swipswaps / gopxe Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ppetko/gopxe

0.0 0.0 0.0 103.75 MB

PXE Booting/Kickstart - Container running dhcpd, tftpd and golang APIs

License: MIT License

Go 66.86% Shell 6.82% Dockerfile 4.01% Makefile 5.21% HTML 17.10%

gopxe's Introduction

GoPXE Project

CircleCI

Introduction

GoPXE is a dynamic build system for installing various operating systems on virtual machines and bare metal servers using pxe boot, tftp and dhcp wrapped into docker container orchestrated by APIs.

Quickstart

Download docker image

docker pull ppetko/gopxe

Configuration - edit the configuration files accordingly. Sample configs has been provided in the repo.

curl -s https://raw.githubusercontent.com/ppetko/GoPXE/master/conf/dhcpd.conf -b dhcpd.conf
curl -s https://raw.githubusercontent.com/ppetko/GoPXE/master/conf/tftpd.conf -b tftpd.conf
vi dhcpd.conf # and edit accordingly.

Start GoPXE using Docker image

sudo docker run --rm --net=host --name goPXE -td \
            --mount type=bind,source="$(pwd)"/dhcpd.conf,target=/etc/dhcp/dhcpd.conf \
            --mount type=bind,source="$(pwd)"/tftpd.conf,target=/etc/xinetd.d/tftp \
            ppetko/gopxe

Build your own docker image

go get github.com/ppetko/gopxe
cd $GOPATH/src/github.com/ppetko/gopxe
sudo make docker-build

How PXE works?

  • The target host (the PXE client) is booted.
  • The target host makes a DHCP request.
  • The DHCP server responds with the IP information and provides information about the location of a TFTP server.
  • When the client receives the information, it contacts the TFTP server requesting the file that the DHCP server specified (in this case, the network boot loader).
  • The TFTP server sends the network boot loader, and the client executes it.
  • PXELINUX searches for a configuration file on the TFTP server, and boots a kernel according to that configuration file (centos7/vmlinux and centos7/vmlizimage). In this case, the configuration file instructs PXE to load the kernel (vmlinuz) and a ramdisk (initrd.img).
  • The client downloads the files it needs and then loads them.
  • The system boots the OS installer using our Kickstart service.
  • The installer runs interactively or scripted, as directed by the PXE configuration file.
  • The installer uses remote repository, or locally content from ISO file.
  • OS is installed.

APIs Reference Examples

Note: Parameters are specific to your environment.

Create BootAction

  • PXEBoot images are already configured for centos7 in pxebootImages/centos7, so these options are valid kernel:centos7/vmlinux and initrd:centos7/vmlizimage. You can add different specific version or different OS images in pxebootImages.
  • myfirstbootaction is the name of your boot action. You can create many bootactions with specific parameters as long as the names are different.
curl -vv -H "Content-Type: application/json" -d \
'{
  "default": "linux",
  "label": "linux",
  "menu": "centos7",
  "kernel": "centos7/vmlinuz",
  "ksdevice": "link",
  "ip": "dhcp",
  "load_ramdisk": "1",
  "initrd":"centos7/initrd.img"
}' -X POST localhost:9090/bootaction/myfirstbootaction

  • bootaction: myfirstbootaction will reference your bootaction created earlier.
  • ksfile - this will reference the default kickstart which is preload. You can add you own kickstart file in ksTempl/
  • os and version - will be used to build repository in the default kickstart. If you are not using the default kickstart file, leave these options empty.
  • If you want to PXEBoot using mac address instead of UUID, use "uuid": "01-YOUR-MAC-ADDRESS" option.

Create basic PXEBoot record

curl -vv  -H "Content-Type: application/json" -d \
'{
  "bootaction": "myfirstbootaction",
  "ksfile": "default",
  "os": "centos-7",
  "version": "7.5.1804",
  "hostname": "test-myvm.local",
  "uuid": "42330d5a-0ead-f7fa-4e3a-ae3bdcb08c69"
}' http://localhost:9090/pxeboot

  • hostname, ip, mask, ns1, ns2, gw, will be used to build network configuration in the default kickstart

Create PXEBoot record with network options

curl -vv  -H "Content-Type: application/json" -d \
'{
  "bootaction": "vmtemplate",
  "ksfile": "default",
  "os": "centos-7",
  "version": "7.5.1804",
  "hostname": "test-myvm1.local",
  "ip": "10.1.20.50",
  "mask": "255.255.255.0",
  "ns1": "8.8.8.8",
  "ns2": "8.8.4.4",
  "gw": "10.1.20.1",
  "uuid": "42330d5a-0ead-f7fa-4e3a-ae3bdcb08c69"
}' http://localhost:9090/pxeboot

Results

default linux
 label linux
 MENU LABEL centos7
 KERNEL centos7/vmlinuz
 APPEND ksdevice=link ip=dhcp load_ramdisk=1 initrd=centos7/initrd.img ks=http://localhost:9090/kickstart/?name=default&os=centos-7&version=7.5.1804&fqdn=test-myvm1.local&ip=10.1.20.50&mask=255.255.255.0&gw=255.255.255.0&ns1=8.8.8.8&ns2=8.8.4.4

Setup local install images

# wget http://mirror.cc.columbia.edu/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso
# mkdir /mnt/iso
# mount -t iso9660 -o loop CentOS-7-x86_64-Minimal-1804.iso  /mnt/iso/

Once you have all files in /mnt/iso/, start and mount /mnt/iso/ inside the docker container.

sudo docker run --rm --net=host --name goPXE -td \
            --mount type=bind,source="$(pwd)"/conf/dhcpd.conf,target=/etc/dhcp/dhcpd.conf \
            --mount type=bind,source="$(pwd)"/conf/tftpd.conf,target=/etc/xinetd.d/tftp \
            --mount type=bind,source="/mnt/iso/",target=/opt/localrepo \
            ppetko/gopxe

TODO

  • Add function documentation and godocs generation.
  • Add test code coverage for the rest of the code base.
  • Add piplene build for the project.

RoadMap

  • Create Ansible hook - API endpoint that accepts ansible run configs per specific host.
  • Create status output of the job and perhaps synch the results back to the db.
  • Add Status dashboard
  • Manage(start, stop, restart) dhcpd and tftpd processes from the main application instead of bash
  • Output logs to html web page from dhcpd and the rest of the app so the user could easily troubleshoot.
  • Add Notifications/Status API (calling home with errors type)
  • Add multi OS support. Add paramerts for pxelinux.0. Currenly we can configure only one OS at the time.

Notes

  • Currently suported OS is CentOS/RedHat by the default installation. But you could reconfigure GoPXE for any other OS of choice.

Pull requests welcome!

If you'd like to contribute to the project, refer to the contributing documentation.

License

Creative Commons Attribution License

gopxe's People

Contributors

ppetko avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.