2019-06-06 10:45:37 -04:00
|
|
|
//go:generate struct-markdown
|
2019-10-14 10:43:59 -04:00
|
|
|
//go:generate mapstructure-to-hcl2 -type Config
|
2019-06-06 10:45:37 -04:00
|
|
|
|
2013-05-09 17:16:39 -04:00
|
|
|
// The amazonebs package contains a packer.Builder implementation that
|
|
|
|
// builds AMIs for Amazon EC2.
|
|
|
|
//
|
|
|
|
// In general, there are two types of AMIs that can be created: ebs-backed or
|
|
|
|
// instance-store. This builder _only_ builds ebs-backed images.
|
2013-07-15 02:02:18 -04:00
|
|
|
package ebs
|
2013-05-09 01:34:20 -04:00
|
|
|
|
|
|
|
import (
|
2019-03-22 09:53:28 -04:00
|
|
|
"context"
|
2013-08-30 17:48:50 -04:00
|
|
|
"fmt"
|
2014-06-04 17:58:11 -04:00
|
|
|
|
2015-06-03 17:13:52 -04:00
|
|
|
"github.com/aws/aws-sdk-go/service/ec2"
|
2019-10-19 05:56:18 -04:00
|
|
|
"github.com/aws/aws-sdk-go/service/iam"
|
2019-12-17 05:25:56 -05:00
|
|
|
"github.com/hashicorp/hcl/v2/hcldec"
|
2017-04-04 16:39:01 -04:00
|
|
|
awscommon "github.com/hashicorp/packer/builder/amazon/common"
|
|
|
|
"github.com/hashicorp/packer/common"
|
|
|
|
"github.com/hashicorp/packer/helper/communicator"
|
|
|
|
"github.com/hashicorp/packer/helper/config"
|
2018-01-19 19:18:44 -05:00
|
|
|
"github.com/hashicorp/packer/helper/multistep"
|
2017-04-04 16:39:01 -04:00
|
|
|
"github.com/hashicorp/packer/packer"
|
|
|
|
"github.com/hashicorp/packer/template/interpolate"
|
2013-05-09 01:34:20 -04:00
|
|
|
)
|
|
|
|
|
2013-05-22 01:28:41 -04:00
|
|
|
// The unique ID for this builder
|
|
|
|
const BuilderId = "mitchellh.amazonebs"
|
|
|
|
|
2015-05-27 14:35:56 -04:00
|
|
|
type Config struct {
|
2013-07-16 00:28:49 -04:00
|
|
|
common.PackerConfig `mapstructure:",squash"`
|
2013-07-16 00:08:19 -04:00
|
|
|
awscommon.AccessConfig `mapstructure:",squash"`
|
2013-08-09 01:50:23 -04:00
|
|
|
awscommon.AMIConfig `mapstructure:",squash"`
|
2013-07-16 00:23:40 -04:00
|
|
|
awscommon.RunConfig `mapstructure:",squash"`
|
2019-06-18 11:37:33 -04:00
|
|
|
// Add one or more block device mappings to the AMI. These will be attached
|
|
|
|
// when booting a new instance from your AMI. To add a block device during
|
|
|
|
// the Packer build see `launch_block_device_mappings` below. Your options
|
|
|
|
// here may vary depending on the type of VM you use. See the
|
|
|
|
// [BlockDevices](#block-devices-configuration) documentation for fields.
|
|
|
|
AMIMappings awscommon.BlockDevices `mapstructure:"ami_block_device_mappings" required:"false"`
|
|
|
|
// Add one or more block devices before the Packer build starts. If you add
|
|
|
|
// instance store volumes or EBS volumes in addition to the root device
|
|
|
|
// volume, the created AMI will contain block device mapping information
|
|
|
|
// for those volumes. Amazon creates snapshots of the source instance's
|
|
|
|
// root volume and any other EBS volumes described here. When you launch an
|
|
|
|
// instance from this new AMI, the instance automatically launches with
|
|
|
|
// these additional volumes, and will restore them from snapshots taken
|
|
|
|
// from the source instance. See the
|
|
|
|
// [BlockDevices](#block-devices-configuration) documentation for fields.
|
|
|
|
LaunchMappings awscommon.BlockDevices `mapstructure:"launch_block_device_mappings" required:"false"`
|
2019-06-06 10:45:37 -04:00
|
|
|
// Tags to apply to the volumes that are *launched* to create the AMI.
|
|
|
|
// These tags are *not* applied to the resulting AMI unless they're
|
|
|
|
// duplicated in `tags`. This is a [template
|
|
|
|
// engine](/docs/templates/engine.html), see [Build template
|
|
|
|
// data](#build-template-data) for more information.
|
|
|
|
VolumeRunTags awscommon.TagMap `mapstructure:"run_volume_tags"`
|
2019-11-21 15:46:31 -05:00
|
|
|
// Relevant only to Windows guests: If you set this flag, we'll add clauses
|
|
|
|
// to the launch_block_device_mappings that make sure ephemeral drives
|
|
|
|
// don't show up in the EC2 console. If you launched from the EC2 console,
|
|
|
|
// you'd get this automatically, but the SDK does not provide this service.
|
|
|
|
// For more information, see
|
|
|
|
// https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/InstanceStorage.html.
|
|
|
|
// Because we don't validate the OS type of your guest, it is up to you to
|
|
|
|
// make sure you don't set this for *nix guests; behavior may be
|
|
|
|
// unpredictable.
|
2019-11-19 14:52:18 -05:00
|
|
|
NoEphemeral bool `mapstructure:"no_ephemeral" required:"false"`
|
2013-05-20 19:50:35 -04:00
|
|
|
|
2015-06-22 12:22:42 -04:00
|
|
|
ctx interpolate.Context
|
2013-05-09 01:34:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
type Builder struct {
|
2017-12-08 17:56:19 -05:00
|
|
|
config Config
|
|
|
|
runner multistep.Runner
|
2013-05-09 01:34:20 -04:00
|
|
|
}
|
|
|
|
|
2019-12-17 05:25:56 -05:00
|
|
|
func (b *Builder) ConfigSpec() hcldec.ObjectSpec { return b.config.FlatMapstructure().HCL2Spec() }
|
|
|
|
|
2019-12-17 00:23:05 -05:00
|
|
|
func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) {
|
2015-06-22 12:22:42 -04:00
|
|
|
b.config.ctx.Funcs = awscommon.TemplateFuncs
|
2015-05-27 14:35:56 -04:00
|
|
|
err := config.Decode(&b.config, &config.DecodeOpts{
|
|
|
|
Interpolate: true,
|
2015-06-22 12:22:42 -04:00
|
|
|
InterpolateContext: &b.config.ctx,
|
2017-01-10 05:41:28 -05:00
|
|
|
InterpolateFilter: &interpolate.RenderFilter{
|
|
|
|
Exclude: []string{
|
|
|
|
"ami_description",
|
|
|
|
"run_tags",
|
|
|
|
"run_volume_tags",
|
2017-10-12 17:33:01 -04:00
|
|
|
"spot_tags",
|
2017-01-10 05:41:28 -05:00
|
|
|
"snapshot_tags",
|
|
|
|
"tags",
|
|
|
|
},
|
|
|
|
},
|
2015-05-27 14:35:56 -04:00
|
|
|
}, raws...)
|
2013-07-13 20:28:56 -04:00
|
|
|
if err != nil {
|
2019-12-17 00:23:05 -05:00
|
|
|
return nil, nil, err
|
2013-07-13 20:28:56 -04:00
|
|
|
}
|
2013-06-14 15:29:48 -04:00
|
|
|
|
2017-03-09 17:24:49 -05:00
|
|
|
if b.config.PackerConfig.PackerForce {
|
|
|
|
b.config.AMIForceDeregister = true
|
|
|
|
}
|
|
|
|
|
2013-07-13 20:28:56 -04:00
|
|
|
// Accumulate any errors
|
2015-05-27 14:35:56 -04:00
|
|
|
var errs *packer.MultiError
|
2019-06-28 17:00:56 -04:00
|
|
|
var warns []string
|
|
|
|
|
2015-06-22 12:22:42 -04:00
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...)
|
2017-10-30 17:17:19 -04:00
|
|
|
errs = packer.MultiErrorAppend(errs,
|
|
|
|
b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...)
|
2019-06-18 06:37:47 -04:00
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.AMIMappings.Prepare(&b.config.ctx)...)
|
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.LaunchMappings.Prepare(&b.config.ctx)...)
|
2015-06-22 12:22:42 -04:00
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...)
|
2013-07-13 20:28:56 -04:00
|
|
|
|
2019-08-22 16:17:35 -04:00
|
|
|
if b.config.IsSpotInstance() && (b.config.AMIENASupport.True() || b.config.AMISriovNetSupport) {
|
2017-12-08 17:56:19 -05:00
|
|
|
errs = packer.MultiErrorAppend(errs,
|
|
|
|
fmt.Errorf("Spot instances do not support modification, which is required "+
|
|
|
|
"when either `ena_support` or `sriov_support` are set. Please ensure "+
|
|
|
|
"you use an AMI that already has either SR-IOV or ENA enabled."))
|
2017-12-07 18:27:40 -05:00
|
|
|
}
|
|
|
|
|
2019-06-28 17:00:56 -04:00
|
|
|
if b.config.RunConfig.SpotPriceAutoProduct != "" {
|
|
|
|
warns = append(warns, "spot_price_auto_product is deprecated and no "+
|
|
|
|
"longer necessary for Packer builds. In future versions of "+
|
|
|
|
"Packer, inclusion of spot_price_auto_product will error your "+
|
|
|
|
"builds. Please take a look at our current documentation to "+
|
|
|
|
"understand how Packer requests Spot instances.")
|
|
|
|
}
|
|
|
|
|
2013-07-19 19:08:25 -04:00
|
|
|
if errs != nil && len(errs.Errors) > 0 {
|
2019-12-17 00:23:05 -05:00
|
|
|
return nil, warns, errs
|
2013-06-08 20:41:56 -04:00
|
|
|
}
|
2013-05-10 16:01:54 -04:00
|
|
|
|
2018-08-10 17:25:14 -04:00
|
|
|
packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token)
|
2019-12-17 00:23:05 -05:00
|
|
|
return nil, warns, nil
|
2013-05-09 13:54:42 -04:00
|
|
|
}
|
2013-05-09 01:34:20 -04:00
|
|
|
|
2019-03-22 09:53:28 -04:00
|
|
|
func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (packer.Artifact, error) {
|
Use the hashicorp/go-getter to download files
* removed packer.Cache and references since packer.Cache is never used except in the download step. The download step now uses the new func packer.CachePath(targetPath) for this, the behavior is the same.
* removed download code from packer that was reimplemented into the go-getter library: progress bar, http download restart, checksuming from file, skip already downloaded files, symlinking, make a download cancellable by context.
* on windows if packer is running without symlinking rights and we are getting a local file, the file will be copied instead to avoid errors.
* added unit tests for step_download that are now CI tested on windows, mac & linux.
* files are now downloaded under cache dir `sha1(filename + "?checksum=" + checksum) + file_extension`
* since the output dir is based on the source url and the checksum, when the checksum fails, the file is auto deleted.
* a download file is protected and locked by a file lock,
* updated docs
* updated go modules and vendors
2019-03-13 07:11:58 -04:00
|
|
|
|
2017-03-01 19:43:09 -05:00
|
|
|
session, err := b.config.Session()
|
2016-11-01 18:53:04 -04:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2019-02-05 17:07:04 -05:00
|
|
|
|
2019-03-04 19:19:39 -05:00
|
|
|
ec2conn := ec2.New(session)
|
2019-10-19 05:56:18 -04:00
|
|
|
iam := iam.New(session)
|
2013-05-21 03:55:32 -04:00
|
|
|
// Setup the state bag and initial state for the steps
|
2013-08-31 16:00:43 -04:00
|
|
|
state := new(multistep.BasicStateBag)
|
2018-09-18 09:50:37 -04:00
|
|
|
state.Put("config", &b.config)
|
2019-02-05 17:07:04 -05:00
|
|
|
state.Put("access_config", &b.config.AccessConfig)
|
|
|
|
state.Put("ami_config", &b.config.AMIConfig)
|
2013-08-31 16:00:43 -04:00
|
|
|
state.Put("ec2", ec2conn)
|
2019-10-19 05:56:18 -04:00
|
|
|
state.Put("iam", iam)
|
2017-12-19 14:04:17 -05:00
|
|
|
state.Put("awsSession", session)
|
2013-08-31 16:00:43 -04:00
|
|
|
state.Put("hook", hook)
|
|
|
|
state.Put("ui", ui)
|
2013-05-10 18:21:11 -04:00
|
|
|
|
2017-10-04 05:29:38 -04:00
|
|
|
var instanceStep multistep.Step
|
|
|
|
|
2017-12-08 17:56:19 -05:00
|
|
|
if b.config.IsSpotInstance() {
|
2017-10-23 15:16:12 -04:00
|
|
|
instanceStep = &awscommon.StepRunSpotInstance{
|
2017-12-08 17:56:19 -05:00
|
|
|
AssociatePublicIpAddress: b.config.AssociatePublicIpAddress,
|
2019-06-18 06:37:47 -04:00
|
|
|
LaunchMappings: b.config.LaunchMappings,
|
2018-09-03 02:33:58 -04:00
|
|
|
BlockDurationMinutes: b.config.BlockDurationMinutes,
|
2017-12-08 17:56:19 -05:00
|
|
|
Ctx: b.config.ctx,
|
2018-09-11 21:20:14 -04:00
|
|
|
Comm: &b.config.RunConfig.Comm,
|
2017-12-08 17:56:19 -05:00
|
|
|
Debug: b.config.PackerDebug,
|
|
|
|
EbsOptimized: b.config.EbsOptimized,
|
|
|
|
ExpectedRootDevice: "ebs",
|
2017-10-04 05:29:38 -04:00
|
|
|
InstanceInitiatedShutdownBehavior: b.config.InstanceInitiatedShutdownBehavior,
|
2017-12-08 17:56:19 -05:00
|
|
|
InstanceType: b.config.InstanceType,
|
|
|
|
SourceAMI: b.config.SourceAmi,
|
|
|
|
SpotPrice: b.config.SpotPrice,
|
2017-10-12 17:33:01 -04:00
|
|
|
SpotTags: b.config.SpotTags,
|
2017-12-08 17:56:19 -05:00
|
|
|
Tags: b.config.RunTags,
|
2019-05-22 13:16:42 -04:00
|
|
|
SpotInstanceTypes: b.config.SpotInstanceTypes,
|
2017-12-08 17:56:19 -05:00
|
|
|
UserData: b.config.UserData,
|
|
|
|
UserDataFile: b.config.UserDataFile,
|
|
|
|
VolumeTags: b.config.VolumeRunTags,
|
2019-11-21 16:21:56 -05:00
|
|
|
NoEphemeral: b.config.NoEphemeral,
|
2017-10-04 05:29:38 -04:00
|
|
|
}
|
|
|
|
} else {
|
2017-10-23 15:16:12 -04:00
|
|
|
instanceStep = &awscommon.StepRunSourceInstance{
|
2017-12-08 17:56:19 -05:00
|
|
|
AssociatePublicIpAddress: b.config.AssociatePublicIpAddress,
|
2019-06-18 06:37:47 -04:00
|
|
|
LaunchMappings: b.config.LaunchMappings,
|
2018-08-30 06:50:29 -04:00
|
|
|
Comm: &b.config.RunConfig.Comm,
|
2017-12-08 17:56:19 -05:00
|
|
|
Ctx: b.config.ctx,
|
|
|
|
Debug: b.config.PackerDebug,
|
|
|
|
EbsOptimized: b.config.EbsOptimized,
|
2018-05-13 12:16:10 -04:00
|
|
|
EnableT2Unlimited: b.config.EnableT2Unlimited,
|
2017-12-08 17:56:19 -05:00
|
|
|
ExpectedRootDevice: "ebs",
|
2017-10-04 05:29:38 -04:00
|
|
|
InstanceInitiatedShutdownBehavior: b.config.InstanceInitiatedShutdownBehavior,
|
2017-12-08 17:56:19 -05:00
|
|
|
InstanceType: b.config.InstanceType,
|
2018-02-02 23:16:23 -05:00
|
|
|
IsRestricted: b.config.IsChinaCloud() || b.config.IsGovCloud(),
|
2017-12-08 17:56:19 -05:00
|
|
|
SourceAMI: b.config.SourceAmi,
|
|
|
|
Tags: b.config.RunTags,
|
|
|
|
UserData: b.config.UserData,
|
|
|
|
UserDataFile: b.config.UserDataFile,
|
|
|
|
VolumeTags: b.config.VolumeRunTags,
|
2019-11-19 14:52:18 -05:00
|
|
|
NoEphemeral: b.config.NoEphemeral,
|
2017-10-04 05:29:38 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-21 03:55:32 -04:00
|
|
|
// Build the steps
|
2013-06-04 13:00:06 -04:00
|
|
|
steps := []multistep.Step{
|
2015-06-08 18:08:39 -04:00
|
|
|
&awscommon.StepPreValidate{
|
2019-06-17 17:39:11 -04:00
|
|
|
DestAmiName: b.config.AMIName,
|
|
|
|
ForceDeregister: b.config.AMIForceDeregister,
|
|
|
|
AMISkipBuildRegion: b.config.AMISkipBuildRegion,
|
2019-11-08 16:13:45 -05:00
|
|
|
VpcId: b.config.VpcId,
|
|
|
|
SubnetId: b.config.SubnetId,
|
2015-06-08 18:08:39 -04:00
|
|
|
},
|
2014-06-04 17:58:11 -04:00
|
|
|
&awscommon.StepSourceAMIInfo{
|
2017-08-28 12:18:23 -04:00
|
|
|
SourceAmi: b.config.SourceAmi,
|
|
|
|
EnableAMISriovNetSupport: b.config.AMISriovNetSupport,
|
|
|
|
EnableAMIENASupport: b.config.AMIENASupport,
|
|
|
|
AmiFilters: b.config.SourceAmiFilter,
|
2018-09-04 21:13:18 -04:00
|
|
|
AMIVirtType: b.config.AMIVirtType,
|
2014-06-04 17:58:11 -04:00
|
|
|
},
|
2018-06-12 06:05:16 -04:00
|
|
|
&awscommon.StepNetworkInfo{
|
2018-08-14 06:04:13 -04:00
|
|
|
VpcId: b.config.VpcId,
|
|
|
|
VpcFilter: b.config.VpcFilter,
|
|
|
|
SecurityGroupIds: b.config.SecurityGroupIds,
|
|
|
|
SecurityGroupFilter: b.config.SecurityGroupFilter,
|
|
|
|
SubnetId: b.config.SubnetId,
|
|
|
|
SubnetFilter: b.config.SubnetFilter,
|
|
|
|
AvailabilityZone: b.config.AvailabilityZone,
|
2018-06-12 06:05:16 -04:00
|
|
|
},
|
2013-08-30 17:48:50 -04:00
|
|
|
&awscommon.StepKeyPair{
|
2018-08-28 11:47:02 -04:00
|
|
|
Debug: b.config.PackerDebug,
|
|
|
|
Comm: &b.config.RunConfig.Comm,
|
|
|
|
DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName),
|
2013-08-30 17:48:50 -04:00
|
|
|
},
|
2013-07-20 22:50:55 -04:00
|
|
|
&awscommon.StepSecurityGroup{
|
2019-03-30 18:47:03 -04:00
|
|
|
SecurityGroupFilter: b.config.SecurityGroupFilter,
|
|
|
|
SecurityGroupIds: b.config.SecurityGroupIds,
|
|
|
|
CommConfig: &b.config.RunConfig.Comm,
|
|
|
|
TemporarySGSourceCidrs: b.config.TemporarySGSourceCidrs,
|
2013-07-20 22:58:27 -04:00
|
|
|
},
|
2019-10-19 05:56:18 -04:00
|
|
|
&awscommon.StepIamInstanceProfile{
|
|
|
|
IamInstanceProfile: b.config.IamInstanceProfile,
|
2019-12-10 03:17:39 -05:00
|
|
|
SkipProfileValidation: b.config.SkipProfileValidation,
|
2019-10-19 05:56:18 -04:00
|
|
|
TemporaryIamInstanceProfilePolicyDocument: b.config.TemporaryIamInstanceProfilePolicyDocument,
|
|
|
|
},
|
2018-07-26 02:30:51 -04:00
|
|
|
&awscommon.StepCleanupVolumes{
|
2019-06-18 06:37:47 -04:00
|
|
|
LaunchMappings: b.config.LaunchMappings,
|
2015-06-18 14:23:48 -04:00
|
|
|
},
|
2017-10-04 05:29:38 -04:00
|
|
|
instanceStep,
|
2015-06-14 01:35:45 -04:00
|
|
|
&awscommon.StepGetPassword{
|
2018-04-16 14:51:04 -04:00
|
|
|
Debug: b.config.PackerDebug,
|
|
|
|
Comm: &b.config.RunConfig.Comm,
|
|
|
|
Timeout: b.config.WindowsPasswordTimeout,
|
|
|
|
BuildName: b.config.PackerBuildName,
|
2015-06-14 01:35:45 -04:00
|
|
|
},
|
2015-06-13 18:16:12 -04:00
|
|
|
&communicator.StepConnect{
|
|
|
|
Config: &b.config.RunConfig.Comm,
|
2015-06-13 19:23:33 -04:00
|
|
|
Host: awscommon.SSHHost(
|
2015-06-13 18:16:12 -04:00
|
|
|
ec2conn,
|
2019-09-26 15:30:04 -04:00
|
|
|
b.config.SSHInterface,
|
|
|
|
b.config.Comm.SSHHost,
|
|
|
|
),
|
2018-08-22 11:02:23 -04:00
|
|
|
SSHConfig: b.config.RunConfig.Comm.SSHConfigFunc(),
|
2013-07-15 01:06:41 -04:00
|
|
|
},
|
2013-07-16 02:44:41 -04:00
|
|
|
&common.StepProvision{},
|
2018-09-14 14:03:23 -04:00
|
|
|
&common.StepCleanupTempKeys{
|
|
|
|
Comm: &b.config.RunConfig.Comm,
|
|
|
|
},
|
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
|
|
|
&awscommon.StepStopEBSBackedInstance{
|
2017-12-08 17:56:19 -05:00
|
|
|
Skip: b.config.IsSpotInstance(),
|
2016-03-14 13:49:42 -04:00
|
|
|
DisableStopInstance: b.config.DisableStopInstance,
|
|
|
|
},
|
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
|
|
|
&awscommon.StepModifyEBSBackedInstance{
|
2017-08-28 12:18:23 -04:00
|
|
|
EnableAMISriovNetSupport: b.config.AMISriovNetSupport,
|
|
|
|
EnableAMIENASupport: b.config.AMIENASupport,
|
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
|
|
|
},
|
2015-06-12 14:05:15 -04:00
|
|
|
&awscommon.StepDeregisterAMI{
|
2017-08-14 12:20:08 -04:00
|
|
|
AccessConfig: &b.config.AccessConfig,
|
2016-11-30 16:28:34 -05:00
|
|
|
ForceDeregister: b.config.AMIForceDeregister,
|
|
|
|
ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot,
|
|
|
|
AMIName: b.config.AMIName,
|
2017-08-14 12:20:08 -04:00
|
|
|
Regions: b.config.AMIRegions,
|
2015-06-12 14:05:15 -04:00
|
|
|
},
|
2019-06-17 17:39:11 -04:00
|
|
|
&stepCreateAMI{
|
|
|
|
AMISkipBuildRegion: b.config.AMISkipBuildRegion,
|
|
|
|
},
|
2013-09-04 19:06:06 -04:00
|
|
|
&awscommon.StepAMIRegionCopy{
|
2019-06-17 17:39:11 -04:00
|
|
|
AccessConfig: &b.config.AccessConfig,
|
|
|
|
Regions: b.config.AMIRegions,
|
|
|
|
AMIKmsKeyId: b.config.AMIKmsKeyId,
|
|
|
|
RegionKeyIds: b.config.AMIRegionKMSKeyIDs,
|
|
|
|
EncryptBootVolume: b.config.AMIEncryptBootVolume,
|
|
|
|
Name: b.config.AMIName,
|
|
|
|
OriginalRegion: *ec2conn.Config.Region,
|
|
|
|
AMISkipBuildRegion: b.config.AMISkipBuildRegion,
|
2013-09-04 19:06:06 -04:00
|
|
|
},
|
2013-08-22 18:35:47 -04:00
|
|
|
&awscommon.StepModifyAMIAttributes{
|
2016-12-02 03:49:21 -05:00
|
|
|
Description: b.config.AMIDescription,
|
|
|
|
Users: b.config.AMIUsers,
|
|
|
|
Groups: b.config.AMIGroups,
|
|
|
|
ProductCodes: b.config.AMIProductCodes,
|
|
|
|
SnapshotUsers: b.config.SnapshotUsers,
|
|
|
|
SnapshotGroups: b.config.SnapshotGroups,
|
2017-01-10 05:41:28 -05:00
|
|
|
Ctx: b.config.ctx,
|
2013-08-22 18:35:47 -04:00
|
|
|
},
|
2013-08-22 18:09:21 -04:00
|
|
|
&awscommon.StepCreateTags{
|
2016-10-16 22:19:55 -04:00
|
|
|
Tags: b.config.AMITags,
|
|
|
|
SnapshotTags: b.config.SnapshotTags,
|
2017-01-10 05:41:28 -05:00
|
|
|
Ctx: b.config.ctx,
|
2013-08-22 18:03:30 -04:00
|
|
|
},
|
2013-05-21 02:18:44 -04:00
|
|
|
}
|
|
|
|
|
2013-05-21 03:55:32 -04:00
|
|
|
// Run!
|
2016-09-13 20:04:18 -04:00
|
|
|
b.runner = common.NewRunner(steps, b.config.PackerConfig, ui)
|
2019-03-22 09:53:28 -04:00
|
|
|
b.runner.Run(ctx, state)
|
2013-06-19 23:54:02 -04:00
|
|
|
// If there was an error, return that
|
2013-08-31 16:00:43 -04:00
|
|
|
if rawErr, ok := state.GetOk("error"); ok {
|
2013-06-19 23:54:02 -04:00
|
|
|
return nil, rawErr.(error)
|
|
|
|
}
|
|
|
|
|
2013-06-19 00:54:33 -04:00
|
|
|
// If there are no AMIs, then just return
|
2013-08-31 16:00:43 -04:00
|
|
|
if _, ok := state.GetOk("amis"); !ok {
|
2013-06-12 19:06:56 -04:00
|
|
|
return nil, nil
|
2013-06-04 13:59:12 -04:00
|
|
|
}
|
|
|
|
|
2013-05-22 01:28:41 -04:00
|
|
|
// Build the artifact and return it
|
2013-07-20 23:08:41 -04:00
|
|
|
artifact := &awscommon.Artifact{
|
2013-08-31 16:00:43 -04:00
|
|
|
Amis: state.Get("amis").(map[string]string),
|
2013-07-20 23:08:41 -04:00
|
|
|
BuilderIdValue: BuilderId,
|
2017-12-19 14:04:17 -05:00
|
|
|
Session: session,
|
2013-06-18 19:24:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return artifact, nil
|
2013-05-10 16:01:54 -04:00
|
|
|
}
|