2012-11-09 11:04:13 +00:00
|
|
|
Image building tools for Openstack
|
|
|
|
==================================
|
|
|
|
|
|
|
|
These tools are the components of tripleo (https://github.com/tripleo/demo)
|
|
|
|
that do the plumbing involved in building disk images. Specific configs live
|
|
|
|
in the demo repository, while the reusable tools live here.
|
|
|
|
|
|
|
|
What tools are there?
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
* disk-image-create -o filename {flavour} [{flavour} ...] : Create an image of
|
|
|
|
flavour {flavour}, optionally mixing in other flavours.
|
|
|
|
|
|
|
|
* ramdisk-image-create -o filename {flavour} [{flavour} ...] : Create a kernel+
|
|
|
|
ramdisk pair for running maintenance on bare metal machines (deployment,
|
|
|
|
inventory, burnin etc).
|
|
|
|
|
2012-11-09 22:36:24 +00:00
|
|
|
ramdisk-image-create -o deploy.ramdisk deploy
|
|
|
|
|
2012-11-09 11:04:13 +00:00
|
|
|
* disk-image-get-kernel filename : Extract the appropriate kernel and ramdisk
|
|
|
|
to use when doing PXE boot using filename as the image for a machine.
|
|
|
|
|
|
|
|
* flavours can be found in the top level flavours directory.
|
|
|
|
|
|
|
|
Why?
|
|
|
|
----
|
|
|
|
|
|
|
|
Automation: While users and operators can manually script or put together ram
|
|
|
|
disks and disk images, mature automation makes customisation and testing easier.
|
|
|
|
|
|
|
|
Design
|
|
|
|
======
|
|
|
|
|
|
|
|
Images are built using a chroot and bind mounted /proc /sys and /dev. The goal
|
|
|
|
of the image building process is to produce blank slate machines that have all
|
|
|
|
the necessary bits to fulfill a specific purpose in the running of an Openstack
|
|
|
|
cloud: e.g. a nova-compute node.
|
|
|
|
|
|
|
|
A flavour is a particular set of code that alters how the image is built, or
|
|
|
|
runs within the chroot to prepare the image. E.g. the local-config flavour
|
|
|
|
copies in the http proxy and ssh keys of the user running the image build
|
|
|
|
process into the image, whereas the vm flavour makes the image build a regular
|
2012-11-12 21:00:33 +00:00
|
|
|
VM image with partition table and installed grub boot sector. The mellanox
|
|
|
|
flavour adds support for mellanox infiniband hardware to both the deploy
|
|
|
|
ramdisk and the built images.
|
|
|
|
|
|
|
|
Images start as a base ubuntu cloud image. Other distributions may be added in
|
|
|
|
future, the infrastructure deliberately makes few assumptions about the exact
|
|
|
|
operating system is use. The base image has opensshd running (a new key
|
|
|
|
generated on first boot) and accepts use keys via the cloud metadata service,
|
|
|
|
loading them into the 'ubuntu' user.
|
|
|
|
|
|
|
|
The goal of a built image is to have any global configuration ready to roll,
|
|
|
|
but nothing that ties it to a specific cloud instance: images should be able to
|
|
|
|
be dropped into a test cloud and validated, and then deployed into a production
|
|
|
|
cloud (usually via bare metal nova) for production use. As such, the image
|
|
|
|
contents can be modelled as three distinct portions:
|
|
|
|
|
|
|
|
- global content: the actual code, kernel, always-applicable config (like
|
|
|
|
disabling password authentication to sshd).
|
|
|
|
- metadata / config management provided configuration: user ssh keys, network
|
|
|
|
address and routes, configuration management server location and public key,
|
|
|
|
credentials to access other servers in the cloud. These are typically
|
|
|
|
refreshed on every boot.
|
|
|
|
- persistent state: sshd server key, database contents, swift storage areas,
|
|
|
|
nova instance disk images, disk image cache. These would typically be stored
|
|
|
|
on a dedicated partition and not overwritten when re-deploying the image.
|
|
|
|
|
|
|
|
The goal of the image building tools is to create machine images that content
|
|
|
|
the correct global content and are ready for 'last-mile' configuration by the
|
|
|
|
nova metadata API, after which a configuration management system can take over
|
|
|
|
(until the next deploy, when it all starts over from scratch).
|
2012-11-09 11:04:13 +00:00
|
|
|
|
|
|
|
Existing flavours
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
Flavours are found in the subdirectory flavours. Each flavour is in a directory
|
|
|
|
named after the flavour itself. Flavours *should* have a README.md in the root
|
|
|
|
of the flavour directory describing what it is for.
|
|
|
|
|
|
|
|
Writing a flavour
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
Make as many of the following subdirectories as you need, depending on what
|
|
|
|
part of the process you need to customise:
|
|
|
|
|
2012-11-11 22:47:26 +00:00
|
|
|
* block-device-size.d: Alter the size (in GB) of the disk image. This is useful
|
|
|
|
when a particular flavour will require a certain minimum (or maximum) size.
|
|
|
|
You can either error and stop the build, or adjust the size to match.
|
|
|
|
NB: Due to the current simple implementation, the last output value wins
|
|
|
|
so this should be used rarely - only one flavour in a mix can reliably set
|
|
|
|
a size.
|
|
|
|
|
|
|
|
* outputs: $IMAGE\_SIZE={size_in_GB}
|
|
|
|
* inputs: $IMAGE_SIZE={size_in_GB}
|
|
|
|
|
2012-11-09 11:04:13 +00:00
|
|
|
* block-device.d: customise the block device that the image will be made on
|
|
|
|
(e.g. to make partitions).
|
|
|
|
|
|
|
|
* outputs: $IMAGE\_BLOCK\_DEVICE={path}
|
|
|
|
* inputs: $IMAGE\_BLOCK\_DEVICE={path}
|
|
|
|
|
|
|
|
* extra-data.d: pull in extra data from the host environment that hooks may
|
|
|
|
need during image creation. This should copy any data (such as SSH keys,
|
|
|
|
http proxy settings and the like) somewhere under $TMP\_HOOKS\_PATH.
|
|
|
|
|
|
|
|
* outputs: None
|
|
|
|
* inputs: $TMP\_HOOKS\_PATH
|
|
|
|
|
|
|
|
* pre-install.d: Run code in the chroot before customisation or packages are
|
|
|
|
installed. A good place to add apt repositories.
|
|
|
|
|
|
|
|
* install.d: Runs after pre-install.d in the chroot. This is a good place to
|
|
|
|
install packages, chain into configuration management tools or do other
|
|
|
|
image specific operations.
|
|
|
|
|
|
|
|
* first-boot.d: Runs inside the image before rc.local. Scripts from here are
|
|
|
|
good for doing per-instance configuration based on cloud metadata.
|
|
|
|
|
2012-11-09 21:48:23 +00:00
|
|
|
Ramdisk flavours support the following files in their flavour directories:
|
2012-11-09 21:16:06 +00:00
|
|
|
|
2012-11-09 21:48:23 +00:00
|
|
|
* binary-deps : executables required to be fed into the ramdisk. These need
|
|
|
|
to be present in your $PATH.
|
|
|
|
|
|
|
|
* init : a POSIX shell script fragment that will be appended to the default
|
|
|
|
script executed as the ramdisk is booted (/init)
|
2012-11-09 21:16:06 +00:00
|
|
|
|
2012-11-09 11:04:13 +00:00
|
|
|
Third party flavours
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
Pending implementation. The idea is to have a search path for flavours.
|
|
|
|
|
|
|
|
Installation
|
|
|
|
============
|
|
|
|
|
|
|
|
* Clone the repository locally, then add bin to your path.
|
|
|
|
|
|
|
|
* Copy sudoers.d/\* into your /etc/sudoers.d/. (Warning, use visudo -c -f
|
|
|
|
{filename} to check that each one parses successfully on your machine, so you
|
|
|
|
don't break your machine).
|
|
|
|
|
|
|
|
Invocation
|
|
|
|
==========
|
|
|
|
|
|
|
|
The scripts can generally just be run. Options can be set on the command line
|
|
|
|
or by exporting variables to override those present in lib/img-defaults. -h to
|
|
|
|
get help.
|