Bootstrap Packer template for libvirt and Vbox (#48)

This PR contains a provisioning mechanism for the Vagrant boxes we ship
as part of Sandbox.

In order to self contain and distribute the required dependencies for Tinkerbell
and Sandbox without having to download all of them runtime we decided to use
[Packer.io](https://packer.io) to build boxes that you can use when provisioning
Tinkerbell on Vagrant.

Currently the generated boxes are available via [Vagrant
Cloud](https://app.vagrantup.com/tinkerbelloss).

Signed-off-by: Gianluca Arbezzano <gianarb92@gmail.com>
This commit is contained in:
mergify[bot] 2021-02-04 09:53:22 +00:00 committed by GitHub
commit 58937939c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 108 additions and 56 deletions

View File

@ -15,7 +15,8 @@ end
Vagrant.configure('2') do |config| Vagrant.configure('2') do |config|
config.vm.define :provisioner do |provisioner| config.vm.define :provisioner do |provisioner|
provisioner.vm.box = 'generic/ubuntu1804' provisioner.vm.box = "tinkerbelloss/sandbox-ubuntu1804"
provisioner.vm.box_version = "0.1.0"
provisioner.vm.hostname = 'provisioner' provisioner.vm.hostname = 'provisioner'
provisioner.vm.synced_folder './../../', '/vagrant' provisioner.vm.synced_folder './../../', '/vagrant'
provisioner.vm.provision :shell, path: './scripts/tinkerbell.sh' provisioner.vm.provision :shell, path: './scripts/tinkerbell.sh'

1
deploy/vagrant/basebox/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
output*

View File

@ -0,0 +1,30 @@
This directory contains a provisioning mechanism for the Vagrant boxes we ship
as part of Sandbox.
In order to self contain and distribute the required dependencies for Tinkerbell
and Sandbox without having to download all of them at runtime we decided to use
[Packer.io](https://packer.io) to build boxes that you can use when provisioning
Tinkerbell on Vagrant.
Currently the generated boxes are available via [Vagrant
Cloud](https://app.vagrantup.com/tinkerbelloss).
---
## Build
To build the boxes checkout the right directory and run
```terminal
$ packer build --parallel-builds=1 ./template.json
```
`-parallel-builds=1` is required because the template builds images for multiple
providers using the [Vagrant
builder](https://www.packer.io/docs/builders/vagrant) and I didn't manage to get
it to work in parallel yet.
## Deploy to Vagrant Cloud
I didn't find a way to make the Vagrant Cloud post processor to work. But I use
the vagrant cli `vagrant cloud publish` command.

View File

@ -0,0 +1,47 @@
#!/bin/bash
# abort this script on errors
set -euxo pipefail
setup_docker() (
# steps from https://docs.docker.com/engine/install/ubuntu/
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
sudo apt-key add -
local repo
repo=$(
printf "deb [arch=amd64] https://download.docker.com/linux/ubuntu %s stable" \
"$(lsb_release -cs)"
)
sudo add-apt-repository "$repo"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
)
setup_docker_compose() (
# from https://docs.docker.com/compose/install/
sudo curl -L \
"https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
)
main() (
export DEBIAN_FRONTEND=noninteractive
sudo apt-get update
setup_docker
setup_docker_compose
sudo apt-get install -y jq
sudo usermod -aG docker vagrant
)
main

View File

@ -0,0 +1,27 @@
{
"builders": [
{
"communicator": "ssh",
"name": "vagrant-virtualbox",
"provider": "virtualbox",
"source_path": "generic/ubuntu1804",
"type": "vagrant"
},
{
"communicator": "ssh",
"name": "vagrant-libvirt",
"provider": "libvirt",
"source_path": "generic/ubuntu1804",
"type": "vagrant"
}
],
"provisioners": [
{
"script": "provision.sh",
"type": "shell"
}
],
"variables": {
"cloud_token": "{{ env `VAGRANT_CLOUD_TOKEN` }}"
}
}

View File

@ -7,38 +7,6 @@ whoami
cd /vagrant cd /vagrant
setup_docker() (
# steps from https://docs.docker.com/engine/install/ubuntu/
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
sudo apt-key add -
local repo
repo=$(
printf "deb [arch=amd64] https://download.docker.com/linux/ubuntu %s stable" \
"$(lsb_release -cs)"
)
sudo add-apt-repository "$repo"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
)
setup_docker_compose() (
# from https://docs.docker.com/compose/install/
sudo curl -L \
"https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
)
make_certs_writable() ( make_certs_writable() (
local certdir="/etc/docker/certs.d/$TINKERBELL_HOST_IP" local certdir="/etc/docker/certs.d/$TINKERBELL_HOST_IP"
sudo mkdir -p "$certdir" sudo mkdir -p "$certdir"
@ -50,13 +18,7 @@ secure_certs() (
sudo chown "root" "$certdir" sudo chown "root" "$certdir"
) )
command_exists() (
command -v "$@" >/dev/null 2>&1
)
configure_vagrant_user() ( configure_vagrant_user() (
sudo usermod -aG docker vagrant
echo -n "$TINKERBELL_REGISTRY_PASSWORD" | echo -n "$TINKERBELL_REGISTRY_PASSWORD" |
sudo -iu vagrant docker login \ sudo -iu vagrant docker login \
--username="$TINKERBELL_REGISTRY_USERNAME" \ --username="$TINKERBELL_REGISTRY_USERNAME" \
@ -72,20 +34,6 @@ setup_nat() (
main() ( main() (
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
apt-get update
if ! command_exists docker; then
setup_docker
fi
if ! command_exists docker-compose; then
setup_docker_compose
fi
if ! command_exists jq; then
sudo apt-get install -y jq
fi
if [ ! -f ./.env ]; then if [ ! -f ./.env ]; then
./generate-envrc.sh eth1 >.env ./generate-envrc.sh eth1 >.env
fi fi
@ -98,9 +46,7 @@ main() (
./setup.sh ./setup.sh
setup_nat setup_nat
secure_certs secure_certs
configure_vagrant_user configure_vagrant_user
) )

View File

@ -14,5 +14,5 @@ in
with pkgs; with pkgs;
mkShell { mkShell {
buildInputs = [ go nodePackages.prettier shellcheck shfmt terraform gpgme ]; buildInputs = [ go nodePackages.prettier shellcheck shfmt terraform gpgme packer vagrant ];
} }