Blog: Systemy serwerowe | Enterprise linux server | Systemy enterprise linux | Enterprise linux server 2

Ansible Content Collection – większa struktura naprzeciw większym wymaganiom

Ansible Content Collection – większa struktura naprzeciw większym wymaganiom
  • 865 views

Udostępnij!FacebookTwitterLinkedInWraz z wersją 2.8, w Ansible pojawiła się pewna nowość – Ansible Content Collection. Jest to nowa struktura danych (dotychczas największa pod względem contentu), która pozwala łączyć w jednej jednostce role, playbooki, pluginy, czy moduły. Collection znajduje się m.in. w największym repozytorium dla Ansible – hubie Galaxy od wersji 3.2. Podobnie jak role, collection przyjmuje […]

Udostępnij!

Wraz z wersją 2.8, w Ansible pojawiła się pewna nowość – Ansible Content Collection.
Jest to nowa struktura danych (dotychczas największa pod względem contentu), która pozwala łączyć w jednej jednostce role, playbooki, pluginy, czy moduły. Collection znajduje się m.in. w największym repozytorium dla Ansible – hubie Galaxy od wersji 3.2.

Podobnie jak role, collection przyjmuje formę elementów hierarchicznie ustrukturyzowanych w katalogach. Przykładowo, stworzenie schematu dla nowego pustego collection wygląda następująco:

[ansible@poznan ~]$ ansible-galaxy collection init altkom.collection
[ansible@poznan ~]$ tree altkom
altkom
└── collection
├── docs
├── galaxy.yml
├── plugins
│  └── README.md
├── README.md
└── roles

Jak sama nazwa wskazuje, folder docs służy do przechowywania dokumentacji o collection; galaxy.yml to plik zawierający niezbędne informacje (metadane) do jego zbudowania. Z kolei w folderze plugins możemy umieścić dodatkowe wykorzystywane pluginy i moduły, folder roles będzie zaś zawierał poszczególne role wchodzące w skład naszego collection. Oprócz roles, czasami będziemy potrzebować plików playbook dołączanych w osobnym folderze playbooks, testów w folderze tests albo skryptów w folderze scripts. Pliki README dołączane są do collection w formacie Markdown.

 

Aby zainstalować collection z Ansible Galaxy, należy posłużyć się schematem:

ansible-galaxy collection install namespace.collection

gdzie namespace  – nazwa organizacji, usera community itp.

collection – nazwa collection, które chcemy zainstalować z określonego namespace

 

Dla przykładu posłużymy się collection php_roles z namespace geerlingguy:

ansible-galaxy collection install 'geerlingguy.php_roles’

 

Podczas instalacji collection, domyślnie instaluje się ostatnia wersja. Możemy jednak również wybrać poprzednie, np.

ansible-galaxy collection install 'geerlingguy.php_roles:==0.9.5'

zainstaluje collection php_roles z namespace geerlingguy w wersji 0.9.5.

 

Innym przykładem identyfikatorów wersji collection może być np.:

!=0.9.6  –  zainstaluj collection byle nie w wersji 0.9.6
<0.9.6   –  zainstaluj collection w wersji niższej od 0.9.6

 

Aktualną stabilną wersją Ansible jest 2.9.9. W wydaniu deweloperskim znajduje się także opcja pobrania collection. Aby to zrobić w celu udostępnienia offline bez dostępu do servera zewnętrznego, możemy posłużyć się poleceniem:

ansible-galaxy collection download geerlingguy.php_roles

 

Jak obrazowo przedstawić specyfikę collection?

W Ansible Galaxy znajduje się kolekcja poszczególnych, związanych z PHP, roles autorstwa Jeffa Geerlinga. Posiada ona namespace geerlingguy:

[ansible@poznan ansible]$ ansible-galaxy search --author geerlingguy php | grep php
geerlingguy.apache-php-fpm Apache 2.4+ PHP-FPM support for Linux.
geerlingguy.php            PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
geerlingguy.php-memcached  PHP Memcached support for Linux
geerlingguy.phpmyadmin     phpMyAdmin installation for Linux
geerlingguy.php-mysql      PHP MySQL support for Linux.
geerlingguy.php-pear       PHP PEAR library installation.
geerlingguy.php-pecl       PHP PECL extension installation.
geerlingguy.php-pgsql      PHP PostgreSQL support for Linux.
geerlingguy.php-redis      PhpRedis support for Linux
geerlingguy.php-tideways   Tideways PHP Profiler Extension for Linux
geerlingguy.php-versions   Allows different PHP versions to be installed.
geerlingguy.php-xdebug     PHP XDebug for Linux
geerlingguy.php-xhprof     PHP XHProf for Linux

