2016-07-27 15:25:19 -04:00
|
|
|
//
|
|
|
|
// This file is automatically generated by scripts/generate-plugins.go -- Do not edit!
|
|
|
|
//
|
|
|
|
|
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/mitchellh/packer/packer"
|
|
|
|
"github.com/mitchellh/packer/packer/plugin"
|
|
|
|
|
|
|
|
amazonchrootbuilder "github.com/mitchellh/packer/builder/amazon/chroot"
|
|
|
|
amazonebsbuilder "github.com/mitchellh/packer/builder/amazon/ebs"
|
builder/amazon: Add `ebs-volume` builder
This commit adds a builder that works like EBS builders, except does not
create an AMI, and instead is intended to create EBS volumes in an
initialized state. For example, the following template can be used to
create and export a set of 3 EBS Volumes in a ZFS zpool named `data` for
importing by instances running production systems:
```
{
"variables": {
"aws_access_key_id": "{{ env `AWS_ACCESS_KEY_ID` }}",
"aws_secret_access_key": "{{ env `AWS_SECRET_ACCESS_KEY` }}",
"region": "{{ env `AWS_REGION` }}",
"source_ami": "{{ env `PACKER_SOURCE_AMI` }}",
"vpc_id": "{{ env `PACKER_VPC_ID` }}",
"subnet_id": "{{ env `PACKER_SUBNET_ID` }}"
},
"builders": [{
"type": "amazon-ebs-volume",
"access_key": "{{ user `aws_access_key_id` }}",
"secret_key": "{{ user `aws_secret_access_key` }}",
"region": "{{user `region`}}",
"spot_price_auto_product": "Linux/UNIX (Amazon VPC)",
"ssh_pty": true,
"instance_type": "t2.medium",
"vpc_id": "{{user `vpc_id` }}",
"subnet_id": "{{user `subnet_id` }}",
"associate_public_ip_address": true,
"source_ami": "{{user `source_ami` }}",
"ssh_username": "ubuntu",
"ssh_timeout": "5m",
"ebs_volumes": [
{
"device_name": "/dev/xvdf",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data1",
"zpool": "data",
"Component": "TeamCity"
}
},
{
"device_name": "/dev/xvdg",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data2",
"zpool": "data",
"Component": "TeamCity"
}
},
{
"device_name": "/dev/xvdh",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data3",
"zpool": "data",
"Component": "TeamCity"
}
}
]
}],
"provisioners": [
{
"type": "shell",
"start_retry_timeout": "10m",
"inline": [
"DEBIAN_FRONTEND=noninteractive sudo apt-get update",
"DEBIAN_FRONTEND=noninteractive sudo apt-get install -y zfs",
"lsblk",
"sudo parted /dev/xvdf --script mklabel GPT",
"sudo parted /dev/xvdg --script mklabel GPT",
"sudo parted /dev/xvdh --script mklabel GPT",
"sudo zpool create -m none data raidz xvdf xvdg xvdh",
"sudo zpool status",
"sudo zpool export data",
"sudo zpool status"
]
}
]
}
```
StepModifyInstance and StepStopInstance are now shared between EBS and
EBS-Volume builders - move them into the AWS common directory and rename
them to indicate that they only apply to EBS-backed builders.
2016-10-31 17:44:41 -04:00
|
|
|
amazonebsvolumebuilder "github.com/mitchellh/packer/builder/amazon/ebsvolume"
|
2016-07-27 15:25:19 -04:00
|
|
|
amazoninstancebuilder "github.com/mitchellh/packer/builder/amazon/instance"
|
|
|
|
azurearmbuilder "github.com/mitchellh/packer/builder/azure/arm"
|
|
|
|
digitaloceanbuilder "github.com/mitchellh/packer/builder/digitalocean"
|
|
|
|
dockerbuilder "github.com/mitchellh/packer/builder/docker"
|
|
|
|
filebuilder "github.com/mitchellh/packer/builder/file"
|
|
|
|
googlecomputebuilder "github.com/mitchellh/packer/builder/googlecompute"
|
|
|
|
nullbuilder "github.com/mitchellh/packer/builder/null"
|
|
|
|
openstackbuilder "github.com/mitchellh/packer/builder/openstack"
|
|
|
|
parallelsisobuilder "github.com/mitchellh/packer/builder/parallels/iso"
|
|
|
|
parallelspvmbuilder "github.com/mitchellh/packer/builder/parallels/pvm"
|
2016-08-31 08:11:10 -04:00
|
|
|
profitbricksbuilder "github.com/mitchellh/packer/builder/profitbricks"
|
2016-07-27 15:25:19 -04:00
|
|
|
qemubuilder "github.com/mitchellh/packer/builder/qemu"
|
|
|
|
virtualboxisobuilder "github.com/mitchellh/packer/builder/virtualbox/iso"
|
|
|
|
virtualboxovfbuilder "github.com/mitchellh/packer/builder/virtualbox/ovf"
|
|
|
|
vmwareisobuilder "github.com/mitchellh/packer/builder/vmware/iso"
|
|
|
|
vmwarevmxbuilder "github.com/mitchellh/packer/builder/vmware/vmx"
|
2016-09-29 17:13:04 -04:00
|
|
|
amazonimportpostprocessor "github.com/mitchellh/packer/post-processor/amazon-import"
|
|
|
|
artificepostprocessor "github.com/mitchellh/packer/post-processor/artifice"
|
|
|
|
atlaspostprocessor "github.com/mitchellh/packer/post-processor/atlas"
|
|
|
|
checksumpostprocessor "github.com/mitchellh/packer/post-processor/checksum"
|
|
|
|
compresspostprocessor "github.com/mitchellh/packer/post-processor/compress"
|
|
|
|
dockerimportpostprocessor "github.com/mitchellh/packer/post-processor/docker-import"
|
|
|
|
dockerpushpostprocessor "github.com/mitchellh/packer/post-processor/docker-push"
|
|
|
|
dockersavepostprocessor "github.com/mitchellh/packer/post-processor/docker-save"
|
|
|
|
dockertagpostprocessor "github.com/mitchellh/packer/post-processor/docker-tag"
|
|
|
|
googlecomputeexportpostprocessor "github.com/mitchellh/packer/post-processor/googlecompute-export"
|
|
|
|
manifestpostprocessor "github.com/mitchellh/packer/post-processor/manifest"
|
|
|
|
shelllocalpostprocessor "github.com/mitchellh/packer/post-processor/shell-local"
|
|
|
|
vagrantpostprocessor "github.com/mitchellh/packer/post-processor/vagrant"
|
|
|
|
vagrantcloudpostprocessor "github.com/mitchellh/packer/post-processor/vagrant-cloud"
|
2016-07-27 15:25:19 -04:00
|
|
|
vspherepostprocessor "github.com/mitchellh/packer/post-processor/vsphere"
|
2016-09-29 17:13:04 -04:00
|
|
|
ansibleprovisioner "github.com/mitchellh/packer/provisioner/ansible"
|
|
|
|
ansiblelocalprovisioner "github.com/mitchellh/packer/provisioner/ansible-local"
|
|
|
|
chefclientprovisioner "github.com/mitchellh/packer/provisioner/chef-client"
|
|
|
|
chefsoloprovisioner "github.com/mitchellh/packer/provisioner/chef-solo"
|
|
|
|
fileprovisioner "github.com/mitchellh/packer/provisioner/file"
|
|
|
|
powershellprovisioner "github.com/mitchellh/packer/provisioner/powershell"
|
|
|
|
puppetmasterlessprovisioner "github.com/mitchellh/packer/provisioner/puppet-masterless"
|
|
|
|
puppetserverprovisioner "github.com/mitchellh/packer/provisioner/puppet-server"
|
|
|
|
saltmasterlessprovisioner "github.com/mitchellh/packer/provisioner/salt-masterless"
|
|
|
|
shellprovisioner "github.com/mitchellh/packer/provisioner/shell"
|
|
|
|
shelllocalprovisioner "github.com/mitchellh/packer/provisioner/shell-local"
|
2016-07-27 15:25:19 -04:00
|
|
|
windowsrestartprovisioner "github.com/mitchellh/packer/provisioner/windows-restart"
|
|
|
|
windowsshellprovisioner "github.com/mitchellh/packer/provisioner/windows-shell"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PluginCommand struct {
|
|
|
|
Meta
|
|
|
|
}
|
|
|
|
|
|
|
|
var Builders = map[string]packer.Builder{
|
builder/amazon: Add `ebs-volume` builder
This commit adds a builder that works like EBS builders, except does not
create an AMI, and instead is intended to create EBS volumes in an
initialized state. For example, the following template can be used to
create and export a set of 3 EBS Volumes in a ZFS zpool named `data` for
importing by instances running production systems:
```
{
"variables": {
"aws_access_key_id": "{{ env `AWS_ACCESS_KEY_ID` }}",
"aws_secret_access_key": "{{ env `AWS_SECRET_ACCESS_KEY` }}",
"region": "{{ env `AWS_REGION` }}",
"source_ami": "{{ env `PACKER_SOURCE_AMI` }}",
"vpc_id": "{{ env `PACKER_VPC_ID` }}",
"subnet_id": "{{ env `PACKER_SUBNET_ID` }}"
},
"builders": [{
"type": "amazon-ebs-volume",
"access_key": "{{ user `aws_access_key_id` }}",
"secret_key": "{{ user `aws_secret_access_key` }}",
"region": "{{user `region`}}",
"spot_price_auto_product": "Linux/UNIX (Amazon VPC)",
"ssh_pty": true,
"instance_type": "t2.medium",
"vpc_id": "{{user `vpc_id` }}",
"subnet_id": "{{user `subnet_id` }}",
"associate_public_ip_address": true,
"source_ami": "{{user `source_ami` }}",
"ssh_username": "ubuntu",
"ssh_timeout": "5m",
"ebs_volumes": [
{
"device_name": "/dev/xvdf",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data1",
"zpool": "data",
"Component": "TeamCity"
}
},
{
"device_name": "/dev/xvdg",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data2",
"zpool": "data",
"Component": "TeamCity"
}
},
{
"device_name": "/dev/xvdh",
"delete_on_termination": false,
"volume_size": 10,
"volume_type": "gp2",
"tags": {
"Name": "TeamCity-Data3",
"zpool": "data",
"Component": "TeamCity"
}
}
]
}],
"provisioners": [
{
"type": "shell",
"start_retry_timeout": "10m",
"inline": [
"DEBIAN_FRONTEND=noninteractive sudo apt-get update",
"DEBIAN_FRONTEND=noninteractive sudo apt-get install -y zfs",
"lsblk",
"sudo parted /dev/xvdf --script mklabel GPT",
"sudo parted /dev/xvdg --script mklabel GPT",
"sudo parted /dev/xvdh --script mklabel GPT",
"sudo zpool create -m none data raidz xvdf xvdg xvdh",
"sudo zpool status",
"sudo zpool export data",
"sudo zpool status"
]
}
]
}
```
StepModifyInstance and StepStopInstance are now shared between EBS and
EBS-Volume builders - move them into the AWS common directory and rename
them to indicate that they only apply to EBS-backed builders.
2016-10-31 17:44:41 -04:00
|
|
|
"amazon-chroot": new(amazonchrootbuilder.Builder),
|
|
|
|
"amazon-ebs": new(amazonebsbuilder.Builder),
|
|
|
|
"amazon-ebs-volume": new(amazonebsvolumebuilder.Builder),
|
|
|
|
"amazon-instance": new(amazoninstancebuilder.Builder),
|
|
|
|
"azure-arm": new(azurearmbuilder.Builder),
|
|
|
|
"digitalocean": new(digitaloceanbuilder.Builder),
|
|
|
|
"docker": new(dockerbuilder.Builder),
|
|
|
|
"file": new(filebuilder.Builder),
|
|
|
|
"googlecompute": new(googlecomputebuilder.Builder),
|
|
|
|
"null": new(nullbuilder.Builder),
|
|
|
|
"openstack": new(openstackbuilder.Builder),
|
|
|
|
"parallels-iso": new(parallelsisobuilder.Builder),
|
|
|
|
"parallels-pvm": new(parallelspvmbuilder.Builder),
|
|
|
|
"profitbricks": new(profitbricksbuilder.Builder),
|
|
|
|
"qemu": new(qemubuilder.Builder),
|
|
|
|
"virtualbox-iso": new(virtualboxisobuilder.Builder),
|
|
|
|
"virtualbox-ovf": new(virtualboxovfbuilder.Builder),
|
|
|
|
"vmware-iso": new(vmwareisobuilder.Builder),
|
|
|
|
"vmware-vmx": new(vmwarevmxbuilder.Builder),
|
2016-07-27 15:25:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
var Provisioners = map[string]packer.Provisioner{
|
2016-09-29 17:13:04 -04:00
|
|
|
"ansible": new(ansibleprovisioner.Provisioner),
|
|
|
|
"ansible-local": new(ansiblelocalprovisioner.Provisioner),
|
|
|
|
"chef-client": new(chefclientprovisioner.Provisioner),
|
|
|
|
"chef-solo": new(chefsoloprovisioner.Provisioner),
|
|
|
|
"file": new(fileprovisioner.Provisioner),
|
|
|
|
"powershell": new(powershellprovisioner.Provisioner),
|
|
|
|
"puppet-masterless": new(puppetmasterlessprovisioner.Provisioner),
|
|
|
|
"puppet-server": new(puppetserverprovisioner.Provisioner),
|
2016-07-27 15:25:19 -04:00
|
|
|
"salt-masterless": new(saltmasterlessprovisioner.Provisioner),
|
2016-09-29 17:13:04 -04:00
|
|
|
"shell": new(shellprovisioner.Provisioner),
|
|
|
|
"shell-local": new(shelllocalprovisioner.Provisioner),
|
2016-07-27 15:25:19 -04:00
|
|
|
"windows-restart": new(windowsrestartprovisioner.Provisioner),
|
2016-09-29 17:13:04 -04:00
|
|
|
"windows-shell": new(windowsshellprovisioner.Provisioner),
|
2016-07-27 15:25:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
var PostProcessors = map[string]packer.PostProcessor{
|
2016-09-29 17:13:04 -04:00
|
|
|
"amazon-import": new(amazonimportpostprocessor.PostProcessor),
|
|
|
|
"artifice": new(artificepostprocessor.PostProcessor),
|
|
|
|
"atlas": new(atlaspostprocessor.PostProcessor),
|
|
|
|
"checksum": new(checksumpostprocessor.PostProcessor),
|
|
|
|
"compress": new(compresspostprocessor.PostProcessor),
|
|
|
|
"docker-import": new(dockerimportpostprocessor.PostProcessor),
|
|
|
|
"docker-push": new(dockerpushpostprocessor.PostProcessor),
|
|
|
|
"docker-save": new(dockersavepostprocessor.PostProcessor),
|
|
|
|
"docker-tag": new(dockertagpostprocessor.PostProcessor),
|
|
|
|
"googlecompute-export": new(googlecomputeexportpostprocessor.PostProcessor),
|
|
|
|
"manifest": new(manifestpostprocessor.PostProcessor),
|
|
|
|
"shell-local": new(shelllocalpostprocessor.PostProcessor),
|
|
|
|
"vagrant": new(vagrantpostprocessor.PostProcessor),
|
|
|
|
"vagrant-cloud": new(vagrantcloudpostprocessor.PostProcessor),
|
|
|
|
"vsphere": new(vspherepostprocessor.PostProcessor),
|
2016-07-27 15:25:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
var pluginRegexp = regexp.MustCompile("packer-(builder|post-processor|provisioner)-(.+)")
|
|
|
|
|
|
|
|
func (c *PluginCommand) Run(args []string) int {
|
|
|
|
// This is an internal call (users should not call this directly) so we're
|
|
|
|
// not going to do much input validation. If there's a problem we'll often
|
|
|
|
// just crash. Error handling should be added to facilitate debugging.
|
|
|
|
log.Printf("args: %#v", args)
|
|
|
|
if len(args) != 1 {
|
|
|
|
c.Ui.Error("Wrong number of args")
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
// Plugin will match something like "packer-builder-amazon-ebs"
|
|
|
|
parts := pluginRegexp.FindStringSubmatch(args[0])
|
|
|
|
if len(parts) != 3 {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Error parsing plugin argument [DEBUG]: %#v", parts))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
pluginType := parts[1] // capture group 1 (builder|post-processor|provisioner)
|
|
|
|
pluginName := parts[2] // capture group 2 (.+)
|
|
|
|
|
|
|
|
server, err := plugin.Server()
|
|
|
|
if err != nil {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Error starting plugin server: %s", err))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
switch pluginType {
|
|
|
|
case "builder":
|
|
|
|
builder, found := Builders[pluginName]
|
|
|
|
if !found {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Could not load builder: %s", pluginName))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
server.RegisterBuilder(builder)
|
|
|
|
case "provisioner":
|
|
|
|
provisioner, found := Provisioners[pluginName]
|
|
|
|
if !found {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Could not load provisioner: %s", pluginName))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
server.RegisterProvisioner(provisioner)
|
|
|
|
case "post-processor":
|
|
|
|
postProcessor, found := PostProcessors[pluginName]
|
|
|
|
if !found {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Could not load post-processor: %s", pluginName))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
server.RegisterPostProcessor(postProcessor)
|
|
|
|
}
|
|
|
|
|
|
|
|
server.Serve()
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*PluginCommand) Help() string {
|
|
|
|
helpText := `
|
|
|
|
Usage: packer plugin PLUGIN
|
|
|
|
|
|
|
|
Runs an internally-compiled version of a plugin from the packer binary.
|
|
|
|
|
|
|
|
NOTE: this is an internal command and you should not call it yourself.
|
|
|
|
`
|
|
|
|
|
|
|
|
return strings.TrimSpace(helpText)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *PluginCommand) Synopsis() string {
|
|
|
|
return "internal plugin command"
|
|
|
|
}
|