Kontextualizace VM

Z MetaCentrum
Skočit na navigaci Skočit na vyhledávání


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