Kontextualizace VM
Kontextualizace (viz heslo na Wikipedii) umožňuje předat do spouštěného virtuálního stroje informace a upravit jeho obsah. Může například:
- přidat uživatele do systému
- vepsat ssh klíče uživatelů do ~/.ssh/authorized_keys
- připojit další disky, AFS nebo NFS adresáře
- nastavit zprávu motd (message of the day) zobrazovanou při přihlášení
- přidat další repozitáře softwaru
- aktualizovat softwarové balíky na nejnovější verzi (tj. apt-get update, apt-get upgrade)
- doinstalovat další software, nakonfigurovat ho a spustit
- zavolat určité URL a tomu předat údaje o právě nabootované instanci (phone home)
V předpřipravených obrazech disků v MetaCloudu je použit nástroj cloud-init, který provádí při bootu operačního systému různé akce závislé na konfiguračních souborech v obrazu disku a předaných kontextualizačních informacích. Tento nástroj rozlišuje první boot a opakované bootování.
Cloud-init je nainstalován z balíku ze standardního repositáře dané verze Linuxu, tj. Ubuntu, Debian, CentOS atd. Při bootu operačního systému spojí dohromady kontextualizační informace, tzv. user-data, předaná zvenčí a obsah konfiguračního souboru /etc/cloud/cloud.cfg z obrazu disku, a podle nich provede zadané úkony.
User-data jsou zapsána v textovém formátu YAML. V systému OpenNebula jsou součástí template, kde je můžete editovat.
Nástroj cloud-init je použit i v jiných cloudech, konkrétně v cloudech Amazon AWS, Google Compute Engine a Microsoft Azure je v obrazích disků se systémem Ubuntu cloud-init nainstalován, můžete tedy použít stejná user-data na všech těchto cloudech.
Pomocí cloud-initu by měly být nastavené jen základní věci. Pro pokročilejší správu pak použijte některý z následujících nástrojů:
Cloud-init příklady
Na prvním řádku musí být uvedeno #cloud-init. Další řádky jsou pak asociativní pole formátu YAML, tedy slova se stejným sloupcem zarovnání od levého okraje s dvojtečkou na konci.
Pokud inicializace neproběhla tak, jak jste čekali, podívejte se do souborů /var/log/cloud-init.log a /var/log/cloud-init-output.log.
Přidání souboru
Následující položka write_files vytvoří soubor /etc/motd (zobrazovaný při přihlášení přes ssh) s obsahem "This is my VM.". Znaky |1 znamenají, že obsah souboru je na dalších řádcích, a berou se znaky až od sloupce, který je o 1 sloupec vpravo od zarovnání sloupce s klíčovým slovem content:, tedy v tomto případě se ignoruje počátečních 5 mezer.
#cloud-config
write_files:
- path: /etc/motd
content: |1
This is my VM.
Cloud-init ale neakceptuje všechno, co lze v YAMLu napsat. Pokud v souboru mají být nějaké divočejší znaky, stačí česká diakritika nebo některé sekvence jako například "|.", je lepší zapsat obsah souboru jako binární v kódování base64, a pro ušetření místa i zagzipovaný. Pokud za content: | není číslo, zarovnání se vezme podle prvního řádku. Zarovnání musí být více vpravo než slovo content:.
#cloud-config
write_files:
- path: /etc/motd
encoding: gz+b64
content: |
H4sICJPti1UAA3Bvay50eHQAxZI9DsIwDIV3n+INnelVOECkzKiVYKBbDsDCARATB0DsSLC0uRf5
d9K06oiH6HMSPz072evb+OwP+gH97YfzcZiu3fhBp1/6gvF9mu79DkRoXAgEYBJwCYqtjaCmAaT0
xZGEdKzMqqwSFJ9ty7UwAnlxvfpbLmefczJIImuxFvJh5ZjqbjyZUGSNpc2ZnDuSuUjuk4ktUXSL
hWZ9lGdLxJZis0gNJRIrcmv3LYVmpWwjMAV/9pmEy8KDwd9i4kra+knz4DHkA0kf5c9yohhCJUc/
WCj2c40DAAA=
Přidání repositáře
Následující řádky přidají repositář pro nejnovější verzi PostgreSQL:
apt_sources:
- source: 'deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main'
filename: pgdg.list
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQINBE6XR8IBEACVdDKT2HEH1IyHzXkb4nIWAY7echjRxo7MTcj4vbXAyBKOfjja
UrBEJWHN6fjKJXOYWXHLIYg0hOGeW9qcSiaa1/rYIbOzjfGfhE4x0Y+NJHS1db0V
...
IIP9up4xwgje9LB7fMxsSkCDTHOk
=s3DI
-----END PGP PUBLIC KEY BLOCK-----
Pro repositář PPA pro Oracle Java nestačí přidat repositář, je třeba ještě nastavit odsouhlasení licence před instalací balíků, což lze udělat takto:
apt_sources:
- source: "ppa:webupd8team/java"
apt_update: True
# Agreement with Oracle licence before packages are installed
bootcmd:
- 'echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections'
#install these packages
packages:
- oracle-java8-installer
- oracle-java8-set-default
- oracle-java8-unlimited-jce-policy
Aktualizace balíků software
Následující řádky zajistí stáhnutí seznamu aktuálních verzí balíků (tj. apt-get update), následnou aktualizaci (tj. apt-get upgrade), a reboot, pokud je potřeba (změna jádra nebo SSL knihoven). A to až po případném přidání repositářů. To je vhodné provádět, pokud obraz disku není pravidelně aktualizován, a nejsou v něm nejnovější bezpečnostní záplaty.
apt_update: True
apt_upgrade: True
apt_reboot_if_required: True
Doinstalování balíků software
Následující řádky zajistí doinstalování (tj. apt-get install) pro vyjmenované balíky. Balíky musí být dostupné v repositářích. Instalace probíhá až po případném přidání repositářů a aktualizaci balíků.
packages:
- ntp
- mc
- zip
- p7zip
- p7zip-full
- lzma
- htop
- postgresql-9.4-postgis-2.1
Přidání uživatelů a ssh klíčů
Pokud sekce users: není definovaná, je to jako by obsahovala jen položku default, která způsobí vytvoření uživatele podle nastavení v souboru /etc/cloud/cloud.cfg, jehož výchozí nastavení je vytvořit uživatele jménem ubuntu.
Sekce ssh_authorized_keys: přidá zdaný ssh klíč do prvního uživatele, v tomto případě do default uživatele.
users:
#creates default user named "ubuntu" (as specified in /etc/cloud/cloud.cfg)
- default
#add another user
- name: makub
gecos: Martin Kuba
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtv24kBxvFCiDAUxQvsYEaIoWdU+QVgcWU1q4uJ8Ngy+LKn6XIVQTKlWd9W7MPUgpL5jPHVgExN1vpH+UlS0cducDUCRVB3JU4fW8jXge/JEhqhfrwKMD/iE0DJ0k2Zxd8pyIway1Q2KYs5tqQTJcQX3FsJ2V86pDFeLYmisRTFbo4n0wog20euPYCuTAY0KlA8mkOb/WXUcLICgT3O6Tvp9Vyez1P1eHT1DW7dkeu5hqal08raXNGwF9+xvo2oHzstTSHl/juXS+gmiI1Y4VqRiR0C6Euy/MBX4ywyOi/Fm8r9qxcvYaULsy/k8KudNjipL5KQxd/xKpw2Azs7fbbw== makub@acrab.ics.muni.cz
#aad the following ssh keys to the first specified user
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtv24kBxvFCiDAUxQvsYEaIoWdU+QVgcWU1q4uJ8Ngy+LKn6XIVQTKlWd9W7MPUgpL5jPHVgExN1vpH+UlS0cducDUCRVB3JU4fW8jXge/JEhqhfrwKMD/iE0DJ0k2Zxd8pyIway1Q2KYs5tqQTJcQX3FsJ2V86pDFeLYmisRTFbo4n0wog20euPYCuTAY0KlA8mkOb/WXUcLICgT3O6Tvp9Vyez1P1eHT1DW7dkeu5hqal08raXNGwF9+xvo2oHzstTSHl/juXS+gmiI1Y4VqRiR0C6Euy/MBX4ywyOi/Fm8r9qxcvYaULsy/k8KudNjipL5KQxd/xKpw2Azs7fbbw== makub@acrab.ics.muni.cz