Improve OVF documentation and provide functional demo.
This commit is contained in:
@@ -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)
|
||||
|
@@ -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
156
doc/ovf/make-iso
Executable 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
28
doc/ovf/ovf-env.xml.tmpl
Normal 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
27
doc/ovf/ovfdemo.pem
Normal 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
7
doc/ovf/user-data
Normal 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
|
Reference in New Issue
Block a user