HELION OPENSTACK
Transkript
HP HELION OPENSTACK LAB GUIDE ČÁST DRUHÁ – POKROČILÉ HP Helion OpenStack 1.1 Květen 2014 Tomáš Kubica Dokument verze 0.13 Obsah 1. Úvod do pokročilého ovládání Helion OpenStack ................................................................................ 2 1.1. Jdeme za rámec základní práce aneb proč automatizovat automatizované ................................ 2 1.2. Jak (a proč) se posunout z pouhé automatizované infrastruktury blíže k potřebám aplikací? .... 2 2. Příkazová řádka ..................................................................................................................................... 3 2.1. Proč příkazovou řádku?................................................................................................................. 3 2.2. OpenStack CLI ............................................................................................................................... 3 2.3. Přihlášení....................................................................................................................................... 5 2.4. První kroky v příkazové řádce ....................................................................................................... 6 2.5. Pokročilejší operace v příkazové řádce ....................................................................................... 10 2.6. Praktický příklad skriptu.............................................................................................................. 16 3. Lidsky čitelné datové formáty ............................................................................................................. 19 3.1. YAML ........................................................................................................................................... 19 3.2. JSON ............................................................................................................................................ 20 4. Orchestrační šablony OpenStack Heat................................................................................................ 20 4.1. Nejjednodušší šablona ................................................................................................................ 20 4.2. Komplexnější šablona ................................................................................................................. 25 4.3. Heat autoscaling a autohealing................................................................................................... 31 5. OpenStack API ..................................................................................................................................... 31 6. Úvod do orchestrace s HP Cloud Service Automation ........................................................................ 35 7. Starejme se o vnitřek VM s Ansible .................................................................................................... 35 7.1. K čemu je to dobré? .................................................................................................................... 35 7.2. Ansible......................................................................................................................................... 35 7.2.1 Instalace .............................................................................................................................. 35 7.2.2 Příprava labu ....................................................................................................................... 36 7.2.3 Základní operace ................................................................................................................. 39 7.2.4 Názorný příklad – web server ............................................................................................. 40 7.3. HP Server Automation ................................................................................................................ 41 8. HP Helion Development Platform ....................................................................................................... 41 9. Shrnutí a závěr .................................................................................................................................... 41 10. Další zdroje ...................................................................................................................................... 41 1|HP Helion OpeStack 1. Úvod do pokročilého ovládání Helion OpenStack 1.1. Jdeme za rámec základní práce aneb proč automatizovat automatizované V první části labu jsme si vyzkoušeli práci s Helion OpenStack přes jeho GUI. Dokázali jsme z jednoho nástroje rychle a efektivně vytvářet potřebné zdroje na úrovni virtuálních serverů, storage, sítí i bezpečnosti, a to všechno řízeným způsobem spojovali do výsledné infrastruktury na vyžádání. Proč bychom vůbec chtěli nad takovým systémem dělat ještě něco dalšího? Představte si následující situace: Máte komplexní aplikaci složenou z různých vrstev a komponent, má specifické nároky pro každou část z pohledu paměti, CPU, storage, jsou definovaná komunikační pravidla, označen backend a frontend a tak podobně. Jak bychom mohli pro své kolegy takovou infrastrukturu popsat? Screenshoty z GUI? Nešlo by to nějak lépe? Potřebujete dávkově vytvořit nějaké infrastrukturní prostředí, například založit 30 projektů, spustit 30 různě velkých VM nebo promazat nepoužívané sítě? Přece to nebudete klikat... Co když dostanete zadání infrastrukturních požadavků ve formě excel tabulky s názvy serverů? Co když budete potřebovat založit infrastrukturu na základě informací z jiného systému? Budete muset vzít nějakou tiskovou sestavu a naklikat to v GUI? Možná máte nějaké opakující se úkony, které ovšem vyžadují dosazení nějakých parametrů. Budete infrastrukturu pokaždé ručně naklikávat a vždy změníte jen těch pár parametrů? GUI Helion OpenStack je poněkud technické, možná by bylo dobré nabídnou nějaký katalag služeb, kde si uživatel jen vybere z katalogu možností – chci nový blog server, nový sharepoint, novou QA infrastrukturu, Development prostředí pro vývoj v Javě. Přesně v těchto momentech je vhodné nad Helion OpenStack budovat další vrstvu automatizace a abstrakcí – a to i pokud se stále jedná jen o infrastrukturu na vyžádání. Jaké máte prostředky? OpenStack CLI OpenStack Heat šablony OpenStack API a například Python HP Cloud Service Automation ... to je zlatý hřeb ! O tom všem v tomto labu. 1.2. Jak (a proč) se posunout z pouhé automatizované infrastruktury blíže k potřebám aplikací? Infrastruktura je palivo, aplikace jsou auta. Aplikace jsou to, co má blízko k byznysu a přináší zásadní hodnotu. Téměř každý nový byznysový projekt dnes potřebuje podporu IT, ať už kvůli realizaci, sběru dat, marketingu, řízení vztahů, výroby, dodávek. Prakticky vždy tato hodnota dříme v nějaké aplikaci. Teprve tu je potřeba někam umístit – do nějaké platformy (aplikačního prostředí) a tu do infrastruktury. My ovšem v dnešním labu nebudeme příliš zacházet do oblastí PaaS (to si necháme na jindy), ale i v rámci IaaS dává smysl se OS, aplikačnímu prostředí a třeba i vlastním aplikacím věnovat. Tak například jak to zařídit, abyste měli image (šablonu) nějaké instance, a přitom byla jistota, že po jejím nasazením bude obsahovat všechny nejnovější security patche, budou tam nainstalovány potřebné balíčky pro nejnovější verzi aplikace a tak podobně? Určitě nechcete po naběhnutí šablony pokaždé znovu 2|HP Helion OpeStack procházet kompletní proces aktualizací a instalací balíčků a prostředí či modifikace konfiguračních souborů apod. Stejně tak nechcete váš image přetvářet každý měsíc tak, aby obsahoval potřebné aktualizace. Pravděpodobně sáhnete po nějakém způsobu jak automatizovaným způsobem tyto potřeby zajišťovat. V dnešním labu si vyzkoušíte: Ansible (open source) HP Server Automation ... to je zlatý hřeb ! 2. Příkazová řádka 2.1. Proč příkazovou řádku? V předchozí části labu jsme se soustředili na ovládání skrze grafické rozhraní. Proč tedy vůbec má smysl znát příkazovou řádku? Příkazová řádka je open source a využívá OpenStack API, takže funguje stejně v různých modifikací OpenStack od různých výrobců – to co se naučíte se vám hodí v mnoha situacích V některých operacích je příkazová řádka rychlejší Ovládat infrastrukturu můžete i z minimálního systému bez grafického prostředí Příkazy můžete skriptovat, tedy vytvářet jednoduché „aplikace“, které dávkovým způsobem budou provádět nějaké operace nebo provádět pravidelné záležitosti (například sestavíte nějaké demo prostředí, které dáte k rozbití a po ukončení takové session skriptem vrátíte demo do původního stavu) Některé funkce jsou dostupné pouze tímto způsobem – běžný vývoj je, že nová funkce je jako první k dispozici v příkazové řádce a později v grafickém interface Pokročilejší uživatel by tedy měl CLI znát, stojí to za to. 2.2. OpenStack CLI OpenStack příkazová řádka je ve skutečnosti soubor open source aplikací napsaných v jazyce Python, který využívá OpenStack API. Jde tedy o CLI wrapper, čili textové rozhraní nad OpenStack RESTful API. Tyto aplikace můžete používat kdekoli, z jakéhokoli počítače s podporou Python (samotné aplikace si nainstalujete přes pip, v případě ubuntu jsou dostupné i jako apt-get balíčky). Aplikace mají jména podle názvů jednotlivých projektů: Nova (práce s instancemi) Cinder (práce s blokovou storage, tedy volume, snapshot apod.) Glance (práce s image) Swift (práce s objektovou storage) Neutron (síťařina) Keystone (jména, hesla, identity) Heat (orchestrační šablony) Jsou i další, ale pro lab je nebudeme potřebovat Obvykle se příkaz volá způsobem: nova operace poziční_parametr další_parametry (označené jako --parametr hodnota) 3|HP Helion OpeStack Tak například to může vypadat takhle: nova boot mojeVM --image Windows –flavor m1.tiny Často můžete požádat o pomoc, například: tomas@helion-ProLiant-DL380-Gen9:~$ nova help usage: nova [--version] [--debug] [--os-cache] [--timings] [--timeout <seconds>] [--os-auth-token OS_AUTH_TOKEN] [--os-username <auth-user-name>] [--os-password <auth-password>] [--os-tenant-name <auth-tenant-name>] [--os-tenant-id <auth-tenant-id>] [--os-auth-url <auth-url>] [--os-region-name <region-name>] [--os-auth-system <auth-system>] [--service-type <service-type>] [--service-name <service-name>] [--volume-service-name <volume-service-name>] [--endpoint-type <endpoint-type>] [--os-compute-api-version <compute-api-ver>] [--os-cacert <ca-certificate>] [--insecure] [--bypass-url <bypass-url>] <subcommand> ... Command-line interface to the OpenStack Nova API. Positional arguments: <subcommand> absolute-limits add-fixed-ip add-floating-ip add-secgroup agent-create ... Print a list of absolute limits for a user Add new IP address on a network to server. DEPRECATED, use floating-ip-associate instead. Add a Security Group to a server. Create new agent build. Nebo o detaily konkrétní operace tomas@helion-ProLiant-DL380-Gen9:~$ nova help boot usage: nova boot [--flavor <flavor>] [--image <image>] [--image-with <key=value>] [--boot-volume <volume_id>] [--snapshot <snapshot_id>] [--num-instances <number>] [--meta <key=value>] [--file <dst-path=src-path>] [--key-name <key-name>] [--user-data <user-data>] [--availability-zone <availability-zone>] [--security-groups <security-groups>] [--block-device-mapping <dev-name=mapping>] [--block-device key1=value1[,key2=value2...]] [--swap <swap_size>] [--ephemeral size=<size>[,format=<format>]] [--hint <key=value>] [--nic <net-id=net-uuid,v4-fixed-ip=ip-addr,port-id=port-uuid>] [--config-drive <value>] [--poll] <name> Boot a new server. Positional arguments: <name> Name for the new server Optional arguments: --flavor <flavor> Name or ID of flavor (see 'nova flavor-list'). --image <image> Name or ID of image (see 'nova image-list'). --image-with <key=value> Image metadata property (see 'nova image-show'). 4|HP Helion OpeStack --boot-volume <volume_id> Volume ID to boot from. --snapshot <snapshot_id> ... Jste vyzbrojeni, pojďme na to! 2.3. Přihlášení Nejprve se přes SSH (doporučuji program Putty) připojte na server v labu, z kterého budeme následující kroky provádět. Některé CLI příkazy jsou docela široké – nastavte tedy Putty tak, že se změnou velikosti okna bude přidávat znaky (místo zvětšování fontu) Pak zadejte IP adresu serveru v labu a připojte se Jakmile se připojíte ujistěte se, že jsou pro vás připraveny potřebné soubory api.sh a eca.crt tomas@helion-ProLiant-DL380-Gen9:~$ ls api.sh eca.crt Pokud ano, pokračujeme dál. Příkazová řádka je ve skutečnosti aplikace, která může běžet kdekoli. Musíme ji tedy říct, kde má hledat Helion OpenStack API server a dát jí přihlašovací údaje vašeho 5|HP Helion OpeStack projektu. Použijte připravený skript, aplikujte ho příkazem source a jako argumenty uveďte jméno heslo tenant. Například: tomas@helion-ProLiant-DL380-Gen9:~$ source api.sh tomas.kubica helion tomas.kubica kde “tomas.kubica” je uživatelské jméno i jméno projektu (tenantu) a “helion” je vaše heslo 2.4. První kroky v příkazové řádce Pojďme to hned vyzkoušet. Pokud jste po předchozím labu vše v rámci vašeho projektu pořádně vyčistili, neměla by být spuštěna žádná instance. Následující příkaz tedy vrátí prázdnou tabulku – ale to, že ji zobrazí znamená, že máme přihlašovací údaje správně. tomas@helion-ProLiant-DL380-Gen9:~$ nova list +----+------+--------+------------+-------------+----------+ | ID | Name | Status | Task State | Power State | Networks | +----+------+--------+------------+-------------+----------+ +----+------+--------+------------+-------------+----------+ Ale můžeme se podívat na Flavors tomas@helion-ProLiant-DL380-Gen9:~$ nova flavor-list +--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | | 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | | 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | | 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | | ddd64d6e-884c-4277-a068-eae6b370a479 | m1.tiny | 512 | 4 | 0 | | 1 | 1.0 | True | +--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+ Podobné to bude se storage volume tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +----+--------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +----+--------+--------------+------+-------------+----------+-------------+ +----+--------+--------------+------+-------------+----------+-------------+ Pokud jste vyčistili předchozí lab, uvidíte pouze výchozí síť a externí síť tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-list +--------------------------------------+-------------+-----------------------------------------------------+ | id | name | subnets | +--------------------------------------+-------------+-----------------------------------------------------+ | 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e | ext-net | e3be37fb-1ced-432f-950c-99b887bb52c2 | | 7590c21a-4878-48ae-b957-7562e4dc1d0d | default-net | 2c223f18-79f9-41c0-b19a-e5bdfa294895 192.168.1.0/24 | +--------------------------------------+-------------+-----------------------------------------------------+ Podívejme se ještě na dostupné image tomas@helion-ProLiant-DL380-Gen9:~$ glance image-list +--------------------------------------+-----------------------------------+-------------+------------------+-----------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+-----------------------------------+-------------+------------------+-----------+--------+ | dfc71bdf-06ab-42d6-828e-51612cbcd9ac | debian-wheezy-amd64-20140929-disk | qcow2 | bare | 221489152 | active | | 35c7876d-a570-4358-a44a-bcaa303b2673 | msgaas-rabbit-cluster_1.1.0.3 | qcow2 | bare | 525925376 | active | +--------------------------------------+-----------------------------------+-------------+------------------+-----------+--------+ Vyzkoušíme si jednoduché spuštění instance. V Putty využijte toho, že jakýkoli text označíte, tak se vám ihned automaticky nakopíruje do schránky. Do řádky ho pak vložíte jednoduše kliknutím na pravé tlačítko. To udělejte s názvem našeho debian image, ať to nemusíte opisovat. 6|HP Helion OpeStack tomas@helion-ProLiant-DL380-Gen9:~$ nova boot mojeVM --image debian-wheezy-amd64-20140929-disk --flavor m1.tiny +--------------------------------------+--------------------------------------------------------------------------+ | Property | Value | +--------------------------------------+--------------------------------------------------------------------------+ | OS-EXT-AZ:availability_zone | nova | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | | | OS-SRV-USG:terminated_at | | | accessIPv4 | | | accessIPv6 | | | adminPass | CwE4vk7vyQFx | | config_drive | | | created | 2015-03-25T11:27:57Z | | flavor | m1.tiny (ddd64d6e-884c-4277-a068-eae6b370a479) | | hostId | | | id | 701610f6-49b6-404a-9c3a-da11c21f8189 | | image | debian-wheezy-amd64-20140929-disk (dfc71bdf-06ab-42d6-828e-51612cbcd9ac) | | key_name | | | metadata | {} | | name | mojeVM | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | baa7096fe1d54571900c3758397e0939 | | updated | 2015-03-25T11:27:57Z | | user_id | 078a6c284c804ba0b68e9e5447043da7 | +--------------------------------------+--------------------------------------------------------------------------+ Koukněte se v jakém je stavu – nejdřív vám bude možná příkaz nova době už ACTIVE list ukazovat BUILD, ale po nějaké tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+--------+--------+------------+-------------+----------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+--------+--------+------------+-------------+----------+ | 701610f6-49b6-404a-9c3a-da11c21f8189 | mojeVM | BUILD | spawning | NOSTATE | | +--------------------------------------+--------+--------+------------+-------------+----------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+--------+--------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+--------+--------+------------+-------------+--------------------------+ | 701610f6-49b6-404a-9c3a-da11c21f8189 | mojeVM | ACTIVE | | Running | default-net=192.168.1.11 | +--------------------------------------+--------+--------+------------+-------------+--------------------------+ Pojďme ji hned zase zrušit tomas@helion-ProLiant-DL380-Gen9:~$ nova delete mojeVM tomas@helion-ProLiant-DL380-Gen9:~$ nova list +----+------+--------+------------+-------------+----------+ | ID | Name | Status | Task State | Power State | Networks | +----+------+--------+------------+-------------+----------+ +----+------+--------+------------+-------------+----------+ Vytvoříme si nový volume, který bude bootovací a bude na něm náš debian image. Tento musíme referencovat přes jeho ID, takže opět použijte příkaz glance image-list a označte si ID tak, že ho přes pravé tlačítko použijete, když je třeba. tomas@helion-ProLiant-DL380-Gen9:~$ cinder create --image-id dfc71bdf-06ab-42d6-828e-51612cbcd9ac --display-name MujBootDisk 4 7|HP Helion OpeStack +---------------------+--------------------------------------+ | Property | Value | +---------------------+--------------------------------------+ | attachments | [] | | availability_zone | nova | | bootable | false | | created_at | 2015-03-25T12:28:00.884103 | | display_description | None | | display_name | MujBootDisk | | encrypted | False | | id | bac044cb-c5ca-4c19-828b-47ad7cafd72b | | image_id | dfc71bdf-06ab-42d6-828e-51612cbcd9ac | | metadata | {} | | size | 4 | | snapshot_id | None | | source_volid | None | | status | creating | | volume_type | None | +---------------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +--------------------------------------+-------------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+-------------+--------------+------+-------------+----------+-------------+ | bac044cb-c5ca-4c19-828b-47ad7cafd72b | downloading | MujBootDisk | 4 | None | false | | +--------------------------------------+-------------+--------------+------+-------------+----------+-------------+ Po nějaké době bude volume připraven tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | bac044cb-c5ca-4c19-828b-47ad7cafd72b | available | MujBootDisk | 4 | None | true | | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ Nabootujeme z něj novou instanci – budeme potřebovat volume ID tomas@helion-ProLiant-DL380-Gen9:~$ nova boot dalsiVM --boot-volume bac044cb-c5ca-4c19-828b-47ad7cafd72b --flavor m1.tiny +--------------------------------------+--------------------------------------------------+ | Property | Value | +--------------------------------------+--------------------------------------------------+ | OS-EXT-AZ:availability_zone | nova | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | | | OS-SRV-USG:terminated_at | | | accessIPv4 | | | accessIPv6 | | | adminPass | eD2mKNnbdm5D | | config_drive | | | created | 2015-03-25T12:35:55Z | | flavor | m1.tiny (ddd64d6e-884c-4277-a068-eae6b370a479) | | hostId | | | id | 497fd77b-af7a-4c29-a0a6-fb327691744e | | image | Attempt to boot from volume - no image supplied | | key_name | | | metadata | {} | | name | dalsiVM | 8|HP Helion OpeStack | os-extended-volumes:volumes_attached | [{"id": "bac044cb-c5ca-4c19-828b-47ad7cafd72b"}] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | baa7096fe1d54571900c3758397e0939 | | updated | 2015-03-25T12:35:56Z | | user_id | 078a6c284c804ba0b68e9e5447043da7 | +--------------------------------------+--------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | 497fd77b-af7a-4c29-a0a6-fb327691744e | dalsiVM | ACTIVE | | Running | default-net=192.168.1.13 | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ Prohlédněme si detaily běžící instance tomas@helion-ProLiant-DL380-Gen9:~$ nova show dalsiVM +--------------------------------------+----------------------------------------------------------+ | Property | Value | +--------------------------------------+----------------------------------------------------------+ | OS-EXT-AZ:availability_zone | nova | | OS-EXT-STS:power_state | 1 | | OS-EXT-STS:task_state | | | OS-EXT-STS:vm_state | active | | OS-SRV-USG:launched_at | 2015-03-25T12:36:37.000000 | | OS-SRV-USG:terminated_at | | | accessIPv4 | | | accessIPv6 | | | config_drive | | | created | 2015-03-25T12:35:55Z | | default-net network | 192.168.1.13 | | flavor | m1.tiny (ddd64d6e-884c-4277-a068-eae6b370a479) | | hostId | 7ee01409c9503576106d27bbd5c42f5852e18553171df105b143d96e | | id | 497fd77b-af7a-4c29-a0a6-fb327691744e | | image | Attempt to boot from volume - no image supplied | | key_name | | | metadata | {} | | name | dalsiVM | | os-extended-volumes:volumes_attached | [{"id": "bac044cb-c5ca-4c19-828b-47ad7cafd72b"}] | | progress | 0 | | security_groups | default | | status | ACTIVE | | tenant_id | baa7096fe1d54571900c3758397e0939 | | updated | 2015-03-25T12:36:37Z | | user_id | 078a6c284c804ba0b68e9e5447043da7 | +--------------------------------------+----------------------------------------------------------+ Podívejme se na volume a také na jeho detaily tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ | bac044cb-c5ca-4c19-828b-47ad7cafd72b | in-use | MujBootDisk | 4 | None | true | 497fd77b-af7a-4c29-a0a6-fb327691744e | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder show MujBootDisk +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | attachments | [{u'device': u'/dev/vda', u'server_id': u'497fd77b-af7a-4c29-a0a6-fb327691744e', u'id': u'bac044cb-c5ca-4c19-828b-47ad7cafd72b', u'host_name': None, u'volume_id': u'bac044cb-c5ca-4c19-828b-47ad7cafd72b'}] | | availability_zone | nova | | bootable | true | | created_at | 2015-03-25T12:28:00.000000 | | display_description | None | | display_name | MujBootDisk | | encrypted | False | | id | bac044cb-c5ca-4c19-828b-47ad7cafd72b | | metadata | {u'readonly': u'False', u'attached_mode': u'rw'} | | os-vol-tenant-attr:tenant_id | baa7096fe1d54571900c3758397e0939 | | os-volume-replication:driver_data | None | | os-volume-replication:extended_status | None | | size | 4 | | snapshot_id | None | | source_volid | None | | status | in-use | | volume_image_metadata | {u'container_format': u'bare', u'min_ram': u'0', u'disk_format': u'qcow2', u'image_name': u'debian-wheezy-amd64-20140929-disk', u'image_id': u'dfc71bdf-06ab-42d6-828e-51612cbcd9ac', u'checksum': u'5690939c3f261fac819347a6d8b7eb32', u'min_disk': u'0', u'size': u'221489152'} | | volume_type | None | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 9|HP Helion OpeStack 2.5. Pokročilejší operace v příkazové řádce Některé další aspekty, které si pamatuje z první části labu, si jen rámcově ukážeme, ale nebudeme s nimi aktivně pracovat. Pokud vás budou zajímat, využívejte help příkazů (nova help, nova boot help, …) a pohrajte si sami. tomas@helion-ProLiant-DL380-Gen9:~$ nova secgroup-list +--------------------------------------+--------------+--------------+ | Id | Name | Description | +--------------------------------------+--------------+--------------+ | ea62d680-0c24-4f60-9417-ea6f5d639eee | MojePravidla | MojePravidla | | b9eaf0cf-e8b2-41f1-93d8-df59fbcc3615 | default | default | +--------------------------------------+--------------+--------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova secgroup-list-rules MojePravidla +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | -1 | 0.0.0.0/0 | | | tcp | 22 | 22 | 0.0.0.0/0 | | | | | | | MojePravidla | +-------------+-----------+---------+-----------+--------------+ tomas@helion-ProLiant-DL380-Gen9:~$ swift list MujKontejner tomas@helion-ProLiant-DL380-Gen9:~$ swift upload MujKontejner api.sh api.sh tomas@helion-ProLiant-DL380-Gen9:~$ swift list MujKontejner api.sh Můžeme si vytvořit další, tentokrát prázdný volume a připojit ho do naší běžící instance tomas@helion-ProLiant-DL380-Gen9:~$ cinder create --display-name DalsiDisk 1 +---------------------+--------------------------------------+ | Property | Value | +---------------------+--------------------------------------+ | attachments | [] | | availability_zone | nova | | bootable | false | | created_at | 2015-03-25T12:57:48.719454 | | display_description | None | | display_name | DalsiDisk | | encrypted | False | | id | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | | metadata | {} | | size | 1 | | snapshot_id | None | | source_volid | None | | status | creating | | volume_type | None | +---------------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | 497fd77b-af7a-4c29-a0a6-fb327691744e | dalsiVM | ACTIVE | | Running | default-net=192.168.1.13 | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova volume-attach dalsiVM 90773500-d1b9-4d92-a3fa-148a7b1445a2 +----------+--------------------------------------+ 10 | H P H e l i o n O p e S t a c k | Property | Value | +----------+--------------------------------------+ | device | /dev/vdb | | id | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | | serverId | 497fd77b-af7a-4c29-a0a6-fb327691744e | | volumeId | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | +----------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | in-use | DalsiDisk | 1 | None | false | 497fd77b-af7a-4c29-a0a6-fb327691744e | | bac044cb-c5ca-4c19-828b-47ad7cafd72b | in-use | MujBootDisk | 4 | None | true | 497fd77b-af7a-4c29-a0a6-fb327691744e | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ Následně můžeme volume zase odpojit, udělat snapshot a znovu připojit tomas@helion-ProLiant-DL380-Gen9:~$ nova volume-detach dalsiVM 90773500-d1b9-4d92-a3fa-148a7b1445a2 tomas@helion-ProLiant-DL380-Gen9:~$ cinder snapshot-create 90773500-d1b9-4d92-a3fa-148a7b1445a2 --display-name MujDalsiSnapshot +---------------------+--------------------------------------+ | Property | Value | +---------------------+--------------------------------------+ | created_at | 2015-03-25T18:55:25.723306 | | display_description | None | | display_name | MujDalsiSnapshot | | id | 0ee3d322-29fb-453b-b448-6bf169569cdb | | metadata | {} | | size | 1 | | status | creating | | volume_id | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | +---------------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder snapshot-list +--------------------------------------+--------------------------------------+-----------+------------------+------+ | ID | Volume ID | Status | Display Name | Size | +--------------------------------------+--------------------------------------+-----------+------------------+------+ | 0ee3d322-29fb-453b-b448-6bf169569cdb | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | available | MujDalsiSnapshot | 1 | +--------------------------------------+--------------------------------------+-----------+------------------+------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova volume-attach dalsiVM 90773500-d1b9-4d92-a3fa-148a7b1445a2 +----------+--------------------------------------+ | Property | Value | +----------+--------------------------------------+ | device | /dev/vdb | | id | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | | serverId | 497fd77b-af7a-4c29-a0a6-fb327691744e | | volumeId | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | +----------+--------------------------------------+ Na závěr si ještě pohrajeme se sítí. Nejprve se ujistěte, že jste na konci minulého labu zrušili router i nové sítě, ale floating IP máte pro projekt přiřazenou (pokud ne, snadno si opravíte ) tomas@helion-ProLiant-DL380-Gen9:~$ neutron floatingip-list +--------------------------------------+------------------+---------------------+---------+ | id | fixed_ip_address | floating_ip_address | port_id | +--------------------------------------+------------------+---------------------+---------+ | 090d298a-357f-4def-90fd-752471c6a149 | | 172.16.2.3 | | +--------------------------------------+------------------+---------------------+---------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-list 11 | H P H e l i o n O p e S t a c k +--------------------------------------+-------------+-----------------------------------------------------+ | id | name | subnets | +--------------------------------------+-------------+-----------------------------------------------------+ | 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e | ext-net | e3be37fb-1ced-432f-950c-99b887bb52c2 | | 7590c21a-4878-48ae-b957-7562e4dc1d0d | default-net | 2c223f18-79f9-41c0-b19a-e5bdfa294895 192.168.1.0/24 | +--------------------------------------+-------------+-----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-list tomas@helion-ProLiant-DL380-Gen9:~$ neutron subnet-list +--------------------------------------+------+----------------+--------------------------------------------------+ | id | name | cidr | allocation_pools | +--------------------------------------+------+----------------+--------------------------------------------------+ | 2c223f18-79f9-41c0-b19a-e5bdfa294895 | | 192.168.1.0/24 | {"start": "192.168.1.2", "end": "192.168.1.254"} | +--------------------------------------+------+----------------+--------------------------------------------------+ Teď se pokusíme v CLI udělat něco podobného, co v prvním labu v GUI – tedy vytvoříme dvě nové sítě, každou se svým subnetem a router, který je propojuje a připojuje na gateway. tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-create PrvniSit Created a new network: +-----------------+--------------------------------------+ | Field | Value | +-----------------+--------------------------------------+ | admin_state_up | True | | id | d78a23ba-d8d3-46f3-99eb-4f429890338a | | name | PrvniSit | | router:external | False | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | baa7096fe1d54571900c3758397e0939 | +-----------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-create DruhaSit Created a new network: +-----------------+--------------------------------------+ | Field | Value | +-----------------+--------------------------------------+ | admin_state_up | True | | id | 8c7f0937-0b96-4cf6-bc5f-70884fa58e1b | | name | DruhaSit | | router:external | False | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | baa7096fe1d54571900c3758397e0939 | +-----------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron subnet-create --name PrvniSubnet --allocation-pool start=192.168.5.100,end=192.168.5.200 --dns-nameserver 8.8.8.8 PrvniSit 192.168.5.0/24 Created a new subnet: +-------------------+----------------------------------------------------+ | Field | Value | +-------------------+----------------------------------------------------+ | allocation_pools | {"start": "192.168.5.100", "end": "192.168.5.200"} | | cidr | 192.168.5.0/24 | | dns_nameservers | 8.8.8.8 | | enable_dhcp | True | | gateway_ip | 192.168.5.1 | | host_routes | | | id | 8bb31674-2ba7-45a5-8983-c1da8b738448 | 12 | H P H e l i o n O p e S t a c k | ip_version | 4 | | ipv6_address_mode | | | ipv6_ra_mode | | | name | PrvniSubnet | | network_id | d78a23ba-d8d3-46f3-99eb-4f429890338a | | tenant_id | baa7096fe1d54571900c3758397e0939 | +-------------------+----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron subnet-create --name DruhySubnet --allocation-pool start=192.168.6.100,end=192.168.6.200 --dns-nameserver 8.8.8.8 DruhaSit 192.168.6.0/24 Created a new subnet: +-------------------+----------------------------------------------------+ | Field | Value | +-------------------+----------------------------------------------------+ | allocation_pools | {"start": "192.168.6.100", "end": "192.168.6.200"} | | cidr | 192.168.6.0/24 | | dns_nameservers | 8.8.8.8 | | enable_dhcp | True | | gateway_ip | 192.168.6.1 | | host_routes | | | id | b9e73792-0441-42ad-a7ba-5efde9f36894 | | ip_version | 4 | | ipv6_address_mode | | | ipv6_ra_mode | | | name | DruhySubnet | | network_id | 8c7f0937-0b96-4cf6-bc5f-70884fa58e1b | | tenant_id | baa7096fe1d54571900c3758397e0939 | +-------------------+----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-list +--------------------------------------+-------------+-----------------------------------------------------+ | id | name | subnets | +--------------------------------------+-------------+-----------------------------------------------------+ | 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e | ext-net | e3be37fb-1ced-432f-950c-99b887bb52c2 | | 7590c21a-4878-48ae-b957-7562e4dc1d0d | default-net | 2c223f18-79f9-41c0-b19a-e5bdfa294895 192.168.1.0/24 | | 8c7f0937-0b96-4cf6-bc5f-70884fa58e1b | DruhaSit | b9e73792-0441-42ad-a7ba-5efde9f36894 192.168.6.0/24 | | d78a23ba-d8d3-46f3-99eb-4f429890338a | PrvniSit | 8bb31674-2ba7-45a5-8983-c1da8b738448 192.168.5.0/24 | +--------------------------------------+-------------+-----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-create DalsiRouter Created a new router: +-----------------------+--------------------------------------+ | Field | Value | +-----------------------+--------------------------------------+ | admin_state_up | True | | external_gateway_info | | | id | ca89b936-0c1b-401b-aa66-f5a0c9adab44 | | name | DalsiRouter | | routes | | | status | ACTIVE | | tenant_id | baa7096fe1d54571900c3758397e0939 | +-----------------------+--------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-gateway-set ca89b936-0c1b-401b-aa66-f5a0c9adab44 3a5b5cd4-0c4b4bc3-b44e-826c7b19556e Set gateway for router ca89b936-0c1b-401b-aa66-f5a0c9adab44 tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-interface-add ca89b936-0c1b-401b-aa66-f5a0c9adab44 PrvniSubnet Added interface 12bdc881-3749-4246-a55a-f8dc8732e8ff to router ca89b936-0c1b-401b-aa66-f5a0c9adab44. tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-interface-add ca89b936-0c1b-401b-aa66-f5a0c9adab44 DruhySubnet Added interface 43ddd2ce-39ba-4aaa-9fcc-6116cbbe1a25 to router ca89b936-0c1b-401b-aa66-f5a0c9adab44. 13 | H P H e l i o n O p e S t a c k Podívejte se do GUI a ověřte si, že výsledek je dle očekávání Posledním krokem bude vytvořit instanci běžící v některé z našich nových sítí tomas@helion-ProLiant-DL380-Gen9:~$ nova boot netVM --image debian-wheezy-amd64-20140929-disk --flavor m1.tiny --nic net-id=d78a23ba-d8d3-46f3-99eb-4f429890338a +--------------------------------------+--------------------------------------------------------------------------+ | Property | Value | +--------------------------------------+--------------------------------------------------------------------------+ | OS-EXT-AZ:availability_zone | nova | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | | | OS-SRV-USG:terminated_at | | | accessIPv4 | | | accessIPv6 | | | adminPass | NYERzSDLFn9b | | config_drive | | | created | 2015-03-26T05:06:34Z | | flavor | m1.tiny (ddd64d6e-884c-4277-a068-eae6b370a479) | | hostId | | 14 | H P H e l i o n O p e S t a c k | id | e266c8d8-c6de-4419-aa22-04a9354fbbe2 | | image | debian-wheezy-amd64-20140929-disk (dfc71bdf-06ab-42d6-828e-51612cbcd9ac) | | key_name | | | metadata | {} | | name | netVM | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | baa7096fe1d54571900c3758397e0939 | | updated | 2015-03-26T05:06:34Z | | user_id | 078a6c284c804ba0b68e9e5447043da7 | +--------------------------------------+--------------------------------------------------------------------------+ A výsledek? Právě jste pronikli do základů OpenStack CLI, gratuluji! Na závěr po sobě uklidíme tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ | 497fd77b-af7a-4c29-a0a6-fb327691744e | dalsiVM | ACTIVE | | Running | default-net=192.168.1.13 | | e266c8d8-c6de-4419-aa22-04a9354fbbe2 | netVM | ACTIVE | | Running | PrvniSit=192.168.5.101 | +--------------------------------------+---------+--------+------------+-------------+--------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova delete dalsiVM tomas@helion-ProLiant-DL380-Gen9:~$ nova delete netVM 15 | H P H e l i o n O p e S t a c k tomas@helion-ProLiant-DL380-Gen9:~$ cinder snapshot-list +--------------------------------------+--------------------------------------+-----------+------------------+------+ | ID | Volume ID | Status | Display Name | Size | +--------------------------------------+--------------------------------------+-----------+------------------+------+ | 0ee3d322-29fb-453b-b448-6bf169569cdb | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | available | MujDalsiSnapshot | 1 | +--------------------------------------+--------------------------------------+-----------+------------------+------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder snapshot-delete 0ee3d322-29fb-453b-b448-6bf169569cdb tomas@helion-ProLiant-DL380-Gen9:~$ cinder list +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | 90773500-d1b9-4d92-a3fa-148a7b1445a2 | available | DalsiDisk | 1 | None | false | | | bac044cb-c5ca-4c19-828b-47ad7cafd72b | available | MujBootDisk | 4 | None | true | | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ tomas@helion-ProLiant-DL380-Gen9:~$ cinder delete DalsiDisk tomas@helion-ProLiant-DL380-Gen9:~$ cinder delete MujBootDisk tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-list +--------------------------------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | id | name | external_gateway_info | +--------------------------------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ca89b936-0c1b-401b-aa66-f5a0c9adab44 | DalsiRouter | {"network_id": "3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "e3be37fb-1ced-432f-950c-99b887bb52c2", "ip_address": "172.16.2.6"}]} | +--------------------------------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron subnet-list +--------------------------------------+-------------+----------------+----------------------------------------------------+ | id | name | cidr | allocation_pools | +--------------------------------------+-------------+----------------+----------------------------------------------------+ | 2c223f18-79f9-41c0-b19a-e5bdfa294895 | | 192.168.1.0/24 | {"start": "192.168.1.2", "end": "192.168.1.254"} | | 8bb31674-2ba7-45a5-8983-c1da8b738448 | PrvniSubnet | 192.168.5.0/24 | {"start": "192.168.5.100", "end": "192.168.5.200"} | | b9e73792-0441-42ad-a7ba-5efde9f36894 | DruhySubnet | 192.168.6.0/24 | {"start": "192.168.6.100", "end": "192.168.6.200"} | +--------------------------------------+-------------+----------------+----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-interface-delete DalsiRouter 8bb31674-2ba7-45a5-8983-c1da8b738448 Removed interface from router DalsiRouter. tomas@helion-ProLiant-DL380-Gen9:~$ neutron router-interface-delete DalsiRouter b9e73792-0441-42ad-a7ba-5efde9f36894 Removed interface from router DalsiRouter. tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-list +--------------------------------------+-------------+-----------------------------------------------------+ | id | name | subnets | +--------------------------------------+-------------+-----------------------------------------------------+ | 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e | ext-net | e3be37fb-1ced-432f-950c-99b887bb52c2 | | 7590c21a-4878-48ae-b957-7562e4dc1d0d | default-net | 2c223f18-79f9-41c0-b19a-e5bdfa294895 192.168.1.0/24 | | 8c7f0937-0b96-4cf6-bc5f-70884fa58e1b | DruhaSit | b9e73792-0441-42ad-a7ba-5efde9f36894 192.168.6.0/24 | | d78a23ba-d8d3-46f3-99eb-4f429890338a | PrvniSit | 8bb31674-2ba7-45a5-8983-c1da8b738448 192.168.5.0/24 | +--------------------------------------+-------------+-----------------------------------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-delete PrvniSit Deleted network: PrvniSit tomas@helion-ProLiant-DL380-Gen9:~$ neutron net-delete DruhaSit Deleted network: DruhaSit 2.6. Parsování Linux a příkazová řádka je odvěká kombinace, takže nepřekvapí, že obsahuje řadu nástrojů pro parsování výstupu. Vyzkoušejme si jednoduchý příklad. Nejprve vypišme seznam image bez nějakých modifikací: 16 | H P H e l i o n O p e S t a c k tomas@helion-ProLiant-DL380-Gen9:~$ glance image-list +--------------------------------------+--------------------------------------------------------------------------------------+-------------+------------------+------------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+--------------------------------------------------------------------------------------+-------------+------------------+------------+--------+ | 8b8f00f8-5543-4a07-9c85-485889f1c2ff | ansible | qcow2 | bare | 1300889600 | active | | abcac3ce-4180-4817-b848-939bb48080c0 | dbaas-api_1.1.0.35 | qcow2 | bare | 589732352 | active | | 6e2b077a-26fe-4eac-bfd2-937c9937791e | dbaas-conductor_1.1.0.35 | qcow2 | bare | 589570048 | active | | 6a42e333-9bb6-40a7-862f-11b53fffb676 | dbaas-database_1.1.0.35 | qcow2 | bare | 680777216 | active | | ef6211f6-95a9-4eb6-a45b-cd9f9d4ab641 | dbaas-guest_1.1.0.35 | qcow2 | bare | 654554112 | active | | 16f03c0b-6c47-4ac8-ab5a-19e64338a8c0 | dbaas-messaging_1.1.0.35 | qcow2 | bare | 584186368 | active | | ee7280a3-b4ad-4bd1-98e5-6639cefe51c3 | dbaas-taskmanager_1.1.0.35 | qcow2 | bare | 589372416 | active | | dfc71bdf-06ab-42d6-828e-51612cbcd9ac | debian-wheezy-amd64-20140929-disk | qcow2 | bare | 221489152 | active | | 0d54050e-8b4f-454b-adc1-6ee23ad1efba | HP Helion Development Platform CE - Application Lifecycle Service Installer 1.1.0.19 | qcow2 | bare | 504060416 | active | | 8be1cda2-b2be-4fa6-a5b4-0e63e66e0491 | HP Helion Development Platform CE - Application Lifecycle Service Seed Node 1.1.0.19 | qcow2 | bare | 3771465728 | active | | a652e1e2-462f-41ef-926c-2fe716625156 | marketplace-api_1.1.0.40 | qcow2 | bare | 588244480 | active | | b7623074-6909-4b57-b139-dd2935a03284 | marketplace-database_1.1.0.40 | qcow2 | bare | 666752512 | active | | 2fd67325-5830-497c-aa19-c71701eb4c2e | marketplace-engine_1.1.0.40 | qcow2 | bare | 575566848 | active | | 15e23004-0dea-4f0e-b07f-329535554e34 | marketplace-messaging_1.1.0.40 | qcow2 | bare | 570447360 | active | | b9942ece-e544-4dff-b7c8-b7d0d0769672 | msgaas-rabbit-cluster_1.0.0.2 | qcow2 | bare | 507274240 | active | | a37d347e-e9b1-4814-b47c-c730c2727a1f | msgaas-rabbit-cluster_1.0.0.2 | qcow2 | bare | 507274240 | active | | 35c7876d-a570-4358-a44a-bcaa303b2673 | msgaas-rabbit-cluster_1.1.0.3 | qcow2 | bare | 525925376 | active | +--------------------------------------+--------------------------------------------------------------------------------------+-------------+------------------+------------+--------+ Možná bychom teď potřebovali pro další zpracování získat jen všechna ID našich obrazů, ostatní informace nám tam překážejí. Výstup příkazu můžeme nasměrovat do jiné utilitky s nzvek awk, která dokáže parsovat jednotlivá slova. Takto si vytiskneme vždy jen druhé slovo v řádku: tomas@helion-ProLiant-DL380-Gen9:~$ glance image-list | awk '{print $2}' ID 8b8f00f8-5543-4a07-9c85-485889f1c2ff abcac3ce-4180-4817-b848-939bb48080c0 6e2b077a-26fe-4eac-bfd2-937c9937791e 6a42e333-9bb6-40a7-862f-11b53fffb676 ef6211f6-95a9-4eb6-a45b-cd9f9d4ab641 16f03c0b-6c47-4ac8-ab5a-19e64338a8c0 ee7280a3-b4ad-4bd1-98e5-6639cefe51c3 dfc71bdf-06ab-42d6-828e-51612cbcd9ac 0d54050e-8b4f-454b-adc1-6ee23ad1efba 8be1cda2-b2be-4fa6-a5b4-0e63e66e0491 a652e1e2-462f-41ef-926c-2fe716625156 b7623074-6909-4b57-b139-dd2935a03284 2fd67325-5830-497c-aa19-c71701eb4c2e 15e23004-0dea-4f0e-b07f-329535554e34 b9942ece-e544-4dff-b7c8-b7d0d0769672 a37d347e-e9b1-4814-b47c-c730c2727a1f 35c7876d-a570-4358-a44a-bcaa303b2673 To není špatné, ale oddělující čáry nám vycházejí jako prázdné řádky (jsou totiž jedno slovo, takže druhé neexistuje a tím vznikne prázdný řádek ve výstupu). Awk umožňuje klást podmínky, tak například nám vypíše pouze řádky, které splňují nějaké kritérium (například název image, tedy $4, obsahuje nějaké znaky). My jednoduše budeme chtít, aby se něco vytisklo jen, pokud $2 existuje: tomas@helion-ProLiant-DL380-Gen9:~$ glance image-list | awk '{if ($2) print $2}' ID 8b8f00f8-5543-4a07-9c85-485889f1c2ff abcac3ce-4180-4817-b848-939bb48080c0 6e2b077a-26fe-4eac-bfd2-937c9937791e 6a42e333-9bb6-40a7-862f-11b53fffb676 ef6211f6-95a9-4eb6-a45b-cd9f9d4ab641 16f03c0b-6c47-4ac8-ab5a-19e64338a8c0 ee7280a3-b4ad-4bd1-98e5-6639cefe51c3 dfc71bdf-06ab-42d6-828e-51612cbcd9ac 0d54050e-8b4f-454b-adc1-6ee23ad1efba 8be1cda2-b2be-4fa6-a5b4-0e63e66e0491 a652e1e2-462f-41ef-926c-2fe716625156 b7623074-6909-4b57-b139-dd2935a03284 17 | H P H e l i o n O p e S t a c k 2fd67325-5830-497c-aa19-c71701eb4c2e 15e23004-0dea-4f0e-b07f-329535554e34 b9942ece-e544-4dff-b7c8-b7d0d0769672 a37d347e-e9b1-4814-b47c-c730c2727a1f 35c7876d-a570-4358-a44a-bcaa303b2673 To už je lepší, prázdné řádky jsou pryč. Ještě nám tam zbývá název sloupce, tedy „ID“. V takovém případě ho do výstupu zahrnout nechceme: tomas@helion-ProLiant-DL380-Gen9:~$ glance image-list | awk '{if ($2!="ID" && $2) print $2}' 8b8f00f8-5543-4a07-9c85-485889f1c2ff abcac3ce-4180-4817-b848-939bb48080c0 6e2b077a-26fe-4eac-bfd2-937c9937791e 6a42e333-9bb6-40a7-862f-11b53fffb676 ef6211f6-95a9-4eb6-a45b-cd9f9d4ab641 16f03c0b-6c47-4ac8-ab5a-19e64338a8c0 ee7280a3-b4ad-4bd1-98e5-6639cefe51c3 dfc71bdf-06ab-42d6-828e-51612cbcd9ac 0d54050e-8b4f-454b-adc1-6ee23ad1efba 8be1cda2-b2be-4fa6-a5b4-0e63e66e0491 a652e1e2-462f-41ef-926c-2fe716625156 b7623074-6909-4b57-b139-dd2935a03284 2fd67325-5830-497c-aa19-c71701eb4c2e 15e23004-0dea-4f0e-b07f-329535554e34 b9942ece-e544-4dff-b7c8-b7d0d0769672 a37d347e-e9b1-4814-b47c-c730c2727a1f 35c7876d-a570-4358-a44a-bcaa303b2673 A je to – máme očištěný výstup, který můžeme použít pro další zpracování – o tom za chvilku. 2.7. Praktický příklad skriptu Pro tento lab jsem potřeboval vytvořit prostředí pro 30 účastníků - vytvořit projekt v Helion OpenStack, uživatelské přihlášení a loginy v serveru v labu (to s Helion nijak nesouvisí). Stačilo z pozvánky v kalendáří vzít začátek vašich emailových adres a uložit to po řádkách do souboru. Následně spustit následující skript, který udělá co potřebujeme. Všimněte si, že nastavení OpenStack prostředí je kratší a jednodušší, než vytvoření vašeho loginu do serveru v labu #!/bin/bash while read line do name=$line keystone tenant-create --name $line keystone user-create --tenant $line --name $line --pass helion home="/home/$line" useradd $line -s /bin/bash echo "$line:helion" | chpasswd cp -R /etc/skel "$home" && echo $'\e[32m'"Copied skeleton to: $home"$'\e[m' || ( exit_code=$?; echo $'\e[31m'"Failed to create: $home"$'\e[m' ) >&2 chown -R "$line:$line" "$home" && echo $'\e[32m'"Set owner on: $home"$'\e[m' || ( exit_code=$?; echo $'\e[31m'"Failed to set owner on: $home"$'\e[m' ) >&2 done < $1 Tím pádem je možné kdykoli do prostředí přidat další účastníky školení... přece to nebudete všechno klikat. 18 | H P H e l i o n O p e S t a c k 2.8. Příklad skriptu s parsováním Pokud chcete v OpenStack vymazat router, musíte nejdřív zrušit jeho interface. Zkusme si napsat jednoduchý skript, kterému jako parametr pošleme ID routeru a on nejprve zjistí jeho interface, ty zruší a následně smaže celý router. Vypadalo by to nějak takhle: for port in $(neutron router-port-list $1 | awk '{if ($2 != "id" && $2) print $2}') do neutron router-interface-delete $1 port=$port done neutron router-delete $1 Jak script vytvořit? Použijte třeba editor nano (nano jmenoskriptu.sh) a do něj tento text vložte (schránka a pravé tlačítko), pak to uložte. Ještě musíte skript učinit spustitelný příkazem Chmod +x jmenoskriptu.sh Jak použít? Takhle: root@helion-ProLiant-DL380-Gen9:~# neutron router-list +--------------------------------------+------+-----------------------+ | id | name | external_gateway_info | +--------------------------------------+------+-----------------------+ | dd11512d-469c-4285-b27c-708a258f9eef | test | null | +--------------------------------------+------+-----------------------+ root@helion-ProLiant-DL380-Gen9:~# ./routerdelete.sh dd11512d-469c-4285-b27c-708a258f9eef Removed interface from router dd11512d-469c-4285-b27c-708a258f9eef. Deleted router: dd11512d-469c-4285-b27c-708a258f9eef root@helion-ProLiant-DL380-Gen9:~# neutron router-list ... tady je prázdno Tak vidíte, skriptování není těžké. 3. Lidsky čitelné datové formáty Prakticky všechny moderní nástroje používají k popisu nějaké datové struktury lidsky čitelné formáty místo dřívějších binárních souborů. Určitě znáte jeden z nich, který je ale (z mnoha důvodů) spíše na ústupu – XML. V rámci našeho labu se setkáme s YAML a JSON. 3.1. YAML YAML je předpis datové struktury, který je extrémně dobře lidsky čitelný. Přestože se může zdát, že jde o text bez zřejmých pravidel, tato jsou jasně daná a díky nim dokáže počítač celou strukturu zpracovat. Myslím, že následující příklad tak není třeba nijak podrobně vysvětlovat – poznáte, jaké informace jsou obsaženy a v jaké struktuře? --zamestnanci: jmeno: "tomas" napoj: "pivo" jazyk: - "EN" - "CZ" jmeno: "martin" napoj: "vino" jazyk: - "EN" 19 | H P H e l i o n O p e S t a c k - "SK" YAML (případně jeho různé podmnožiny) je velmi často využíván pro šablony, konfigurační soubory, předpisy a tak podobně. Jsou na něm postaveny například OpenStack Heat infrastrukturní šablony nebo Ansible playbooky. 3.2. JSON Formát JSON je jiný předpis datové struktury, který je velmi úsporný, velmi dobře zpracovatelný počítačem, a přitom si zachovává dobrou lidskou čitelnost. Takhle vypadají stejná data z předchozího příladu v JSON formátu: {"zamestnanci":[ { "jmeno":"tomas", "napoj":"pivo", "jazyk":["EN", "CZ"] }, { "jmeno":"martin", "napoj":"vino", "jazyk":["EN", "SK"] } ] } Pro svoje vlastnosti je velmi oblíbený v různých API, zejména v RESTful. Do této kategorie patří OpenStack API, iLO, OneView, iMC i SDN API a také API celé řady nástrojů z dílny HP Software. 4. Orchestrační šablony OpenStack Heat 4.1. Nejjednodušší šablona Připojte se do GUI a jděte na záložku Orchestration, Stacks a klikněte na Launch Stack Šablonu můžete zadat přímo do okna, nebo ji nahrajete ve formě souboru. Obsah šablony používá YAML strukturu a pro začátek bude vypadat takto: heat_template_version: 2013-05-23 description: Vytvorime jednoduchou instanci resources: PrvniPokus: 20 | H P H e l i o n O p e S t a c k type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny Vložte do okna (nebo přes soubor) a klikněte na Next Použijte nějaké jméno, zadejte heslo a klikněte na Launch Počkejte až všechno doběhne 21 | H P H e l i o n O p e S t a c k Koukněte se do instancí – je tam? Nic složitého, ale také zatím nic zvlášť užitečného. Vraťte se do Stacků a zrušte ho kliknutím na Delete Stack Šablona může být interaktivnější a některé parametry si nechat zadat uživatelem až v okamžiku jejího deploymentu. Následující příklad dává možnost definovat typ (velikost/flavor) serveru, ale chceme dát na výběr jen ze dvou možností. Dále využijeme možnosti formovat výstup, ve kterém předáme dál některé informace z instalace šablony, v našem případě jakou IP adresu VM dostala (teď se vám to bude zdát zbytečné, ale až se dostaneme k možnosti navázat šablonu na další operace v Ansiblu nebo jinému nástroji, uvidíte, jak je předání parametrů dál důležité). Vezměte tento text a vložte do schránky (nebo si přepište do souboru). heat_template_version: 2013-05-23 description: Vytvorime jednoduchou instanci parameters: instance_type: type: string label: Typ instance description: Vyberte si flavor m1.tiny nebo m1.small constraints: - allowed_values: [ m1.tiny, m1.small ] description: Pripustne hodnoty jsou m1.tiny nebo m1.small. resources: PrvniPokus: type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: { get_param: instance_type } 22 | H P H e l i o n O p e S t a c k outputs: instance_ip: description: IP adresa vysledne instance value: { get_attr: [PrvniPokus, first_address] } Založte tento Stack a klikněte na Next Všimněte si, že GUI po vás chce vyplnit onen parametr a klikněte na Launch Až bude nahoře, klikněte na Stack pro další detaily 23 | H P H e l i o n O p e S t a c k Na první záložce je obrázek topologie šablony, ale to zatím neukazuje nic zajímavého. Klikněte na Overview Všimněte si některých detailů včetně našeho output pravidla 24 | H P H e l i o n O p e S t a c k Na úvod to není špatné. Zrušte tento Stack a zkusíme si něco pořádného. 4.2. Komplexnější šablona Přestaňme chodit kolem horké kaše a připravme si něco složitějšího a užitečnějšího. Zrušte aktuální Stack a vytvoříme si nový, komplexnější. YAML je dostatečně dobře čitelný, takže nebudeme vysvětlovat jednotlivé aspekty této šablony – pročtěte si jí a určitě pochopíte, co se tady děje. Vytvoříme si dvě nové sítě, dva subnety, nový router a zajistíme potřebné propojení. Dále založíme dva volume, dva servery koukající každý do jiné sítě a volume k nim namapujeme. Vypadá to takhle: heat_template_version: 2013-05-23 description: Vytvorime jednoduchou instanci resources: sit1: type: OS::Neutron::Net properties: name: MojeSit1 sit2: type: OS::Neutron::Net properties: name: MojeSit2 subnet1: type: OS::Neutron::Subnet properties: network_id: { get_resource: sit1 } cidr: 192.168.10.0/24 allocation_pools: 25 | H P H e l i o n O p e S t a c k - start: 192.168.10.100 end: 192.168.10.200 subnet2: type: OS::Neutron::Subnet properties: network_id: { get_resource: sit2 } cidr: 192.168.11.0/24 allocation_pools: - start: 192.168.11.100 end: 192.168.11.200 router: type: OS::Neutron::Router properties: external_gateway_info: network: ext-net router_interface: type: OS::Neutron::RouterInterface properties: router_id: { get_resource: router } subnet_id: { get_resource: subnet1 } router_interface2: type: OS::Neutron::RouterInterface properties: router_id: { get_resource: router } subnet_id: { get_resource: subnet2 } server1_port: type: OS::Neutron::Port properties: network_id: { get_resource: sit1 } fixed_ips: - subnet_id: { get_resource: subnet1 } server2_port: type: OS::Neutron::Port properties: network_id: { get_resource: sit2 } fixed_ips: - subnet_id: { get_resource: subnet2 } server1: type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny networks: - port: { get_resource: server1_port } server2: type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny networks: - port: { get_resource: server2_port } 26 | H P H e l i o n O p e S t a c k volume1: type: OS::Cinder::Volume properties: size: 1 volume2: type: OS::Cinder::Volume properties: size: 1 vol1_att: type: OS::Cinder::VolumeAttachment properties: instance_uuid: { get_resource: server1 } volume_id: { get_resource: volume1 } mountpoint: /dev/vdb vol2_att: type: OS::Cinder::VolumeAttachment properties: instance_uuid: { get_resource: server2 } volume_id: { get_resource: volume2 } mountpoint: /dev/vdb Založte tuto šablonu (už víte jak) a až bude nastartována, pojďme si ji prohlédnout. Takhle třeba Stack topologie ukazuje návaznosti Prohlédněte si vytvořené zdroje (screenshot nezahrnuje všechny) 27 | H P H e l i o n O p e S t a c k a události 28 | H P H e l i o n O p e S t a c k Prověříme si síťovou topologii 29 | H P H e l i o n O p e S t a c k Instance a volume Zkrátka všechno je tak, jak jsme chtěli. Zopakujme pár poznatků: 30 | H P H e l i o n O p e S t a c k 4.3. Už dříve jsme si vyzkoušeli, že šablona může zahrnovat mnoho vstupních parametrů, takže dokument může být poměrně univerzální a při použití šablony si ji uživatel doladí dle reálných potřeb Šablona je v jednoduchém textovém formátu a sama o sobě může sloužit jako dokumentace (Infrastructure as code) Jednoduchý textový formát můžete prohnat libovolným versioning systémem jako je třeba Git a snadno zjistíte rozdíly mezi verzemi šablony Kromě vyzkoušených věcí můžete používat konfigurační skripty – k tomu se ještě později dostaneme Výsledkem může být předání parametrů do dalšího systému, například něco, co zajistí konfiguraci OS a instalaci aplikace Heat šablony podporují automatické škálování a redundanci a o tom hned v další kapitole Heat autoscaling a autohealing OpenStack Heat dokáže víc, než jsme dosud viděli, ale jde o funkce, které se v tuto chvíli poměrně bouřlivě vyvíjí. Autoscaling je už na velmi dobré úrovni, autohealing zatím není implementován ve formě, která by byla produkčně použitelná. Tato funkcionalita je nad rámec dnešního labu, ale pojďme si alespoň popsat o co jde. Autoscaling je funkce Heat, která umožňuje v rámci topologie automaticky naklonovat (nebo pozabíjet) instance podle nějakých parametrů. Těmito parametry typicky bývá metrika přicházející z OpenStack modulu Ceilometer a půjde například o zatížení CPU. Definujete tedy pravidlo, že počet web serverů se má pohybovat mezi 2 až 8 a pokud je zátěž členů větší, než třeba 70%, nastartuje se další VM (až do definovaného maxima). Pokud zátěž klesne pod hranici 50% a vydrží tam po nějaký čas (cool time, třeba půl hodiny), Heat zabije nadbytečné VM. S nástupem Helion OpenStack 2.0 bude v řešení k dispozici i load-balancer jako služba (LBaaS) a bude zajištěno i automatické přidání nových VM do load-balancing skupiny. Důležité je také nezaměňovat autoscaling infrastruktury s možnosti autoscaling aplikací v PaaS – v prvním případě jde jen o bootování image z template, zatímco v PaaS se jedná o komplexní deployment aplikace, začlenění do RabbitMQ a mnoho dalších operací. Je dobré si uvědomit, že autoscaling vyžaduje připravenost aplikace – tedy šablona vaší VM musí být schopna si sama nathnout state i obsah (třeba ze sdílené databáze). Autohealing implementace v Heat není v aktuální stavu doporučena pro produkci, ale pracuje se na kompletní předělání v rámci komunity. Myšlenkou je, aby šablona udržovala svůj stav – tedy pokud dojde k havárii některé komponenty popsané v šabloně (například zmizí VM v důsledku pádu fyzického compute node), Heat by zajistil spuštění této VM na jiném compute node (nabootováním ze stejného StoreVirtual volume například). 5. OpenStack API Veškeré operace, které jsme dosud dělali (a ještě MNOHO dalších) nemusíme provádět pouze z grafického rozhraní, příkazové řádky nebo konstrukcí šablony. To všechno je dostupné i ve formě RESTful API. RESTful je koncept v současnosti velmi rozšířeného způsobu interakce komponent a aplikací postavený na jednoduchých webových voláních podobně, jako přistupujete třeba na nějakou webovou stránku. 31 | H P H e l i o n O p e S t a c k URL říká jakou funkci voláte (třeba práce s volume) a přístupová metoda znamená co s ní chcete dělat (vytvořit, přečíst, upravit, smazat). Formát dat je lidsky čitelný JSON formát. RESTful API najdete u mnoha dalších HP produktů jako je: iLO OneView Moonshot chassis manager iMC VAN SDN Controller 3PAR StoreVirtual Cloud Service Automation Server Automation Operation Orchestration ... a mnoho dalších RESTful rozhraní můžete využívat v jakémkoli programovacím jazyce bez jakýchkoli proprietárních knihoven. V našem labu si pouze poodhalíme možnosti, nebudeme dělat nic komplexního. Využijeme toho, že OpenStack kromě čistého API nabízí i předpřipravené knihovny pro řadu programovacích jazyků včetně velmi oblíbeného Python (ve kterém je ostatně OpenStack napsán). Použití této SDK nám celou situaci ještě víc zjednoduší. Proč se může OpenStack API hodit? Jakékoli jiné aplikace lze integrovat a vytvářet tak infrastrukturu dle jejich předpisu – například HP Cloud Service Automation vám dá grafické designéry služeb, billing, portál pro odběratele služeb a k tomu všemu využívá OpenStack API API se dá použít i ke čtení, takže například produkt jako je Server Automation dokáže načítat IP adresy nových VM, aby na ně nainstaloval potřebné patche Všechna taková „udělátka“ budou fungovat na všech OpenStack instalacích – nejen HP Helion OpenStack, ale i HP Helion Public Cloud a všechny další produkty třetích stran využívající OpenStack Vyzkoušíme si naprogramovat tři příkladové jednoduché aplikace. Připojte se přes SSH do labu (viz předchozí instrukce) a skripty tam najdete připravené. Nejprve si každý okomentujeme v tomto textu a následně si je spusťte. Před tím budete muset nahrát do environmental proměnných přihlašovací údaje stejně, jak jsme to dělali u příkazové řádky (použijte příkaz source api.sh jméno heslo projekt). První skript nám ukáže jak natáhnout přihlašovací údaje a přihlásit se ke komponentě glance, která řeší repozitář diskových obrazů. Následně je jednoduše vypíšeme na obrazovku. from os import environ as env import glanceclient.v2.client as glclient import keystoneclient.v2_0.client as ksclient keystone = ksclient.Client(auth_url=env['OS_AUTH_URL'], username=env['OS_USERNAME'], 32 | H P H e l i o n O p e S t a c k password=env['OS_PASSWORD'], tenant_name=env['OS_TENANT_NAME'], cacert=env['OS_CACERT']) glance_endpoint = keystone.service_catalog.url_for(service_type='image') glance = glclient.Client(glance_endpoint, token=keystone.auth_token, cacert=env['OS_CACERT']) images = list(glance.images.list()) print 'Tak vidim tady tyto image:' print '--------------------------' for image in images: print image['name'] Pokud máte základy Python, jistě nic složitého Vyzkoušejte si tuto aplikaci, ale před tím (pokud jste přeskočili některé předchozí laby nebo se od serveru odpojili) zavolejte (na vaše loginy upravený) příkaz source api.sh tomas.kubica helion tomas.kubica pro nastavení environmental proměnných s přihlašovacími údaji do OpenStack. Aplikace se spouští příkazem python následovaným jejím jménem, tedy: tomas@helion-ProLiant-DL380-Gen9:~$ python imagelist.py Tak vidim tady tyto image: -------------------------msgaas-rabbit-cluster_1.1.0.3 debian-wheezy-amd64-20140929-disk No a je to, funguje. Vyzkoušejme něco o trochu složitějšího – pojďme vytvořit VM (s výchozím nastavením). Aplikaci předáme požadované jméno VM jako argument, ale nechceme jen ať VM vytvoří, ale sleduje, kdy bude aktivní. Tedy po vytvoření instance budeme informovat uživatele, že se systém teprve utváří a až bude hotovo, vypíšeme vše co vidíme. Skript vypadá takhle: from os import environ as env import glanceclient.v2.client as glclient import keystoneclient.v2_0.client as ksclient import novaclient.v1_1.client as nvclient import time,sys print "Kontaktujeme OpenStack" nova = nvclient.Client(auth_url=env['OS_AUTH_URL'], username=env['OS_USERNAME'], api_key=env['OS_PASSWORD'], project_id=env['OS_TENANT_NAME'], cacert=env['OS_CACERT']) image = nova.images.find(name="debian-wheezy-amd64-20140929-disk") flavor = nova.flavors.find(name="m1.tiny") name = sys.argv[1] print "Vytvarime novou VM " + name instance = nova.servers.create(name=name, image=image, flavor=flavor, key_name="MujKlic") print "VM startuje" booting = True while booting: instance = nova.servers.get(instance.id) 33 | H P H e l i o n O p e S t a c k sys.stdout.write('.') sys.stdout.flush() if instance.status != 'BUILD': booting = False time.sleep(2) print print "VM je vytvorena a bezi" print print 'Tak vidim tady tyto servery:' print '--------------------------' servers = list(nova.servers.list()) for server in servers: print server.status + ' ' + server.name Vyzkoušejte to: tomas@helion-ProLiant-DL380-Gen9:~$ python vytvorserver.py hop Kontaktujeme OpenStack Vytvarime novou VM hop VM startuje .................. VM je vytvorena a bezi Tak vidim tady tyto servery: -------------------------ACTIVE hop ACTIVE hopla ACTIVE testik Zopakujte to víckrát, ať máte stejně jako třeba tři spuštěné instance, protože v dalším skriptu budeme instance naopak mazat. Následující skript si vypíše všechny instance a jednu po druhé zlikviduje. from os import environ as env import glanceclient.v2.client as glclient import keystoneclient.v2_0.client as ksclient import novaclient.v1_1.client as nvclient import time,sys print "Kontaktujeme OpenStack" nova = nvclient.Client(auth_url=env['OS_AUTH_URL'], username=env['OS_USERNAME'], api_key=env['OS_PASSWORD'], project_id=env['OS_TENANT_NAME'], cacert=env['OS_CACERT']) print 'Jdeme likvidovat VM' print '--------------------------' servers = list(nova.servers.list()) for server in servers: print server.name + " konci..." nova.servers.delete(server) Vyzkoušejte to: tomas@helion-ProLiant-DL380-Gen9:~$ python zabvsechny.py Kontaktujeme OpenStack Jdeme likvidovat VM -------------------------hop konci... hopla konci... testik konci... 34 | H P H e l i o n O p e S t a c k tomas@helion-ProLiant-DL380-Gen9:~$ nova list +--------------------------------------+--------+---------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+--------+---------+------------+-------------+--------------------------+ | 4005ef9e-1320-4553-87e3-173d25d1c3a4 | hop | DELETED | | Running | default-net=192.168.1.30 | | 2b5744d2-7c22-4f1d-97b2-d78e105f5d8f | hopla | ACTIVE | deleting | Running | default-net=192.168.1.29 | | 6c54ae5e-1bc8-4124-865b-a430a6815fe3 | testik | ACTIVE | deleting | Running | default-net=192.168.1.28 | +--------------------------------------+--------+---------+------------+-------------+--------------------------+ tomas@helion-ProLiant-DL380-Gen9:~$ nova list +----+------+--------+------------+-------------+----------+ | ID | Name | Status | Task State | Power State | Networks | +----+------+--------+------------+-------------+----------+ +----+------+--------+------------+-------------+----------+ To by pro tento lab stačilo – účelem je dát nahlédnout do možností API, ne důkladně proškolit programování pro OpenStack. 6. Úvod do orchestrace s HP Cloud Service Automation Bude k dispozici v pozdějších verzích lab guide 7. Starejme se o vnitřek VM s Ansible 7.1. K čemu je to dobré? HP Helion OpenStack nabízí infrastrukturu jako službu – získáte výpočetní, ukládací a síťové prostředky rychle, jednoduše a z jediného nástroje. Ukázali jsme si, že díky použití diskových obrazů, snapshotů a možnosti modifikací OS uvnitř (například vsunutí ověřovacích klíčů nebo spuštění jednoduchého skriptu) můžete nabootovat instanci v potřebném stavu. Často ale chcete ještě větší flexibilitu – varieta potřebných konfigurací vnitřku instancí je příliš velká na to, abyste chtěli mít sto různých image a hlavně se vám nechce je neustále předělávat tak, jak se objevuje potřeba změn či instalací nějakých patchů. Chtělo by to nástroj, který by po vzniku instance zařídil vše co je potřeba k tomu, aby se OS a aplikace nacházeli v tom správném stavu, verzi, ve všech vhodných návaznostech. Jednoduché vyvolání skriptu, které OpenStack nabízí, v takovém případě nebude stačit. V rámci labu se seznámíme s dvojicí řešení zaměřených přesně na tento problém. Pokud hledáte něco jednoduchého a open source, ukážeme si Ansible. Pokud ovšem chcete něco v plné palbě, s obrovskou škálou šablon, grafickým prostředím a enterprise podporou, použijte HP Server Automation. 7.2. Ansible 7.2.1 Instalace V rámci labu budete používat hotovu šablonu s názvem ansible a přihlašovacími údaji ansible/ansible, takže instalovat Ansible server nebudete muset. Pokud byste někdy potřebovali, tak buď použijte balíček přímo z Linux OS (většinou vede na starší verzi) nebo získejte nejnovější verzi následujícím postupem: export http_proxy=http://web-proxy.corp.hp.com:8088 apt-get update apt-get install python-pip python-dev git -y pip install PyYAML jinja2 paramiko --proxy=web-proxy.corp.hp.com:8088 git config --global http.proxy http://web-proxy.corp.hp.com:8088 git clone https://github.com/ansible/ansible.git cd ansible 35 | H P H e l i o n O p e S t a c k make install git submodule update --init --recursive 7.2.2 Příprava labu Infrastruktura, na které to budme zkoušet zahrnuje tři servery, z toho dva jsou v roli prázdných Linux systémů a třetí bude fungovat jako Ansible server. Abychom nemuseli naklikávat potřebné věci ručně, použijte následující Heat šablonu (už víte jak) s tím, že ve vašem projektu musí existovat klíč s názvem MujKlic (pokud ne, šablonu si upravte na jiné jméno). Pokud máte v projektu ještě nějakou další infrastrukturu, zrušte ji, ať máte dostatek zdrojů. Šablona vypadá takhle: heat_template_version: 2013-05-23 description: Ansible lab resources: firewall: type: OS::Neutron::SecurityGroup properties: name: firewall description: Ping, SSH, web rules: - protocol: icmp - protocol: tcp port_range_min: 22 port_range_max: 22 - protocol: tcp port_range_min: 80 port_range_max: 80 ansible_net: type: OS::Neutron::Net properties: name: AnsibleNet ansible_subnet: type: OS::Neutron::Subnet properties: network_id: { get_resource: ansible_net } cidr: 192.168.20.0/24 allocation_pools: - start: 192.168.20.100 end: 192.168.20.200 ansible_router: type: OS::Neutron::Router properties: external_gateway_info: network: ext-net router_interface: type: OS::Neutron::RouterInterface properties: router_id: { get_resource: ansible_router } subnet_id: { get_resource: ansible_subnet } ansible_port1: type: OS::Neutron::Port 36 | H P H e l i o n O p e S t a c k properties: network_id: { get_resource: ansible_net } fixed_ips: - subnet_id: { get_resource: ansible_subnet } security_groups: - {get_resource: firewall} ansible_port2: type: OS::Neutron::Port properties: network_id: { get_resource: ansible_net } fixed_ips: - subnet_id: { get_resource: ansible_subnet } security_groups: - {get_resource: firewall} ansible_port3: type: OS::Neutron::Port properties: network_id: { get_resource: ansible_net } fixed_ips: - subnet_id: { get_resource: ansible_subnet } security_groups: - {get_resource: firewall} floating_ip1: type: OS::Neutron::FloatingIP properties: floating_network_id: 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e port_id: { get_resource: ansible_port1 } floating_ip2: type: OS::Neutron::FloatingIP properties: floating_network_id: 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e port_id: { get_resource: ansible_port2 } floating_ip3: type: OS::Neutron::FloatingIP properties: floating_network_id: 3a5b5cd4-0c4b-4bc3-b44e-826c7b19556e port_id: { get_resource: ansible_port3 } ansible: type: OS::Nova::Server properties: key_name: MujKlic image: ansible flavor: m1.tiny networks: - port: { get_resource: ansible_port1 } client1: type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny networks: - port: { get_resource: ansible_port2 } client2: 37 | H P H e l i o n O p e S t a c k type: OS::Nova::Server properties: key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny networks: - port: { get_resource: ansible_port3 } A toto je její výsledek: 38 | H P H e l i o n O p e S t a c k Přihlašte se teď do serveru v labu přes SSH protokol (z Putty) tak, jak už jsme to v labu dělali. Následně ověřte, že máte přístup do instance s Ansible serverem (IP adresu najdete v seznamu běžících instancí): tomas@helion-ProLiant-DL380-Gen9:~$ ssh [email protected] The authenticity of host '172.16.2.29 (172.16.2.29)' can't be established. ECDSA key fingerprint is 58:dd:b2:b3:d2:1e:cb:d0:24:eb:21:74:e8:2a:a2:52. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.2.29' (ECDSA) to the list of known hosts. [email protected]'s password: Linux ansible 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Apr 2 07:35:51 2015 from 10.0.10.254 ansible@ansible-ansible-mq5ltt3vkg5p:~$ ls ansible demo.yml hosts index.html proxy.sh ansible@ansible-ansible-mq5ltt3vkg5p:~$ 7.2.3 Základní operace Nejprve do naší ansible VM chceme dostat privátní klíč, který v rámci našeho projektu využíváme (stáhli jste si ho v prvním labu z GUI). Můžete ho nakopírovat přes SCP nebo přes schránku – zadejte příkaz cat > mujklic.pem a následně označte obsah tohoto souboru na vašem počítači a v Putty okně klikněte na pravé tlačítko. Operaci ukončete stisknutím CTRL+D. Změňte bezpečnostní práva k tomuto souboru a zkuste se připojit – vše by mělo proběhnout bez zadávání hesla. chmod 600 adminpair.pem ansible@test-1:~$ ssh [email protected] -i mujklic.pem Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. debian@client:~$ exit logout Connection to 192.168.11.106 closed. Pro Ansible vytvoříme seznam koncových OS, na které budeme sahat a současně je můžeme dát do skupin tak, aby se nám s nimi dobře pracovalo. Vytvořte soubor hosts zadáním příkazu nano hosts Do souboru napiště název nové skupiny (například helionlab) a IP adresu (či DNS) klintských instancí. [helionlab] 192.168.11.106 192.168.11.107 Ansible může pracovat v ad-hoc režimu, tedy že defacto můžeme v reálném čase provádět hromadné operace s množinou serverů. Vyzkoušejme si jednodchý „ping“, kdy Ansible zjistí, jestli má do všech našich systémů přístup. V průběhu můžete být dotázáni, zda si chcete uložit host key (pokud jste se ještě 39 | H P H e l i o n O p e S t a c k přes SSH do těch dalších instancí nepřipojovali) – dejte jednoduše ano. V příkazu se odkážeme na náš klíč, přihlašovat se budeme jako uživatel debian a specifikujeme seznam ovládaných klientů v souboru hosts. ansible@ansible:~$ ansible helionlab -m ping --private-key mujklic.pem -i hosts -u debian 192.168.11.106 | success >> { "changed": false, "ping": "pong" } 192.168.11.107 | success >> { "changed": false, "ping": "pong" } Máme odpovědi, Ansible tedy dokáže naše další VM spravovat – v tuto chvíli už je tedy jedno, jestli budou dvě nebo jich bude tisíc. V ad-hoc režimu můžeme například poslat do těchto VM nějaký soubor a dělat další základní operace. 7.2.4 Názorný příklad – web server Hlavní síla ale dříme v playbook, tedy šablonách. V těch řeknete co na cílovém systému očekáváte a Ansible to zařídí. Dělá se to formou modulů a rolí a celá řada jich přichází předinstalována a další si můžete stáhnout. Zkusíme si na cílové systémy dostat webový server a dát do něj novou úvodní stránku. Vytvořte příkazem nano index.html primitivní webovou stránku: <h1>HP je cool!</h1> Teď si uděláme playbook, tedy předpis, jak má server ve výsledku vypadat co do nainstalovaných a nastavených aplikací. Ansible používá lidsky dobře čitelného formátu YAML, podobně, jako OpenStack Heat. V labové image už by měl být připraven soubor demo.yml, pokud ne vytvořte jej: --- hosts: helionlab sudo: yes tasks: - name: Installs nginx web server apt: pkg=nginx state=installed update_cache=true environment: http_proxy: http://web-proxy.corp.hp.com:8088 notify: - start nginx - name: Upload default index.html for host copy: src=index.html dest=/usr/share/nginx/www/ mode=0644 handlers: - name: start nginx service: name=nginx state=started Co se tam děje? Říkáme, že balík serverů ve skupině helionlab má mít nainstalovaný software NGINX, což je open source webový server. Dále chceme do serveru nahrát novou startovací webovou stránku a když se vše podaří, server nastartovat. Může být jeden nebo tisíc, to nehraje roli. 40 | H P H e l i o n O p e S t a c k Nejdřív si zkuste, že na serveru aktuálně žádný web neběží. Abychom nemuseli do grafického prostředí, použijeme textový „prohlížeč“ curl (po chvilce marného čekání zmáčněte CTRL+C): ansible@ansible:~$ curl 192.168.11.106 ^C ansible@ansible:~$ curl 192.168.11.107 ^C Žádný web tam neběží. Použijme teď Ansible na instalaci a konfiguraci potřebného software: ansible@ansible:~$ ansible-playbook demo.yml -u debian -i hosts --private-key=mujklic.pem PLAY [prvnidemo] ************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.11.106] ok: [192.168.11.107] TASK: [Installs nginx web server] ********************************************* changed: [192.168.11.106] changed: [192.168.11.107] TASK: [Upload default index.html for host] ************************************ changed: [192.168.11.106] changed: [192.168.11.107] NOTIFIED: [start nginx] ******************************************************* changed: [192.168.11.106] changed: [192.168.11.107] PLAY RECAP ******************************************************************** 192.168.11.106 : ok=4 changed=3 unreachable=0 failed=0 192.168.11.107 : ok=4 changed=3 unreachable=0 failed=0 Zdá se, že to dobře dopadlo – běží tam náš nový web server? ansible@ansible:~$ curl 192.168.11.106 <h1>HP je cool!</h1> ansible@ansible:~$ curl 192.168.11.107 <h1>HP je cool!</h1> 7.3. HP Server Automation 7.2.5 Připojení 8. HP Helion Development Platform Bude k dispozici v pozdějších verzích lab guide 9. Shrnutí a závěr Bude k dispozici v pozdějších verzích lab guide 10. Další zdroje Bude k dispozici v pozdějších verzích lab guide 41 | H P H e l i o n O p e S t a c k 42 | H P H e l i o n O p e S t a c k
Podobné dokumenty
oVirt - virtualizace datacentra aneb správa
Co je oVirt?
Centralizovaný nástroj pro správu
velkého množství virtualizovaných
desktopů a serverů.
Open source alternativa k
vCenter/vSphere
Postaven nad KVM.
Jednoduchý deploy a správa.
hpe helion openstack
definováno administrátorem. OpenStack vám také ukazuje, která velikost se ještě vejde do zdrojů, které vám zbývají
(administrátor všemu projektu přidělil nějakou kvótu na různé zdroje – vCPU, paměť...
Island a ekonomická krize II – dopady a analýza
plán již v srpnu, nicméně tito odmítli. Naopak vlastníci bank tvrdí, že v polovině září přišli
s plánem na sloučení Glitniru, Landsbanki a jedné drobné banky s pomocí státu do jednoho
subjektu, kte...
Návrh privátní IaaS cloudové platformy - Newt on-da-line
Bezpečnost – Virtualizovaná prostředí se nemohou vzájemně ovlivňovat a
přistupovat k hostitelskému stroji.
stavíme si vlastní cloud pro vývoj a testování
Web: opennebula.org
Přehledná dokumentace: docs.opennebula.org