Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.


22.03.2019

Pożegnanie z systemem Windows...

System operacyjny Windows 7 wciąż cieszy się dużą popularnością wśród użytkowników...
22.03.2019

Segmentacja sieci

Fortinet FortiGate 3600E, 3400E, 600E i 400E
22.03.2019

Monitoring IP

TP-Link TL-SL1218MP
22.03.2019

Efektywność energetyczna

UPS Eaton 93E
21.02.2019

Wdrażanie projektów AI

Infrastruktura OVH
21.02.2019

Certyfikacja kluczy

HEUTHES-CAK
21.02.2019

Kopie zapasowe

Veeam Availability for AWS
21.02.2019

Dysk SSD Samsung 970 EVO Plus

Dysk SSD Samsung 970 EVO Plus
21.02.2019

Szyfrowane USB

Kingston IronKey D300 Serialized

Ansible w służbie NOC

Data publikacji: 27-07-2018 Autor: Piotr Wojciechowski
STRUKTURA DZIEDZICZENIA

Elastyczność danego narzędzia mierzymy tym, jak bardzo możemy je dostosować do własnych potrzeb i czy wymagać będzie to od nas specjalistycznej wiedzy. Ansible wykorzystujemy do operacji na lokalnym systemie operacyjnym, instalacji oprogramowania czy wprowadzania zmian na zdalnych urządzeniach. Wiele funkcji zostało oprogramowanych przez producentów sprzętu lub społeczność zbudowaną wokół produktu, nie zaś deweloperów Ansible. Każda osoba, która opanowała podstawy języka Python, może napisać własne moduły. 

Przygotowanie playbooków, które miałyby wspomóc w pracy inżynierów centrów nadzoru w przeprowadzaniu działań diagnostycznych czy powtarzalnych zadań utrzymaniowych, będzie od nas wymagać dodania do niego nowych funkcji. Ansible bardzo dobrze sprawdza się, gdy wykonywane czynności realizowane są według określonego scenariusza, ale nie ma wbudowanych zaawansowanych mechanizmów zbierania informacji i ich późniejszej analizy, a sposób prezentacji podsumowania wykonanego playbooka nie jest zbyt czytelny i może sprawiać trudność nie tylko niedoświadczonym inżynierom. 
 
Sposób działania Ansible modyfikujemy, tworząc w języku Python wtyczki, które realizują zaprogramowane przez nas zadania. Wystarczy nam ponadpodstawowa znajomość języka i biegłość w czytaniu dokumentacji bibliotek. Główne ograniczenia wynikają ze sposobu działania Ansible i zaimplementowanych w bibliotekach funkcji. Początkowo sporą trudność może sprawić skąpa dokumentacja przygotowana dla deweloperów. Jeżeli nie są one opisane w dokumentacji, pozostanie nam analiza kodu biblioteki albo innych projektów, których tysiące znajdziemy choćby udostępnionych na GitHub. Musimy także dobrze zrozumieć mechanizm dziedziczenia, który jest elementem programowania obiektowego nie tylko w języku Python.
 
> Dziedziczenie w programowaniu obiektowym
 
Pojęcie dziedziczenia jest związane z programowaniem obiektowym i polega na tworzeniu nowej klasy na podstawie definicji innej klasy i dziedziczeniu jej cech, czyli zmiennych czy metod. Dla utworzonej przez nas kopii istnieje nadrzędna klasa określana mianem rodzica (parent), jej kopia zaś potomkiem (child). W polskojęzycznej dokumentacji możemy też spotkać się z terminami odpowiednio klasy bazowej i klasy pochodnej. W języku Python potomek może mieć więcej niż jednego rodzica, czyli dziedziczyć cechy więcej niż jednej klasy w stosunku do niego bazowej. 
 
