- Infrastrukturní DevOps s HPE OneView (1) – Infrastructure as Code
- Infrastrukturní DevOps s HPE OneView (2) – API
- Infrastrukturní DevOps s HPE OneView (3) – Message bus
- Infrastrukturní DevOps s HPE OneView (4) – PowerShell
- Infrastrukturní DevOps s HPE OneView (5) – PowerShell skripty
- Infrastrukturní DevOps s HPE OneView (6) – Python
- Infrastrukturní DevOps s HPE OneView (7) – Python skripty
- Infrastrukturní DevOps s HPE OneView (8) – vaše vlastní aplikace s Grommet
- Infrastrukturní DevOps s HPE OneView (9) – Ansible a infrastruktura
- Infrastrukturní DevOps s HPE OneView (10) – Ansible a Blade networking
- Infrastrukturní DevOps s HPE OneView (11) – Ansible a síťový fabric
- Infrastrukturní DevOps s HPE OneView (12) – Ansible a servery
Používat přímo API volání je kostrbaté, jednodušší je využít knihovny do programovacího nebo skritpovacího jazyka. OneView nabízí PowerShell pro ty, kteří preferují svět Windows, Python, který vyzkoušíme dnes, a dále ještě Ruby nebo Golang či Javu. Jak se píší skripty pro automatizaci vaší fyzické infrastruktury v Python?
V tomto díle budeme postupovat téměř stejně jako v článcích o PowerShell, takže méně teorie a víc se zaměříme na specifika Pythonu.
Python v interaktivním režimu
Stejně jako PowerShell i Python může běžet v interaktivním režimu, kdy se zadáváné příkazy rovnou provádějí.
Ujistěte se, že máte nainstalovaný Python (v Linuxu, Windows, MacOS). Stáhněte si knihovnu z github a nainstalujte ji (pokud upgradujete na novější verzi použijte git pull a pip install . –upgrade).
git clone https://github.com/HewlettPackard/python-hpOneView.git cd python-hpOneView pip install .
Skočte do interaktivního Python a zkuste import knihovny – mělo by to proběhnout v pořádku.
python >>> import hpOneView as ov
Nápovědu máme podobně jako u PowerShell přímo zabudovanou:
>>> help(ov) Help on package hpOneView: NAME hpOneView FILE c:\python27\lib\site-packages\hponeview\__init__.py DESCRIPTION HPE OneView Library ~~~~~~~~~~~~~~~~~~~~~ hpOneView is a library for interfacing with HPE OneView Management Appliance. PACKAGE CONTENTS activity common connection exception_handler exceptions facilities fcsans networking oneview_client profile resources (package) search security servers settings storage uncategorized FUNCTIONS main() ...
Takhle takhle třeba získáme detaily o tom, co nám nabízí objekt settings (výpis jsem významně zkrátil).
>>> help(ov.settings) Help on class settings in module hpOneView.settings: class settings(__builtin__.object) | Methods defined here: ... | get_version(self) | | restore_backup(self, backupUri) ...
Nápovědu máme, pusťme se do toho.
Nejdřív získáme objekt connection a při volání zadáme IP adresu naší OneView appliance. Pak si připravíme proměnnou obsahující json strukturu s přihlašovacími údaji a nad objektem con (ten teď reprezentuje naše spojení s OneView) provedeme přihlášení.
>>> con = ov.connection('192.168.89.100') >>> login = {'userName':'Administrator','password':'HPEnet123'} >>> con.login(login)
Na rozdíl od PowerShell je práce s Python knihovnou trochu víc cítit programováním, než jen skriptováním. Pro přístup k jednotlivým funkcím (nastavení, servery, storage, sítě, …) musíme nejprve získat příslušné objekty a nad nimi pak pracovat. Takhle například vytvoříme objekt nastavení a do proměnné si uložíme verzi OneView.
>>> sts = ov.settings(con) >>> verze = sts.get_version()
Podívejme se do proměnné – je tam datová struktura (Python dictionary – velmi podobné JSON) a to nám umožňuje ji bez obtíží parsovat. Jednoduše tak třeba vypíše hodnotu jen jednoho klíče.
>>> print(verze) {u'currentVersion': 200, u'minimumVersion': 1} >>> print(verze['currentVersion']) 200
Pojďme teď získat objekt aktivity a zažádat si o všechny alerty (můžeme i třídit podle systému či vážnosti, ale my teď bereme všechno). Získáte list slovníků, tedy co položka to detailní popis alertu s mnoha políčkami. Vypíšeme si první.
>>> act = ov.activity(con) >>> alerts = act.get_alerts() >>> alerts[0] {u'uri': u'/rest/alerts/755', u'assignedToUser': None, u'category': u'alerts', u'resourceUri': u'/rest/server-hardware/30303437-3933-4753-4831-30325835524E', u'severity': u'OK', u'resourceID': None, u'alertTypeID': u'Trap.cpqSm2ServerPowerOff', u'serviceEventDetails': None, u'healthCategory': u'Power', u'physicalResourceType': u'server-hardware', u'activityUri': None, u'lifeCycle': True, u'description': u'The server has been powered off. ', u'changeLog': [{u'username': u'System', u'userEntered': False, u'notes': u'Alert cleared.', u'uri': u'/rest/alerts/AlertChangeLog/756', u'created': u'2016-08-11T12:23:36.121Z'}], u'correctiveAction': None, u'eTag': u'2016-08-11T12:23:36.121Z', u'associatedResource': {u'resourceName': u'Encl1, bay 13', u'associationType': u'HAS_A', u'resourceCategory': u'server-hardware', u'resourceUri': u'/rest/server-hardware/30303437-3933-4753-4831-30325835524E'}, u'clearedByUser': u'System', u'alertState': u'Cleared', u'parentAlert': None, u'serviceEventSource': False, u'created': u'2016-08-11T12:23:36.121Z', u'type': u'AlertResourceV3', u'clearedTime': u'2016-08-11T12:23:36.121Z', u'modified': u'2016-08-11T12:23:36.121Z', u'associatedEventUris': [u'/rest/events/18112'], u'childAlerts': [], u'urgency': u'None'}
Protože máme údaje v Python dictionary, můžeme je jednoduše přímo parsovat. Takhle si třeba zobrazíme description prvního alertu.
>>> alerts[0]['description'] u'The server has been powered off. '
Udělejme si teď výpis alertů, kde bude jen čas vytvoření a text. Použijeme jednoduchý cyklus. Pro každý alert (to je i název proměnné) ze všech alerts (tam jsme si uložili kompletní výpis) chceme vytisknout čas a text. Python na rozdíl od jiných jazyků nepoužívá otevírání a ukončování (jako jsou třeba složené závorky v PowerShell), ale odsazování. Co je uvnitř cyklu musíte mít odsazené – tak Python pozná co tam patří.
>>> for alert in alerts: ... print alert['created'] + " " + alert['description'] ... 2016-08-11T12:23:36.121Z The server has been powered off. 2016-08-11T12:20:40.615Z The server has been powered off. 2016-08-11T12:20:33.899Z The server has been powered off. 2016-08-11T12:18:28.080Z Cold Start. 2016-08-11T12:18:28.055Z The server has been powered on. 2016-08-11T12:18:20.687Z Cold Start. 2016-08-11T12:18:20.655Z The server has been powered on. 2016-08-11T12:18:14.817Z Flex NIC subport state on Encl1, interconnect 1, port d13 changed. 2016-08-11T12:18:13.981Z Cold Start. 2016-08-11T12:18:13.957Z The server has been powered on. 2016-08-11T12:18:12.890Z The server has been powered off. 2016-08-11T12:18:05.570Z The server has been powered off. 2016-08-11T12:17:58.733Z The server has been powered off. 2016-08-11T12:17:55.910Z Connection deployed on downlink port 13, subport a. Connection enforcement succeeded. 2016-08-11T12:17:54.379Z Cold Start. 2016-08-11T12:17:54.351Z The server has been powered on. 2016-08-11T12:17:49.617Z Connection deployed on downlink port 12, subport a. Connection enforcement succeeded. 2016-08-11T12:17:47.943Z Cold Start. 2016-08-11T12:17:47.912Z The server has been powered on. 2016-08-11T12:17:42.889Z Connection deployed on downlink port 11, subport a. Connection enforcement succeeded. 2016-08-11T12:17:41.438Z The server has been powered on. 2016-08-11T12:17:41.401Z Cold Start. 2016-08-11T12:13:33.333Z The server has been powered off. 2016-08-11T12:13:27.067Z The server has been powered off. 2016-08-11T12:08:38.928Z Flex NIC subport state on Encl1, interconnect 1, port d12 changed. 2016-08-11T12:08:25.215Z Cold Start. 2016-08-11T12:08:25.188Z The server has been powered on.