Role w Ansible – tworzenie, dziedziczenie, reużywalność

Role w Ansible – tworzenie, dziedziczenie, reużywalność

Role w Ansible stanowią kluczowy mechanizm porządkowania i modularizacji konfiguracji. Pozwalają na logiczne grupowanie zadań, plików konfiguracyjnych, zmiennych i szablonów w strukturę, która może być łatwo wykorzystywana w różnych projektach. W tym artykule omówię koncepcję ról, ich strukturę, zasady dziedziczenia i sposoby ponownego używania. Pokażę też praktyczne przykłady na rolach nginx, mysql oraz users.


1. Czym są role w Ansible

Rola (role) to zorganizowany zestaw plików i zadań, które wykonują określoną funkcję konfiguracyjną. Zamiast tworzyć długie, jednorazowe playbooki, można podzielić konfigurację na mniejsze, samodzielne moduły. Każda rola jest przechowywana w katalogu o standardowej strukturze i może być łatwo ponownie wykorzystana w innych projektach.

Stosowanie ról umożliwia:

  • modularne budowanie konfiguracji,
  • ponowne wykorzystanie kodu w różnych środowiskach,
  • łatwiejsze testowanie i utrzymanie,
  • współdzielenie ról z repozytoriów publicznych (Ansible Galaxy).

2. Struktura roli

Każda rola ma z góry określoną strukturę katalogów i plików. Przykład standardowej struktury roli nginx:

roles/
  nginx/
    defaults/main.yml
    files/
    handlers/main.yml
    meta/main.yml
    tasks/main.yml
    templates/nginx.conf.j2
    vars/main.yml

  • tasks/ – główne zadania wykonywane przez rolę,
  • handlers/ – reakcje na zmiany (np. restart usług),
  • templates/ – szablony plików konfiguracyjnych (Jinja2),
  • files/ – pliki do kopiowania na hosta,
  • defaults/ – domyślne wartości zmiennych,
  • vars/ – zmienne specyficzne dla roli,
  • meta/ – zależności między rolami.

3. Tworzenie roli od podstaw

Rola może być utworzona ręcznie lub przy pomocy narzędzia ansible-galaxy init, które automatycznie generuje odpowiednią strukturę katalogów.

Przykład:
ansible-galaxy init roles/nginx

Po utworzeniu struktury należy zdefiniować główne zadania w pliku tasks/main.yml.

Przykład roli nginx:

– name: Install nginx
  ansible.builtin.package:
    name: nginx
    state: present

– name: Deploy nginx configuration
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    – Restart nginx

Handler:
– name: Restart nginx
  ansible.builtin.service:
    name: nginx
    state: restarted


4. Rola MySQL

Rola mysql może zawierać zadania związane z instalacją serwera baz danych, tworzeniem użytkowników oraz baz danych.

– name: Install MySQL server
  ansible.builtin.package:
    name: mysql-server
    state: present

– name: Ensure MySQL service is running
  ansible.builtin.service:
    name: mysql
    state: started
    enabled: yes

– name: Create application database
  community.mysql.mysql_db:
    name: app_db
    state: present

– name: Create application user
  community.mysql.mysql_user:
    name: app_user
    password: secret123
    priv: 'app_db.*:ALL’
    state: present


5. Rola Users – zarządzanie użytkownikami

Rola users służy do tworzenia i zarządzania kontami systemowymi. Pozwala na automatyczne dodawanie użytkowników, grup oraz kluczy SSH.

– name: Create application users
  ansible.builtin.user:
    name: „{{ item.name }}”
    shell: /bin/bash
    state: present
  loop:
    – { name: „janek” }
    – { name: „kasia” }

– name: Add SSH authorized keys
  ansible.builtin.authorized_key:
    user: „{{ item.name }}”
    key: „{{ lookup(’file’, 'files/{{ item.name }}.pub’) }}”
  loop:
    – { name: „janek” }
    – { name: „kasia” }


6. Dziedziczenie i zależności między rolami

Role mogą być ze sobą powiązane – np. rola webserver może wymagać ról nginx i users. Zależności można określić w pliku meta/main.yml danej roli.

Przykład:
dependencies:
  – role: nginx
  – role: users

Dzięki temu podczas uruchamiania roli webserver automatycznie wykonają się wymagane role.


7. Reużywalność i Ansible Galaxy

Gotowe role można publikować i pobierać z Ansible Galaxy – centralnego repozytorium społeczności. Role z Galaxy instaluje się przy pomocy pliku requirements.yml.

Przykład:
roles:
  – name: geerlingguy.nginx
  – name: community.mysql

collections:
  – name: community.general
  – name: ansible.posix

Instalacja wszystkich ról i kolekcji:
ansible-galaxy install -r requirements.yml


8. Łączenie ról w playbookach

Role są dołączane do playbooka w sekcji roles. Dzięki temu można budować złożone konfiguracje serwerów poprzez zestaw ról.

Przykład playbooka:
– name: Web application stack
  hosts: webservers
  become: yes
  roles:
    – users
    – nginx
    – mysql


9. Dobre praktyki w pracy z rolami

  • stosowanie jednej roli do jednej funkcji systemowej,
  • przechowywanie zmiennych globalnych w group_vars lub defaults,
  • definiowanie zależności między rolami w meta/main.yml,
  • używanie handlerów do restartowania usług po zmianach,
  • testowanie ról za pomocą Molecule lub kontenerów Docker,
  • utrzymywanie ról w repozytorium Git i wersjonowanie ich,
  • stosowanie nazw kolekcji (np. ansible.builtin, community.mysql) dla pełnej kompatybilności.

10. Podsumowanie

Role w Ansible pozwalają budować czyste, modularne i łatwo zarządzalne systemy automatyzacji. Ich właściwe wykorzystanie zwiększa czytelność projektu, umożliwia szybkie wdrożenia i ponowne wykorzystanie konfiguracji. Dzięki roli „nginx” można wdrażać serwery WWW, „mysql” zarządzać bazami danych, a „users” automatycznie tworzyć konta. To właśnie modularność i reużywalność czynią Ansible jednym z najpotężniejszych narzędzi do zarządzania infrastrukturą IT.

Przewijanie do góry