В состав адаптированных для установки в cloud-окружениях сборок Ubuntu 10.10
(UEC) был интегрирован cloud-init, конфигурируемый процесс инициализации,
позволяющий унифицировать процесс задания конфигурации во время загрузки,
например, указать локаль, имя хоста, SSH-ключи и точки монтирования.
Ниже представлен скрипт по установке и преднастройке UEC-сборки в виде гостевой
системы, работающей под управлением локального гипервизора KVM.
# Загружаем свежую сборку UEC с http://uec-images.ubuntu.com,
# например, стабильный выпуск Ubuntu 10.10 (http://uec-images.ubuntu.com/maverick/current/)
# или тестовую версию Ubuntu 11.04 (http://uec-images.ubuntu.com/natty/current/).
uecnattyservercurrent=http://uec-images.ubuntu.com/server/natty/current/natty-server-uec-i386.tar.gz
# Распаковываем img-образ и устанавливаем несколько переменных, указываем
# на ядро и базовые директории:
tarball=$(basename $uecnattyservercurrent)
[ -f ${tarball} ] || wget ${uecnattyservercurrent}
contents=${tarball}.contents
tar -Sxvzf ${tarball} | tee "${contents}"
cat natty-server-uec-i386.tar.gz.contents
base=$(sed -n 's/.img$//p' "${contents}")
kernel=$(echo ${base}-vmlinuz-*)
floppy=${base}-floppy
img=${base}.img
# Преобразуем образ UEC в формат qcow2, для запуска под управлением KVM:
qemu-img create -f qcow2 -b ${img} disk.img
# Подготавливаем набор мета-данных (файлы meta-data и user-data) для
# автоматизации настройки гостевой системы, примеры можно посмотреть здесь
# Запускаем простейший HTTP-сервер для отдачи файлов с мета-данными
# Сервер будет запущен на 8000 порту и будет отдавать файлы meta-data
# и user-data из текущей директории, которые следует модифицировать в зависимости
# от текущих предпочтений (можно прописать команды по установке дополнительных пакетов,
# запустить любые команды, подключить точки монтирования и т.п.)
python -m SimpleHTTPServer &
websrvpid=$!
# Запускаем гостевую систему под управлением KVM, базовый URL для загрузки
# мета-данных передаем через опцию "s=":
kvm -drive file=disk.img,if=virtio,boot=on -kernel "${kernel}" \
-append "ro init=/usr/lib/cloud-init/uncloud-init root=/dev/vda ds=nocloud-net;s=http://192.168.122.1:8000/ ubuntu-pass=ubuntu"
# Завершаем выполнение http-сервера, используемого для отдачи мета-данных.
kill $websrvpid
Пример файла user-data:
#cloud-config
#apt_update: false
#apt_upgrade: true
#packages: [ bzr, pastebinit, ubuntu-dev-tools, ccache, bzr-builddeb, vim-nox, git-core, lftp ]
apt_sources:
- source: ppa:smoser/ppa
disable_root: True
mounts:
- [ ephemeral0, None ]
- [ swap, None ]
ssh_import_id: [smoser ]
sm_misc:
- &user_setup |
set -x; exec > ~/user_setup.log 2>&1
echo "starting at $(date -R)"
echo "set -o vi" >> ~/.bashrc
cat >> ~/.profile <<EOF
export EDITOR=vi
EOF
runcmd:
- [ sudo, -Hu, ubuntu, sh, -c, 'grep "cloud-init.*running" /var/log/cloud-init.log > ~/runcmd.log' ]
- [ sudo, -Hu, ubuntu, sh, -c, 'read up sleep < /proc/uptime; echo $(date): runcmd up at $up | tee -a ~/runcmd.log' ]
- [ sudo, -Hu, ubuntu, sh, -c, *user_setup ]
Пример файла meta-data
#ami-id: ami-fd4aa494
#ami-launch-index: '0'
#ami-manifest-path: ubuntu-images-us/ubuntu-lucid-10.04-amd64-server-20100427.1.manifest.xml
#block-device-mapping: {ami: sda1, ephemeral0: sdb, ephemeral1: sdc, root: /dev/sda1}
hostname: smoser-sys
#instance-action: none
instance-id: i-87018aed
instance-type: m1.large
#kernel-id: aki-c8b258a1
local-hostname: smoser-sys.mosers.us
#local-ipv4: 10.223.26.178
#placement: {availability-zone: us-east-1d}
#public-hostname: ec2-184-72-174-120.compute-1.amazonaws.com
#public-ipv4: 184.72.174.120
#public-keys:
# ec2-keypair.us-east-1: [ssh-rsa AAAA.....
# ec2-keypair.us-east-1, '']
#reservation-id: r-e2225889
#security-groups: default
|