website: parallel builds
This commit is contained in:
parent
7af4e1f610
commit
0e4388c881
|
@ -0,0 +1,117 @@
|
||||||
|
---
|
||||||
|
layout: "intro"
|
||||||
|
page_title: "Parallel Builds"
|
||||||
|
prev_url: "/intro/getting-started/provision.html"
|
||||||
|
next_url: ""
|
||||||
|
next_title: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
# Parallel Builds
|
||||||
|
|
||||||
|
So far we've shown how Packer can automatically build an image and provision it.
|
||||||
|
This on its own is already quite powerful. But Packer can do better than that.
|
||||||
|
Packer can create multiple images for multiple platforms _in parallel_, all
|
||||||
|
configured from a single template.
|
||||||
|
|
||||||
|
This is a very useful and important feature of Packer. As an example,
|
||||||
|
Packer is able to make an AMI and a VMware virtual machine
|
||||||
|
in parallel provisioned with the _same scripts_, resulting in near-identical
|
||||||
|
images. The AMI can be used for production, the VMware machine can be used
|
||||||
|
for development. Or, another example, if you're using Packer to build
|
||||||
|
[software appliances](http://en.wikipedia.org/wiki/Software_appliance),
|
||||||
|
then you can build the appliance for every supported platform all in
|
||||||
|
parallel, all configured from a single template.
|
||||||
|
|
||||||
|
Once you start taking advantage of this feature, the possibilities begin
|
||||||
|
to unfold in front of you.
|
||||||
|
|
||||||
|
Continuing on the example in this getting started guide, we'll build
|
||||||
|
a [DigitalOcean](http://www.digitalocean.com) image as well as an AMI. Both
|
||||||
|
will be near-identical: bare bones Ubuntu OS with Redis pre-installed.
|
||||||
|
However, since we're building for both platforms, you have the option of
|
||||||
|
whether you want to use the AMI, or the DigitalOcean snapshot. Or use both.
|
||||||
|
|
||||||
|
## Setting Up DigitalOcean
|
||||||
|
|
||||||
|
[DigitalOcean](https://www.digitalocean.com/) is a relatively new, but
|
||||||
|
very popular VPS provider that has popped up. They have a quality offering
|
||||||
|
of high performance, low cost VPS servers. We'll be building a DigitalOcean
|
||||||
|
snapshot for this example.
|
||||||
|
|
||||||
|
In order to do this, you'll need an account with DigitalOcean.
|
||||||
|
[Sign up for an account now](https://www.digitalocean.com/). It is free
|
||||||
|
to sign up. Because the "droplets" (servers) are charged hourly, you
|
||||||
|
_will_ be charged $0.01 for every image you create with Packer. If
|
||||||
|
you're not okay with this, just follow along.
|
||||||
|
|
||||||
|
<div class="alert alert-block alert-warn">
|
||||||
|
<strong>Note!</strong> I want to repeat, in case you didn't see above:
|
||||||
|
You <em>will</em> be charged $0.01 by DigitalOcean per image created with Packer
|
||||||
|
because of the time the "droplet" is running.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Once you sign up for an account, grab your client ID and API key from
|
||||||
|
the [DigitalOcean API access page](https://www.digitalocean.com/api_access).
|
||||||
|
Save these values somewhere, you'll need them in a second.
|
||||||
|
|
||||||
|
## Modifying the Template
|
||||||
|
|
||||||
|
We now have to modify the template to add DigitalOcean to it. Modify the
|
||||||
|
template we've been using and add the following JSON object to the `builders`
|
||||||
|
array.
|
||||||
|
|
||||||
|
<pre class="prettyprint">
|
||||||
|
{
|
||||||
|
"type": "digitalocean",
|
||||||
|
"api_key": "INSERT API KEY HERE",
|
||||||
|
"client_id": "INSERT CILENT ID HERE"
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Fill in your `api_key` and `client_id` for DigitalOcean as necessary.
|
||||||
|
The entire template should now [look like this](https://gist.github.com/mitchellh/51a447e38e7e496eb29c).
|
||||||
|
|
||||||
|
Additional builders are simply added to the `builders` array in the template.
|
||||||
|
This tells Packer to build multiple images. The builder `type` values don't
|
||||||
|
even need tdo be different! In fact, if you wanted to build multiple AMIs,
|
||||||
|
you can do that as well.
|
||||||
|
|
||||||
|
Validate the template with `packer validate`. This is always a good practice.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Now run `packer build example.json`. The output is too verbose to include
|
||||||
|
all of it, but a portion of it is reproduced below. Note that the ordering
|
||||||
|
and wording of the lines may be slightly different, but the effect is the
|
||||||
|
same.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ packer build example.json
|
||||||
|
==> amazon-ebs: amazon-ebs output will be in this color.
|
||||||
|
==> digitalocean: digitalocean output will be in this color.
|
||||||
|
|
||||||
|
==> digitalocean: Creating temporary ssh key for droplet...
|
||||||
|
==> amazon-ebs: Creating temporary keypair for this instance...
|
||||||
|
==> amazon-ebs: Creating temporary security group for this instance...
|
||||||
|
==> digitalocean: Creating droplet...
|
||||||
|
==> amazon-ebs: Authorizing SSH access on the temporary security group...
|
||||||
|
==> amazon-ebs: Launching a source AWS instance...
|
||||||
|
==> digitalocean: Waiting for droplet to become active...
|
||||||
|
==> amazon-ebs: Waiting for instance to become ready...
|
||||||
|
==> digitalocean: Connecting to the droplet via SSH...
|
||||||
|
==> amazon-ebs: Connecting to the instance via SSH...
|
||||||
|
...
|
||||||
|
==> Builds finished. The artifacts of successful builds are:
|
||||||
|
--> amazon-ebs: AMIs were created:
|
||||||
|
|
||||||
|
us-east-1: ami-376d1d5e
|
||||||
|
--> digitalocean: A snapshot was created: packer-1371870364
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, Packer builds both the Amazon and DigitalOcean images
|
||||||
|
in parallel. It outputs information about each in different colors
|
||||||
|
(although you can't see that in the block above) so that it is easy to identify.
|
||||||
|
|
||||||
|
At the end of the build, Packer outputs both of the artifacts created
|
||||||
|
(an AMI and a DigitalOcean snapshot). Both images created are bare bones
|
||||||
|
Ubuntu installations with Redis pre-installed.
|
|
@ -14,12 +14,16 @@
|
||||||
<% if current_page.data.next_url %>
|
<% if current_page.data.next_url %>
|
||||||
<div class="pagination">
|
<div class="pagination">
|
||||||
<a class="previous-section" href="<%= current_page.data.prev_url %>"></a>
|
<a class="previous-section" href="<%= current_page.data.prev_url %>"></a>
|
||||||
|
<% if current_page.data.next_url == "" %>
|
||||||
|
<h4><span class="text-green uppercase">End</span></h4>
|
||||||
|
<% else %>
|
||||||
<a class="next-section" href="<%= current_page.data.next_url %>">
|
<a class="next-section" href="<%= current_page.data.next_url %>">
|
||||||
<h4>
|
<h4>
|
||||||
<span class="text-green uppercase">next</span>
|
<span class="text-green uppercase">next</span>
|
||||||
<%= current_page.data.next_title %>
|
<%= current_page.data.next_title %>
|
||||||
</h4>
|
</h4>
|
||||||
</a>
|
</a>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
<li><a href="/intro/getting-started/setup.html">Install Packer</a></li>
|
<li><a href="/intro/getting-started/setup.html">Install Packer</a></li>
|
||||||
<li><a href="/intro/getting-started/build-image.html">Build an Image</a></li>
|
<li><a href="/intro/getting-started/build-image.html">Build an Image</a></li>
|
||||||
<li><a href="/intro/getting-started/provision.html">Provision</a></li>
|
<li><a href="/intro/getting-started/provision.html">Provision</a></li>
|
||||||
<li><a href="#">Parallel Builds</a></li>
|
<li><a href="/intro/getting-started/parallel-builds.html">Parallel Builds</a></li>
|
||||||
<li><a href="#">Post-Process</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
|
|
Loading…
Reference in New Issue