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.