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 H P H e l i o n O p e S t a c k
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 H P H e l i o n O p e S t a c k
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 H P H e l i o n O p e S t a c k
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 H P H e l i o n O p e S t a c k
--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 H P H e l i o n O p e S t a c k
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 H P H e l i o n O p e S t a c k
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 list ukazovat BUILD, ale po nějaké době už ACTIVE 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 H P H e l i o n O p e S t a c k
+---------------------+--------------------------------------+ 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 H P H e l i o n O p e S t a c k
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'image_id': u'bare', u'min_ram': u'0', u'disk_format': u'qcow2', u'image_name': u'debian-wheezy-amd64-20140929-disk', u'dfc71bdf-06ab-42d6-828e-51612cbcd9ac', u'checksum': u'5690939c3f261fac819347a6d8b7eb32', u'min_disk': u'0', u'size': u'221489152'} volume_type None +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 9 H P H e l i o n O p e S t a c k
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-0c4b- 4bc3-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 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 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 name: MojeSit1 sit2: type: OS::Neutron::Net name: MojeSit2 subnet1: type: OS::Neutron::Subnet 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 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 external_gateway_info: network: ext-net router_interface: type: OS::Neutron::RouterInterface router_id: { get_resource: router } subnet_id: { get_resource: subnet1 } router_interface2: type: OS::Neutron::RouterInterface router_id: { get_resource: router } subnet_id: { get_resource: subnet2 } server1_port: type: OS::Neutron::Port network_id: { get_resource: sit1 } fixed_ips: - subnet_id: { get_resource: subnet1 } server2_port: type: OS::Neutron::Port network_id: { get_resource: sit2 } fixed_ips: - subnet_id: { get_resource: subnet2 } server1: type: OS::Nova::Server key_name: MujKlic image: debian-wheezy-amd64-20140929-disk flavor: m1.tiny networks: - port: { get_resource: server1_port } server2: type: OS::Nova::Server 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 size: 1 volume2: type: OS::Cinder::Volume size: 1 vol1_att: type: OS::Cinder::VolumeAttachment instance_uuid: { get_resource: server1 } volume_id: { get_resource: volume1 } mountpoint: /dev/vdb vol2_att: type: OS::Cinder::VolumeAttachment 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