diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/ovf/README | 82 | ||||
-rw-r--r-- | doc/ovf/example/ovf-env.xml (renamed from doc/ovf/environment.xml) | 0 | ||||
-rw-r--r-- | doc/ovf/example/ubuntu-server.ovf (renamed from doc/ovf/ubuntu-server.ovf) | 0 | ||||
-rwxr-xr-x | doc/ovf/make-iso | 156 | ||||
-rw-r--r-- | doc/ovf/ovf-env.xml.tmpl | 28 | ||||
-rw-r--r-- | doc/ovf/ovfdemo.pem | 27 | ||||
-rw-r--r-- | doc/ovf/user-data | 7 |
7 files changed, 295 insertions, 5 deletions
diff --git a/doc/ovf/README b/doc/ovf/README index f674ea7c..d5cfb443 100644 --- a/doc/ovf/README +++ b/doc/ovf/README @@ -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. diff --git a/doc/ovf/environment.xml b/doc/ovf/example/ovf-env.xml index 13e8f104..13e8f104 100644 --- a/doc/ovf/environment.xml +++ b/doc/ovf/example/ovf-env.xml diff --git a/doc/ovf/ubuntu-server.ovf b/doc/ovf/example/ubuntu-server.ovf index 846483a1..846483a1 100644 --- a/doc/ovf/ubuntu-server.ovf +++ b/doc/ovf/example/ubuntu-server.ovf diff --git a/doc/ovf/make-iso b/doc/ovf/make-iso new file mode 100755 index 00000000..91d0e2e5 --- /dev/null +++ b/doc/ovf/make-iso @@ -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 diff --git a/doc/ovf/ovf-env.xml.tmpl b/doc/ovf/ovf-env.xml.tmpl new file mode 100644 index 00000000..8e255d43 --- /dev/null +++ b/doc/ovf/ovf-env.xml.tmpl @@ -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>
diff --git a/doc/ovf/ovfdemo.pem b/doc/ovf/ovfdemo.pem new file mode 100644 index 00000000..5bc629c8 --- /dev/null +++ b/doc/ovf/ovfdemo.pem @@ -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----- diff --git a/doc/ovf/user-data b/doc/ovf/user-data new file mode 100644 index 00000000..bfac51fd --- /dev/null +++ b/doc/ovf/user-data @@ -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 |