Aby użyć jednej z nich, np. php-pgsql w celu komunikacji PHP z bazą danych Postgresql, możemy użyć komendy instalującej role:

[ansible@poznan ~]$ ansible-galaxy role install geerlingguy.php-pgsql

 

Zakładając, że nasza aplikacja będzie korzystać z buforowania pamięci podręcznej, bazy danych Postgresql, biblioteki PEAR, repozytorium rozszerzeń PECL oraz kilku innych technologii – używając struktur roles musielibyśmy zainstalować co najmniej kilka z nich.

W celu utrzymania wszystkich niezbędnych dla developera PHP technologii w jednej strukturze, lepszym pomysłem jest stworzenie struktury wyższego rzędu – collection, takiego jak  przywołane tu collection geerlingguy.php_roles. Jeśli spojrzymy na katalog, w którym zainstalowane zostało collection, zauważymy logiczną i czytelną strukturę:

[ansible@poznan ansible_collections]$ tree -L 3 geerlingguy/

geerlingguy/
└── php_roles
├── FILES.json
├── MANIFEST.json
├── README.md
├── roles
│   ├── php
│   ├── php_memcached
│   ├── php_mysql
│   ├── php_pear
│   ├── php_pecl
│   ├── php_pgsql
│   ├── php_redis
│   ├── php_tideways
│   ├── php_versions
│   ├── php_xdebug
│   └── php_xhprof
├── scripts
│   ├── deploy.yml
│   └── templates
└── tests
└── integration

W drzewie katalogów collection geerlingguy.php_roles dobrze widoczna jest koncepcja jednej większej struktury mieszczącej role związane ze środowiskiem PHP (które poza tym mogą występować samodzielnie). Dodatkowo w collection znalazło się miejsce na skrypt deploy.yml zawierający m.in. zadania, które  mają się wykonać jako pierwsze (pre_tasks), sekcję budowania collection (build) czy też publikację (publish).

Folder templates zawiera wzorce Jinja2. Nie zabrakło również miejsca na kolejny folder, w którym znalazł się playbook związany z testowaniem środowiska.

Po udanej instalacji collection geerlingguy.php_roles jest gotowe do użycia  np. w takim playbooku:

[ansible@poznan ansible]$ cat collection_php_roles.yml
---
- hosts: all

collections:
- geerlingguy.php_roles

roles:
- php
- role: php-versions
vars:
php_version: '7.3'

Źródłem metadanych, dzięki którym dowiadujemy się, czy dane collection spełni nasze oczekiwania jest plik galaxy.yml. Oto lista elementów, które Ansible collection powinien zawierać w galaxy.yml:

  • namespace – nazwa miejsca, gdzie collection jest przechowywane. Może zawierać wyłącznie małe litery i podkreślnik.
  • name – nazwa collection
  • version – bieżąca wersja
  • readme – ścieżka do pliku readme w formacie Markdown
  • authors – informacja o autorach collection
  • license – akceptowalne przez Ansible Galaxy licencje:  https://spdx.org/licenses/
  • tag
  • dependencies – informacja o zależnych collection, które muszą zostać zainstalowane włącznie z bieżącym collection
  • repository – URL do repozytorium
  • description – krótki opis funkcjonalności danego collection.

 

Schemat budowy collection składa się z czterech etapów:

    1. Przygotowania szkieletu konstrukcji

ansible-galaxy collection init namespace.collection_name

    1. Dokonania odpowiednich zmian w kodzie – edycji pliku galaxy.yml, dodania role, playbook, scripts itp.
    2. Zbudowania collection (musi być wykonane z katalogu, w którym znajduje się collecion):

ansible-galaxy collection build

W wyniku tego polecenia tworzony jest plik namespace-collection_name-1.0.0.tar.gz

  1. Publikacji, np. w Ansible Galaxy:

ansible-galaxy collection publish

Stale rosnąca popularność Ansible jako narzędzia do automatyzacji, coraz większa użyteczność tego rozwiązania i jego szerokie zastosowanie, skutkują pojawianiem się kolejnych udogodnień i  pomysłów na całościowe ujęcie spotykanych na co dzień problemów. Pojawienie się collection pozwala ujednolicić i ustrukturyzować szerszy zakres zadań, przed którymi stoi administrator zarządzający automatyzacją instalacji, konfiguracji czy wprowadzeniem jakiejkolwiek zmiany w środowisku, nad którym ma panować.