IMPORTANT: this project has been superseded by the multi-component Exoscale plugin, and will not be updated anymore.
The exoscale
builder plugin can be used with HashiCorp Packer
to create a new instance template from a Compute
instance volume snapshot. This plugin creates a Compute instance in your
Exoscale organization, logs into it via SSH to execute configured
provisioners and then snapshots the storage volume of the instance to
register a custom template from the exported snapshot.
Note: the exoscale
Packer builder only supports UNIX-like operating
systems (e.g. GNU/Linux, *BSD...). To build Exoscale custom templates for
other OS, we recommend using the QEMU builder combined with the
exoscale-import Packer post-processor plugin.
You can find pre-built releases of the plugin here.
Once you have downloaded the latest archive corresponding to your target OS,
uncompress it to retrieve the packer-builder-exoscale
plugin binary file.
To install the plugin, please follow the official Packer documentation on
installing a plugin.
If you prefer to build the plugin from sources, clone the GitHub repository
locally and run the command make build
from the root of the sources
directory. Upon successful compilation, a packer-builder-exoscale
plugin
binary file can be found in the bin/
directory.
To install the plugin, please follow the official Packer documentation on
installing a plugin.
Here is the list of supported configuration parameters by the builder.
-
api_key
(string) - The API key used to communicate with Exoscale services. -
api_secret
(string) - The API secret used to communicate with Exoscale services. -
instance_template
(string) - The name of the template to use when creating the Compute instance. -
template_zone
(string) - The Exoscale zone in which to create the template. -
template_name
(string) - The name of the template.
-
api_endpoint
(string) - The API endpoint used to communicate with the Exoscale API. Defaults tohttps://api.exoscale.com/v1
. -
instance_type
(string) - The instance type of the Compute instance. Defaults toMedium
. -
instance_name
(string) - The name of the Compute instance. Defaults topacker-<BUILD ID>
. -
instance_zone
(string) - The Exoscale zone in which to create the Compute instance. Defaults to the value oftemplate_zone
. -
instance_template_filter
(string) - The template filter to specify for theinstance_template
parameter. Defaults tofeatured
. -
instance_disk_size
(int) - Volume disk size in GB of the Compute instance to create. Defaults to50
. -
instance_security_groups
(list of strings) - List of Security Groups (names) to apply to the Compute instance. Defaults to["default"]
. -
instance_private_networks
(list of strings) - List of Private Networks (names) to attach to the Compute instance. -
instance_ssh_key
(string) - Name of the Exoscale SSH key to use with the Compute instance. If unset, a throwaway SSH key namedpacker-<BUILD ID>
will be created before creating the instance, and destroyed after a successful build. -
template_description
(string) - The description of the template. -
template_username
(string) - An optional username to be used to log into Compute instances using this template. -
template_boot_mode
(string) - The template boot mode. Supported values:legacy
(default),uefi
. -
template_disable_password
(boolean) - Whether the template should disable Compute instance password reset. Defaults tofalse
. -
template_disable_sshkey
(boolean) - Whether the template should disable SSH key installation during Compute instance creation. Defaults tofalse
.
In addition to plugin-specific configuration parameters, you can also adjust the SSH communicator settings to configure how Packer will log into the Compute instance.
Here is an example of a simple Packer configuration using the exoscale
builder:
{
"variables": {
"api_key": "{{env `EXOSCALE_API_KEY`}}",
"api_secret": "{{env `EXOSCALE_API_SECRET`}}"
},
"builders": [{
"type": "exoscale",
"api_key": "{{user `api_key`}}",
"api_secret": "{{user `api_secret`}}",
"instance_template": "Linux Ubuntu 20.04 LTS 64-bit",
"template_zone": "ch-gva-2",
"template_name": "my-app",
"template_username": "ubuntu",
"ssh_username": "ubuntu"
}],
"provisioners": [{
"type": "shell",
"execute_command": "chmod +x {{.Path}}; sudo {{.Path}}",
"scripts": ["install.sh"]
}]
}
The same configuration in HCL format (only with Packer >= 1.5.0):
variable "api_key" { default = "" }
variable "api_secret" { default = "" }
source "exoscale" "my-app" {
api_key = var.api_key
api_secret = var.api_secret
instance_template = "Linux Ubuntu 20.04 LTS 64-bit"
instance_security_group = "packer"
template_zone = "ch-gva-2"
template_name = "my-app"
template_username = "ubuntu"
ssh_username = "ubuntu"
}
build {
sources = ["source.exoscale.test"]
provisioner "shell" {
execute_command = "chmod +x {{.Path}}; sudo {{.Path}}"
scripts = ["install.sh"]
}
}
To build your template using Packer, run the following command:
$ packer build my-app.pkr.hcl
exoscale: output will be in this color.
==> exoscale: Build ID: brjpaeh8d3b2liin7pm0
==> exoscale: Creating Compute instance
==> exoscale: Using ssh communicator to connect: 159.100.242.23
==> exoscale: Waiting for SSH to become available...
==> exoscale: Connected to SSH!
==> exoscale: Provisioning with shell script: install.sh
==> exoscale: Stopping Compute instance
==> exoscale: Creating Compute instance snapshot
==> exoscale: Exporting Compute instance snapshot
==> exoscale: Registering Compute instance template
==> exoscale: Destroying Compute instance template
Build 'exoscale' finished.
==> Builds finished. The artifacts of successful builds are:
--> exoscale: my-app @ ch-gva-2 (423e0bda-f127-417e-9c10-4e412d596478)
$ exo vm template show 423e0bda-f127-417e-9c10-4e412d596478
┼───────────────┼──────────────────────────────────────┼
│ TEMPLATE │ │
┼───────────────┼──────────────────────────────────────┼
│ ID │ 423e0bda-f127-417e-9c10-4e412d596478 │
│ Name │ my-app │
│ OS Type │ Other (64-bit) │
│ Creation Date │ 2020-06-15T17:40:27+0200 │
│ Zone │ ch-gva-2 │
│ Disk Size │ 50 GiB │
│ Username │ ubuntu │
│ Password? │ true │
┼───────────────┼──────────────────────────────────────┼
- If you think you've found a bug in the code or you have a question regarding the usage of this software, please reach out to us by opening an issue in this GitHub repository.
- Contributions to this project are welcome: if you want to add a feature or a fix a bug, please do so by opening a Pull Request in this GitHub repository. In case of feature contribution, we kindly ask you to open an issue to discuss it beforehand.