Na schemacie widzimy dwie klasy o nazwach Rodzic i Dziecko. W klasie Rodzic zdefiniowane są dwie zmienne imie i nazwisko oraz trzy metody napisz_imie(), napisz_nazwisko() oraz zwroc_nazwisko(). Zdefiniowaliśmy też metodę o nazwie __init__(), która nazywana jest także konstruktorem. Jest ona automatycznie wykonywana, gdy tworzony jest nowy obiekt na podstawie zdefiniowanej klasy. Wykorzystamy ją do stworzenia wspomnianych wcześniej zmiennych i nadania im wartości. 
 
Dziedziczenie i wynikające z tego zależności często sprawiają problemy nawet doświadczonym programistom. Tak zaawansowana wiedza raczej nie będzie nam potrzebna do tworzenia programowalnych elementów playbooków w Ansible. Dlatego, upraszczając sytuację, przyjmijmy model dziedziczenia, w którym klasa potomka może mieć tylko jednego rodzica. Potomek sam może dalej pełnić rolę rodzica dla kolejnej klasy. Tworzy się dość przejrzysta struktura hierarchiczna, w której kolejne „pokolenia” znajdują się coraz niżej w hierarchii. Jednocześnie przejmują wszystkie atrybuty swojego rodzica, także te, które zostały wcześniej odziedziczone. 
 
Strukturę takiego dziedziczenia widać na diagramie (rys. 1). Obiekt klasy Dziecko dziedziczy cechy klasy Rodzic, natomiast obiekt klasy Wnuk dziedziczy cechy klasy Dziecko, włącznie z tymi, które wcześ­niej zostały przez niego odziedziczone od klasy Rodzic. W załączonym przykładzie w każdej z klas modyfikujemy w jej konstruktorze wartość lokalnej kopii zmiennej imie. Wartość zmiennej nazwisko zdefiniowana została jedynie w konstruktorze klasy Rodzic. Jej wartość była kopiowana do kolejnych klas potomnych w hierarchii, dlatego gdy odwołamy się do zmiennej nazwisko będącej elementem klasy Wnuk, będzie ona miała przypisaną wartość, którą pierwotnie ustawiliśmy w klasie Rodzic. Kopiowana jest zawsze wartość zmiennej z obiektu będącego bezpośrednio wyżej w hierarchii. 
 
Na identycznej zasadzie działa dziedziczenie metod przez kolejne klasy niżej w hierarchii. Pamiętajmy, że zdefiniowana w klasie Rodzic metoda wywołana w obiekcie utworzonym z klasy Wnuk będzie miała dostęp jedynie do kopii zmiennych obiektu, z którego została uruchomiona. Programista może dopisać nowe metody do klasy Dziecko, jednak nie będzie można się do nich odwołać z klasy Rodzic, gdyż dziedziczenie działa jedynie w dół hierarchii. W klasie potomnej możemy także nadpisać funkcję odziedziczoną od rodzica – wystarczy, że zdefiniujemy metodę o identycznej nazwie jak w klasie nadrzędnej. Z tego aspektu dziedziczenia korzystamy, tworząc własne pluginy typu Callback.
 
Z dziedziczeniem nierozerwalnie związane są dwa słowa kluczowe, które bardzo często będziemy wykorzystywać w kodzie. Pierwszym z nich jest self. Stosujemy je do jednoznacznego wskazania, że odwołujemy się do zmiennej czy funkcji, która jest zdefiniowana w klasie potomka, czyli w naszym pluginie. Zauważmy, że zawsze pierwszym z parametrów funkcji, którymi nadpisujemy te zaprogramowane w klasie rodzica, jest właśnie self, czyli wskazanie na własny obiekt. 
 
[...]
 
Autor specjalizuje się w rozwiązaniach routing & switching, data center oraz service providers. Pracuje m.in. w międzynarodowej instytucji finansowej, dla której projektuje rozwiązania sieciowe, a także jako niezależny konsultant IT. https://www.fb.me/Piotr.Wojciechowski.CCIE. Posiada certyfikat CCIE.  

Artykuł pochodzi z miesięcznika: IT Professional

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"