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 (
|
2013-08-30 17:48:50 -04:00
|
|
|
"fmt"
|
2014-06-04 17:58:11 -04:00
|
|
|
"log"
|
|
|
|
|
2015-06-03 17:13:52 -04:00
|
|
|
"github.com/aws/aws-sdk-go/service/ec2"
|
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-08-15 17:05:08 -04:00
|
|
|
awscommon.BlockDevices `mapstructure:",squash"`
|
2013-07-16 00:23:40 -04:00
|
|
|
awscommon.RunConfig `mapstructure:",squash"`
|
2018-02-02 23:16:23 -05:00
|
|
|
VolumeRunTags awscommon.TagMap `mapstructure:"run_volume_tags"`
|
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
|
|
|
}
|
|
|
|
|
2013-11-02 23:56:54 -04:00
|
|
|
func (b *Builder) Prepare(raws ...interface{}) ([]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 {
|
2013-11-02 23:56:54 -04:00
|
|
|
return 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
|
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)...)
|
2015-06-22 12:22:42 -04:00
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...)
|
|
|
|
errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...)
|
2013-07-13 20:28:56 -04:00
|
|
|
|
2017-12-08 17:56:19 -05:00
|
|
|
if b.config.IsSpotInstance() && (b.config.AMIENASupport || b.config.AMISriovNetSupport) {
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2013-07-19 19:08:25 -04:00
|
|
|
if errs != nil && len(errs.Errors) > 0 {
|
2013-11-02 23:56:54 -04:00
|
|
|
return nil, errs
|
2013-06-08 20:41:56 -04:00
|
|
|
}
|
2013-05-10 16:01:54 -04:00
|
|
|
|
2017-12-03 17:43:30 -05:00
|
|
|
log.Println(common.ScrubConfig(b.config, b.config.AccessKey, b.config.SecretKey, b.config.Token))
|
2013-11-02 23:56:54 -04:00
|
|
|
return nil, nil
|
2013-05-09 13:54:42 -04:00
|
|
|
}
|
2013-05-09 01:34:20 -04:00
|
|
|
|
2013-06-12 19:06:56 -04:00
|
|
|
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) {
|
2013-07-11 15:56:59 -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
|
|
|
|
}
|
2015-10-30 14:58:56 -04:00
|
|
|
ec2conn := ec2.New(session)
|
2013-05-10 18:21:11 -04:00
|
|
|
|
2017-05-11 20:46:35 -04:00
|
|
|
// If the subnet is specified but not the VpcId or AZ, try to determine them automatically
|
|
|
|
if b.config.SubnetId != "" && (b.config.AvailabilityZone == "" || b.config.VpcId == "") {
|
|
|
|
log.Printf("[INFO] Finding AZ and VpcId for the given subnet '%s'", b.config.SubnetId)
|
2016-01-06 02:12:20 -05:00
|
|
|
resp, err := ec2conn.DescribeSubnets(&ec2.DescribeSubnetsInput{SubnetIds: []*string{&b.config.SubnetId}})
|
2015-02-28 08:00:45 -05:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-05-11 20:46:35 -04:00
|
|
|
if b.config.AvailabilityZone == "" {
|
|
|
|
b.config.AvailabilityZone = *resp.Subnets[0].AvailabilityZone
|
|
|
|
log.Printf("[INFO] AvailabilityZone found: '%s'", b.config.AvailabilityZone)
|
|
|
|
}
|
|
|
|
if b.config.VpcId == "" {
|
|
|
|
b.config.VpcId = *resp.Subnets[0].VpcId
|
|
|
|
log.Printf("[INFO] VpcId found: '%s'", b.config.VpcId)
|
|
|
|
}
|
2015-02-28 08:00:45 -05:00
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
state.Put("config", b.config)
|
|
|
|
state.Put("ec2", ec2conn)
|
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,
|
|
|
|
AvailabilityZone: b.config.AvailabilityZone,
|
|
|
|
BlockDevices: b.config.BlockDevices,
|
|
|
|
Ctx: b.config.ctx,
|
|
|
|
Debug: b.config.PackerDebug,
|
|
|
|
EbsOptimized: b.config.EbsOptimized,
|
|
|
|
ExpectedRootDevice: "ebs",
|
|
|
|
IamInstanceProfile: b.config.IamInstanceProfile,
|
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,
|
|
|
|
SpotPriceProduct: b.config.SpotPriceAutoProduct,
|
2017-10-12 17:33:01 -04:00
|
|
|
SpotTags: b.config.SpotTags,
|
2017-12-08 17:56:19 -05:00
|
|
|
SubnetId: b.config.SubnetId,
|
|
|
|
Tags: b.config.RunTags,
|
|
|
|
UserData: b.config.UserData,
|
|
|
|
UserDataFile: b.config.UserDataFile,
|
|
|
|
VolumeTags: b.config.VolumeRunTags,
|
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,
|
|
|
|
AvailabilityZone: b.config.AvailabilityZone,
|
|
|
|
BlockDevices: b.config.BlockDevices,
|
|
|
|
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",
|
|
|
|
IamInstanceProfile: b.config.IamInstanceProfile,
|
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,
|
|
|
|
SubnetId: b.config.SubnetId,
|
|
|
|
Tags: b.config.RunTags,
|
|
|
|
UserData: b.config.UserData,
|
|
|
|
UserDataFile: b.config.UserDataFile,
|
|
|
|
VolumeTags: b.config.VolumeRunTags,
|
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{
|
2015-06-12 14:05:15 -04:00
|
|
|
DestAmiName: b.config.AMIName,
|
|
|
|
ForceDeregister: b.config.AMIForceDeregister,
|
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,
|
2014-06-04 17:58:11 -04:00
|
|
|
},
|
2013-08-30 17:48:50 -04:00
|
|
|
&awscommon.StepKeyPair{
|
2015-01-13 16:27:33 -05:00
|
|
|
Debug: b.config.PackerDebug,
|
2016-11-29 16:33:53 -05:00
|
|
|
SSHAgentAuth: b.config.Comm.SSHAgentAuth,
|
2015-01-13 16:27:33 -05:00
|
|
|
DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName),
|
2015-06-19 00:15:16 -04:00
|
|
|
KeyPairName: b.config.SSHKeyPairName,
|
2015-01-13 22:58:41 -05:00
|
|
|
TemporaryKeyPairName: b.config.TemporaryKeyPairName,
|
2015-06-15 18:21:58 -04:00
|
|
|
PrivateKeyFile: b.config.RunConfig.Comm.SSHPrivateKey,
|
2013-08-30 17:48:50 -04:00
|
|
|
},
|
2013-07-20 22:50:55 -04:00
|
|
|
&awscommon.StepSecurityGroup{
|
2013-10-02 13:52:16 -04:00
|
|
|
SecurityGroupIds: b.config.SecurityGroupIds,
|
2015-06-14 02:12:59 -04:00
|
|
|
CommConfig: &b.config.RunConfig.Comm,
|
2013-10-02 13:52:16 -04:00
|
|
|
VpcId: b.config.VpcId,
|
2017-10-12 20:05:31 -04:00
|
|
|
TemporarySGSourceCidr: b.config.TemporarySGSourceCidr,
|
2013-07-20 22:58:27 -04:00
|
|
|
},
|
2015-06-18 14:23:48 -04:00
|
|
|
&stepCleanupVolumes{
|
|
|
|
BlockDevices: b.config.BlockDevices,
|
|
|
|
},
|
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,
|
2017-11-21 21:49:38 -05:00
|
|
|
b.config.SSHInterface),
|
2015-06-13 18:16:12 -04:00
|
|
|
SSHConfig: awscommon.SSHConfig(
|
2016-10-23 22:43:47 -04:00
|
|
|
b.config.RunConfig.Comm.SSHAgentAuth,
|
2016-10-02 16:20:36 -04:00
|
|
|
b.config.RunConfig.Comm.SSHUsername,
|
|
|
|
b.config.RunConfig.Comm.SSHPassword),
|
2013-07-15 01:06:41 -04:00
|
|
|
},
|
2013-07-16 02:44:41 -04:00
|
|
|
&common.StepProvision{},
|
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
|
|
|
},
|
2013-08-06 17:54:14 -04:00
|
|
|
&stepCreateAMI{},
|
2017-02-23 00:54:03 -05:00
|
|
|
&awscommon.StepCreateEncryptedAMICopy{
|
|
|
|
KeyID: b.config.AMIKmsKeyId,
|
|
|
|
EncryptBootVolume: b.config.AMIEncryptBootVolume,
|
|
|
|
Name: b.config.AMIName,
|
2017-08-02 12:45:53 -04:00
|
|
|
AMIMappings: b.config.AMIBlockDevices.AMIMappings,
|
2017-02-23 00:54:03 -05:00
|
|
|
},
|
2013-09-04 19:06:06 -04:00
|
|
|
&awscommon.StepAMIRegionCopy{
|
2017-05-26 15:21:07 -04:00
|
|
|
AccessConfig: &b.config.AccessConfig,
|
|
|
|
Regions: b.config.AMIRegions,
|
2017-05-31 16:41:32 -04:00
|
|
|
RegionKeyIds: b.config.AMIRegionKMSKeyIDs,
|
2017-05-26 15:21:07 -04:00
|
|
|
EncryptBootVolume: b.config.AMIEncryptBootVolume,
|
|
|
|
Name: b.config.AMIName,
|
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)
|
2013-06-04 13:53:35 -04:00
|
|
|
b.runner.Run(state)
|
2013-05-22 01:28:41 -04:00
|
|
|
|
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
|
|
|
}
|
2013-06-03 17:44:34 -04:00
|
|
|
|
|
|
|
func (b *Builder) Cancel() {
|
2013-06-04 13:53:35 -04:00
|
|
|
if b.runner != nil {
|
|
|
|
log.Println("Cancelling the step runner...")
|
|
|
|
b.runner.Cancel()
|
|
|
|
}
|
2013-06-03 17:44:34 -04:00
|
|
|
}
|