diff --git a/website/source/intro/getting-started/build-image.html.markdown b/website/source/intro/getting-started/build-image.html.markdown new file mode 100644 index 000000000..7f15f2977 --- /dev/null +++ b/website/source/intro/getting-started/build-image.html.markdown @@ -0,0 +1,167 @@ +--- +layout: "intro" +page_title: "Build an Image" +prev_url: "/intro/getting-started/setup.html" +next_url: "/intro/getting-started/provision.html" +next_title: "Provision" +--- + +# Build an Image + +With Packer installed, let's just dive right into it and build our first +image. Our first image will be an [Amazon EC2 AMI](http://aws.amazon.com/ec2/) +with Redis pre-installed. This is just an example. Packer can create images +for [many platforms](/intro/platforms.html) with anything pre-installed. + +If you don't have an AWS account, [create one now](http://aws.amazon.com/free/). +For the example, we'll use a "t1.micro" instance to build our image, which +qualifies under the AWS [free-tier](http://aws.amazon.com/free/), meaning +it will be free. If you already have an AWS account, you may be charged some +amount of money, but it shouldn't be more than a few cents. + +
+{
+ "builders": [{
+ "type": "amazon-ebs",
+ "access_key": "YOUR KEY HERE",
+ "secret_key": "YOUR SECRET KEY HERE",
+ "region": "us-east-1",
+ "source_ami": "ami-de0d9eb7",
+ "instance_type": "t1.micro",
+ "ssh_username": "ubuntu",
+ "ami_name": "packer-example {{.CreateTime}}"
+ }]
+}
+
+
+Please fill in the `access_key` and `secret_key` with the proper values
+for your account. Your security credentials can be found on
+[this page](https://console.aws.amazon.com/iam/home?#security_credential).
+
+This is a basic template that is ready-to-go. It should be immediately recognizable
+as a normal, basic JSON object. Within the object, the `builders` section
+contains an array of JSON objects configuring a specific _builder_. A
+builder is a component of Packer that is responsible for creating a machine
+and turning that machine into an image.
+
+In this case, we're only configuring a single builder of type `amazon-ebs`.
+This is the Amazon EC2 AMI builder that ships with Packer. This builder
+builds an EBS-backed AMI by launching a source AMI, provisioning on top of
+that, and re-packaging it into a new AMI.
+
+The additional keys within the object are configuration for this builder, specifying things
+such as access keys, the source AMI to build from, and more.
+The exact set of configuration variables available for a builder are
+specific to each builder and can be found within the [documentation](/docs).
+
+Before we take this template and build an image from it, let's validate the template
+by running `packer validate example.json`. This command checks the syntax
+as well as the configuration values to verify they look valid. The output should
+look similar to below, because the template should be valid. If there are
+any errors, this command will tell you.
+
+```
+$ packer validate example.json
+Template validated successfully.
+```
+
+Next, let's build the image from this template.
+
+An astute reader may notice that we said earlier we'd be building an
+image with Redis pre-installed, and yet the template we made doesn't reference
+Redis anywhere. In fact, this part of the documentation will only cover making
+a first basic, non-provisioned image. The next section on provisioning will
+cover installing Redis.
+
+## Your First Image
+
+With a properly validated template. It is time to build your first image.
+This is done by calling `packer build` with the template file. The output
+should look similar to below. Note that this process typically takes a
+few minutes.
+
+```
+$ packer build example.json
+==> amazon-ebs: amazon-ebs output will be in this color.
+
+==> amazon-ebs: Creating temporary keypair for this instance...
+==> amazon-ebs: Creating temporary security group for this instance...
+==> amazon-ebs: Authorizing SSH access on the temporary security group...
+==> amazon-ebs: Launching a source AWS instance...
+==> amazon-ebs: Waiting for instance to become ready...
+==> amazon-ebs: Connecting to the instance via SSH...
+==> amazon-ebs: Stopping the source instance...
+==> amazon-ebs: Waiting for the instance to stop...
+==> amazon-ebs: Creating the AMI: packer-example 1371856345
+==> amazon-ebs: AMI: ami-19601070
+==> amazon-ebs: Waiting for AMI to become ready...
+==> amazon-ebs: Terminating the source AWS instance...
+==> amazon-ebs: Deleting temporary security group...
+==> amazon-ebs: Deleting temporary keypair...
+==> amazon-ebs: Build finished.
+
+==> Builds finished. The artifacts of successful builds are:
+--> amazon-ebs: AMIs were created:
+
+us-east-1: ami-19601070
+```
+
+At the end of running `packer build`, Packer outputs the _artifacts_
+that were created as part of the build. Artifacts are the results of a
+build, and typically represent an ID (such as in the case of an AMI) or
+a set of files (such as for a VMware virtual machine). In this example,
+we only have a single artifact: the AMI in us-east-1 that was created.
+
+This AMI is ready to use. If you wanted you can go and launch this AMI
+right now and it would work great.
+
+
+{
+ "builders": [...],
+
+ "provisioners": [{
+ "type": "shell",
+ "inline": [
+ "sudo apt-get update",
+ "sudo apt-get install -y redis-server"
+ ]
+ }]
+}
+
+
+Hopefully it is obvious, but the `builders` section shouldn't actually
+contain "...", it should be the contents setup in the previous page
+of the getting started guide.
+
+To configure the provisioners, we add a new section `provisioners` to the
+template, alongside the `builders` configuration. The provisioners section
+is an array of provisioners to run. If multiple provisioners are specified, they
+are run in the order given.
+
+By default, each provisioner is run for every builder defined. So if we had
+two builders defined in our template, such as both Amazon and DigitalOcean, then
+the shell script would run as part of both builds. There are ways to restrict
+provisioners to certain builds, but it is outside the scope of this getting
+started guide. It is covered in more detail in the complete
+[documentation](/docs).
+
+The one provisioner we defined has a type of `shell`. This provisioner
+ships with Packer and runs shell scripts on the running machine. In our
+case, we specify two inline commands to run in order to install Redis.
+
+## Build
+
+With the provisioner configured, give it a pass once again through
+`packer validate` to verify everything is okay, then build it using
+`packer build example.json`. The output should look similar to when you
+built your first image, except this time there will be a new step where
+the provisoning is run.
+
+The output from the provisioner is too verbose to include in this
+guide, since it contains all the output from the shell scripts. But you
+should see Redis successfully install. After that, Packer once again
+turns the machine into an AMI.
+
+If you were to launch this AMI, Redis would be pre-installed. Cool!
+
+This is just a basic example. In a real world use case, you may be provisioning
+an image with the entire stack necessary to run your application. Or maybe
+just the web stack so that you can have an image for web servers pre-built.
+This saves tons of time later as you launch these images since everything
+is pre-installed. Additionally, since everything is pre-installed, you
+can test the images as they're built and know that when they go into
+production, they'll be functional.
diff --git a/website/source/layouts/intro.erb b/website/source/layouts/intro.erb
index 8865deedf..e1c82c88e 100644
--- a/website/source/layouts/intro.erb
+++ b/website/source/layouts/intro.erb
@@ -13,8 +13,8 @@