summaryrefslogtreecommitdiff
path: root/create-vm
blob: 9fa374b4569027c46fc1038af1e0dde303401837 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/bash

set -eu -o pipefail

cloud_init_iso()
{
    local iso="$1"
    local hostname="$2"
    local pubkey="$3"
    local dir="$(mktemp -d)"

    cat <<EOF > "$dir/meta-data"
# Amazon EC2 style metadata
local-hostname: $hostname
EOF

    cat <<EOF > "$dir/user-data"
#cloud-config
ssh_authorized_keys:
- $pubkey
EOF

    genisoimage -quiet -volid cidata -joliet -rock -output "$iso" "$dir"
    rm -rf "$dir"
}


create_vm()
{
    local name="$1"
    local memory="$2"
    local image="$3"
    local iso="$4"

    virt-install \
	--name="$name" \
	--memory "$memory" \
	--disk="path=$image,cache=none" \
	--disk="path=$iso,readonly=on" \
	--network=network=default \
	--quiet \
	--connect qemu:///system \
	--cpu=host-passthrough \
	--os-variant=debian9 \
	--import \
	--graphics=spice \
	--noautoconsole
}

wait_for_ssh()
{
    local host="$1"
    while ! nc -w 1 "$host" 22 < /dev/null > /dev/null
    do
	sleep 5
    done
}


main()
{
    local base="$1"
    local vm="$2"
    local memory="$3"
    local img="$4"
    local size="$5"
    local pubkey="$(cat "$6")"

    local iso="$vm.iso"

    cloud_init_iso "$vm.iso" "$vm" "$pubkey"
    cp "$base" "$img"
    qemu-img resize -q "$img" "$size"
    create_vm "$vm" "$memory" "$img" "$iso"
    wait_for_ssh "$vm"
    rm -f "$iso"
}


main "$@"