Improve OVF documentation and provide functional demo.

This commit is contained in:
Scott Moser
2011-10-13 20:17:18 -04:00
parent a129f2cc5c
commit 5789c70fae
8 changed files with 297 additions and 5 deletions

View File

@@ -54,6 +54,8 @@
This way the configured hostname of the system will be used if not provided
by metadata (LP: #838280)
- DataSourceOVF: change the default instance id to 'iid-dsovf' from 'nocloud'
- Improve the OVF documentation, and provide a simple command line
tool for creating a useful ISO file.
0.6.1:
- fix bug in fixing permission on /var/log/cloud-init.log (LP: #704509)

View File

@@ -1,11 +1,83 @@
- environment.xml
This directory contains documentation and a demo of the OVF
functionality that is present in cloud-init.
The example/ directory contains the following files:
example/ovf-env.xml
This is an example ovf environment file
to make an iso that qualifies for the ISO transport, do:
mkdir my-iso
cp environment.xml my-iso/ovf-env.xml
genisoimage -o transport.iso -r my-iso
Then, boot with that ISO attached as a CDrom
- ProductSection.xml
TODO: document what the ProductSection can look like
- maverick-server.ovf
Example generated by virtualbox "export" of a simple VM
- example/ubuntu-server.ovf
Example generated by virtualbox "export" of a simple VM.
It contains a functional ProductSection also. Given answers
to each of the Properties there, a suitable OVF environment file
(ovf-env.xml) could be created.
== Demo ==
In order to easily demonstrate this functionality, simple demo is
contained here. To boot a local virtual machine in either kvm or virtual
box, follow the steps below.
- download a suitable Ubuntu image
Visit http://cloud-images.ubuntu.com/releases and download a disk image
of Natty, Oneiric or a newer release.
$ burl="http://cloud-images.ubuntu.com/releases/"
$ disk="ubuntu-11.10-server-cloudimg-i386-disk1"
$ wget "$burl/11.10/release/$disk.img" -O "$disk.img"
- If you're going to use virtual box, you will need to convert the image
from qcow2 format into a virtual-box friendly VHD format.
$ qemu-img convert -O vdi "$disk.img" "ubuntu.vdi"
- If you're using kvm, you should create a qcow delta image to store
the changes so you keep the original pristine.
$ qemu-img create -f qcow2 -b "$disk.img" "ubuntu.qcow2"
Optionally, you could decompress the image, which will make it boot faster
but will take up more local disk space.
$ qemu-img convert -O qcow2 "$disk.img" "$disk.qcow2"
$ qemu-img create -O qcow2 -b "$disk.qcow2" ubuntu.qcow2
- Create an ISO file that will provide user-data to the image.
This will put the contents of 'user-data' into an ovf-env.xml file
and create an ISO file that can then be attached at boot to provide
the user data to cloud-init.
$ ./make-iso ovf-env.xml.tmpl user-data --output ovftransport.iso
- Boot your virtual machine
The cloud-images boot with kernel and boot progress to ttyS0.
You can change that at the grub prompt if you'd like by editing the
kernel entry. Otherwise, to see progress you'll need to switch
to the serial console. In kvm graphic mode, you do that by clicking
in the window and then pressing pressing 'ctrl-alt-3'. For information
on how to do that in virtualbox or kvm curses, see the relevant
documentation.
KVM:
$ kvm -drive file=ubuntu.qcow2,if=virtio -cdrom ovftransport.iso \
-m 256 -net nic -net user,hostfwd=tcp::2222-:22
VirtualBox:
- Launch the GUI and create a new vm with $disk.vdi and ovftransport.iso
attached.
- If you use 'NAT' networking, then forward a port (2222) to the
guests' port 22 to be able to ssh.
Upon successful boot you will be able to log in as the 'ubuntu' user
with the password 'passw0rd' (which was set in the 'user-data' file).
You will also be able to ssh to the instance with the provided:
$ chmod 600 ovfdemo.pem
$ ssh -i ovfdemo.pem -p 2222 ubuntu@localhost
- Notes:
* The 'instance-id' that is set in the ovf-env.xml image needs to
be unique. If you want to run the first-boot code of cloud-init
again you will either have to remove /var/lib/cloud ('rm -Rf' is fine)
or create a new cdrom with a different instance-id. To do the
ladder, simply add the '--instance-id=' flag to the 'make-iso'
command above and start your vm with the new ISO attached.

156
doc/ovf/make-iso Executable file
View File

@@ -0,0 +1,156 @@
#!/bin/bash
VERBOSITY=0
PROPERTIES=( instance-id hostname user-data seedfrom )
DEFAULTS=( "i-ovfdemo00" "ovfdemo.localdomain" "" "" )
DEF_OUTPUT="ovftransport.iso"
TEMP_D=""
error() { echo "$@" 1>&2; }
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
# propvalue(name, value)
propvalue() {
local prop="" val="$2" i=0
for prop in "${PROPERTIES[@]}"; do
if [ "$prop" = "$1" ]; then
[ $# -eq 1 ] || DEFAULTS[$i]="$2"
_RET=${DEFAULTS[$i]}
return
fi
i=$(($i+1))
done
return
}
Usage() {
cat <<EOF
Usage: ${0##*/} ovf-env.xml.tmpl [user-data-file]
create an an ovf transport iso with ovf-env.xml.tmpl
as ovf-env.xml on the iso.
if user-data-file is given, the file's contents will be base64 encoded
and stuffed inside ovf-env.xml. This will override the '--user-data'
argument.
options:
-o | --output OUTPUT write output to OUTPUT [default: $DEF_OUTPUT]
-v | --verbose increase verbosity
EOF
local i=""
for i in "${PROPERTIES[@]}"; do
propvalue "$i"
printf "%10s--%-17s%s\n" "" "$i" "set $i. [default: '$_RET']"
done
cat <<EOF
Example:
$ ${0##*/} --hostname "foobar.mydomain" ovf-env.xml.tmpl user-data
EOF
}
bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; exit 1; }
cleanup() {
[ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
}
debug() {
local level=${1}; shift;
[ "${level}" -ge "${VERBOSITY}" ] && return
error "${@}"
}
short_opts="ho:v"
long_opts="help,output:,verbose"
for i in "${PROPERTIES[@]}"; do
long_opts="$long_opts,$i:"
done
getopt_out=$(getopt --name "${0##*/}" \
--options "${short_opts}" --long "${long_opts}" -- "$@") &&
eval set -- "${getopt_out}" ||
bad_Usage
## <<insert default variables here>>
output="${DEF_OUTPUT}"
user_data=""
while [ $# -ne 0 ]; do
cur=${1}; next=${2};
case "$cur" in
-h|--help) Usage ; exit 0;;
-o|--output) output=${2}; shift;;
-v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
--) shift; break;;
--*)
for i in "${PROPERTIES[@]}" _none_; do
[ "${cur#--}" == "$i" ] || continue
[ "$i" != "user-data" ] ||
next=$(echo "$next" | base64 --wrap=0) ||
fail "failed to base64 encode userdata"
propvalue "$i" "$next"
break
done
[ "$i" = "_none_" ] && bad_Usage "confused by $cur"
;;
esac
shift;
done
[ $# -eq 1 -o $# -eq 2 ] ||
bad_Usage "wrong number of arguments"
env_tmpl="$1"
ud_file="$2"
[ -f "$env_tmpl" ] || bad_Usage "$env_tmpl: not a file"
[ -z "$ud_file" -o -f "$ud_file" ] ||
bad_Usage "$ud_file: not a file"
TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") ||
fail "failed to make tempdir"
trap cleanup EXIT
mkdir "$TEMP_D/iso" && iso_d="$TEMP_D/iso" ||
fail "failed to make a tempdir?"
ovf_env="$TEMP_D/iso/ovf-env.xml"
if [ -n "$ud_file" ]; then
user_data=$(base64 --wrap=0 "$ud_file") ||
fail "failed to base64 encode $ud_file. Do you have base64 installed?"
propvalue user-data "$user_data"
fi
changes=( )
for i in "${PROPERTIES[@]}"; do
changes[${#changes[@]}]="-e"
propvalue "$i"
changes[${#changes[@]}]="s|@@$i@@|$_RET|g"
done
sed "${changes[@]}" "$env_tmpl" > "$ovf_env" ||
fail "failed to replace string in $env_tmpl"
if [ "${#changes[@]}" -ne 0 ]; then
cmp "$ovf_env" "$env_tmpl" >/dev/null &&
fail "nothing replaced in $ovf_env. template is identical to output"
fi
debug 1 "creating iso with: genisoimage -o tmp.iso -r iso"
( cd "$TEMP_D" &&
genisoimage -V OVF-TRANSPORT -o tmp.iso -r iso 2>/dev/null ) ||
fail "failed to create iso. do you have genisoimage?"
if [ "$output" = "-" ]; then
cat "$TEMP_D/tmp.iso"
else
cp "$TEMP_D/tmp.iso" "$output" ||
fail "failed to write to $output"
fi
error "wrote iso to $output"
exit 0
# vi: ts=4 noexpandtab

28
doc/ovf/ovf-env.xml.tmpl Normal file
View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oe="http://schemas.dmtf.org/ovf/environment/1"
xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 ../dsp8027.xsd"
oe:id="WebTier">
<!-- This example reference a local schema file, to validate against online schema use:
xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 http://schemas.dmtf.org/ovf/envelope/1/dsp8027_1.0.0.xsd"
-->
<!-- Information about hypervisor platform -->
<oe:PlatformSection>
<Kind>ESX Server</Kind>
<Version>3.0.1</Version>
<Vendor>VMware, Inc.</Vendor>
<Locale>en_US</Locale>
</oe:PlatformSection>
<!--- Properties defined for this virtual machine -->
<PropertySection>
<Property oe:key="instance-id" oe:value="@@instance-id@@"/>
<Property oe:key="hostname" oe:value="@@hostname@@"/>
<Property oe:key="user-data" oe:value="@@user-data@@"/>
<Property oe:key="seedfrom" oe:value="@@seedfrom@@"/>
</PropertySection>
</Environment>

27
doc/ovf/ovfdemo.pem Normal file
View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1Zq/11Rky/uHdbKJewmEtDABGoSjIFyjoY04T5dFYUNwi0B6
Km7b85Ylqmi/1KmR4Zvi++dj10XnusoWr/Zruv85hHilMZ9GozL2RD6jU/CaI+rB
QkKSaR/CdmEHBbRimq6T2E9chMhJY0jNzeexJSKVR3QeLdbRZ64H7QGTHp7Ulodu
vS9VwAWcpYbGgcM541fboFAiJOLICM1UPH4x5WDkTq/6yeElSmeiE2lHtESHhyMJ
OSDB3YZ5hw1+4bY3sR+0vZ3VQWzpn1Lwg1X3AZA8yf+ZsmMZHhTFeCglsd8jlLHk
Wudh5mJBkCuwPvRQk1gE5gSnTGti0TUqLIrNRwIDAQABAoIBAGZMrdIXxgp3VWHF
9tfpMBgH4Y9stJ98HpXxh2V+4ih53v2iDKAj5c1cPH/HmQ/lgktVmDjikct43El2
HbV6RBATyd0q1prUWEUy1ATNJvW9hmTrOlFchrg4EK8XOwC9angAYig3oeyp65PU
O1SAwTMyw+GruARmHHYWQA9/MJF5yexrjBw00w7hnCsqjezU5YIYsXwgcz0Zw+Ix
fDJcZFXF9X3Al7H3ZILW3PpfhcVl7WzkL47TIX4oB/ab2kltaTE90SZMXKVcLvTI
6To2xJAnMUyasRfcGmvE8m0SqWqp66POAUDF2I8qu78inKH2u0rNtLQjyx5btF5K
A39bPnkCgYEA8Joba3QFrbd0zPTP/DawRtTXzdIQcNjj4XEefxBN3Cw7MlCsfgDc
xiAR703zqQ/IDkF00XrU5w7rmDga3Pv66JRzFDwvRVtGb6QV+lg7Ypd/6NI1G5AS
0Qzneer2JytEpHoTqGH/vWcXzJRH2BfaPK/vEF4qhAXBqouz2DXn3EUCgYEA40ZU
eDc4MmHOSuqoggSEDJ5NITgPbdkwOta0BmnBZ36M5vgqN8EfAZISKocLNlERDrRG
MpBlQCulq3rpU7WYkx8hGE21f1YBo+vKkffI56ptO2lAp5iLflkSOypdiVN6OELW
5SzkViohDnxKc6eshVycnNoxh6MqE6ugWSd6ahsCgYEA6t0kQwIgwPDCfYfEt2kT
LjF675lNHzs5R8pKgLKDrpcmufjySJXC7UxE9ZrcbX3QRcozpIEI7vwrko3B+1Gm
Hf87TtdpNYTh/vznz1btsVI+NCFuYheDprm4A9UOsDGWchAQvF/dayAFpVhhwVmX
WYJMFWg2jGWqJTb2Oep1CRkCgYEAqzdkk1wmPe5o1w+I+sokIM1xFcGB/iNMrkbp
QJuTVECGLcpvI6mdjjVY8ijiTX0s+ILfD2CwpnM7T8A83w9DbjJZYFHKla9ZdQBB
j024UK6Xs9ZLGvdUv06i6We1J6t3u8K+2c/EBRWf6aXBAPgkhCOM6K2H+sL1A/Sb
zA5trlkCgYArqJCk999mXQuMjNv6UTwzB0iYDjAFNgJdFmPMXlogD51r0HlGeCgD
OEyup4FdIvX1ZYOCkKyieSngmPmY/P4lZBgQbM23FMp+oUkA+FlVW+WNVoXagUrh
abatKtbZ+WZHHmgSoC8sAo5KnxM9O0R6fWlpoIhJTVoihkZYdmnpMg==
-----END RSA PRIVATE KEY-----

7
doc/ovf/user-data Normal file
View File

@@ -0,0 +1,7 @@
#cloud-config
password: passw0rd
chpasswd: { expire: False }
ssh_pwauth: True
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVmr/XVGTL+4d1sol7CYS0MAEahKMgXKOhjThPl0VhQ3CLQHoqbtvzliWqaL/UqZHhm+L752PXRee6yhav9mu6/zmEeKUxn0ajMvZEPqNT8Joj6sFCQpJpH8J2YQcFtGKarpPYT1yEyEljSM3N57ElIpVHdB4t1tFnrgftAZMentSWh269L1XABZylhsaBwznjV9ugUCIk4sgIzVQ8fjHlYOROr/rJ4SVKZ6ITaUe0RIeHIwk5IMHdhnmHDX7htjexH7S9ndVBbOmfUvCDVfcBkDzJ/5myYxkeFMV4KCWx3yOUseRa52HmYkGQK7A+9FCTWATmBKdMa2LRNSosis1H ubuntu@ovfdemo