1 / 50
IaC: Wprowadzenie do automatyzacji konfiguracji

IaC: Wprowadzenie do automatyzacji konfiguracji

  • Prezentacja dotyczy paradygmatu Infrastructure as Code i narzędzia Ansible do automatyzacji konfiguracji systemów
  • Omówione zostaną problemy tradycyjnego zarządzania ręcznego, koncepcja idempotentności i pożądanego stanu
  • Szczegółowo przeanalizujemy architekturę Ansible, strukturę projektu, składnię playbooków YAML i moduły
  • Laboratorium krok po kroku pozwoli na samodzielne napisanie playbooka instalującego Nginx
  • Omówione zostaną techniki debugowania, troubleshooting i dobre praktyki w środowisku produkcyjnym
  • Prezentacja zawiera 50 slajdów z przykładami, listingami kodu i cheat sheetem
ASK_prez10_s01

Infrastructure as Code (IaC) to paradygmat zarządzania infrastrukturą IT, w którym konfiguracja serwerów, sieci i usług jest definiowana w plikach deklaratywnych lub proceduralnych, przechowywanych w systemie kontroli wersji.

Ansible jest jednym z najpopularniejszych narzędzi do automatyzacji konfiguracji, zarządzanym przez Red Hat. Jego główną zaletą jest bezagentowa architektura - do zarządzania węzłami wystarczy dostęp SSH i interpreter Pythona na zdalnej maszynie.

W przeciwieństwie do skryptów bash, Ansible zapewnia idempotentność: wielokrotne uruchomienie playbooka daje ten sam efekt, a przy stanie zgodnym nie wprowadza żadnych zmian.

Warsztat praktyczny obejmuje napisanie playbooka instalującego serwer Nginx z wykorzystaniem modułów apt, copy, service oraz handlera do restartu usługi.

2 / 50
Cel warsztatu - automatyzacja konfiguracji

Cel warsztatu - automatyzacja konfiguracji

  • Zrozumienie paradygmatu IaC i jego przewagi nad tradycyjnym zarządzaniem ręcznym
  • Poznanie architektury Ansible - bezagentowej, wykorzystującej SSH i moduły w Pythonie
  • Umiejętność tworzenia struktury projektu Ansible: inventory, ansible.cfg, playbooki
  • Praktyczne pisanie playbooków YAML z wykorzystaniem zmiennych, faktów i handlerów
  • Samodzielne wykonanie laboratorium: instalacja i konfiguracja Nginx przez Ansible
  • Diagnostyka i troubleshooting typowych problemów z Ansible
ASK_prez10_s02

Celem warsztatu jest przygotowanie administratora do wdrożenia automatyzacji konfiguracji w środowisku produkcyjnym. Uczestnik po zakończeniu zajęć powinien samodzielnie tworzyć playbooki Ansible i zarządzać nimi w systemie kontroli wersji.

Szczególny nacisk położony jest na zrozumienie idempotentności - kluczowej koncepcji odróżniającej Ansible od zwykłych skryptów. Uczestnik nauczy się, jak pisać playbooki, które można bezpiecznie uruchamiać wielokrotnie.

Wiedza zdobyta podczas warsztatu ma charakter uniwersalny - Ansible jest używany zarówno w małych środowiskach developerskich, jak i w dużych centrach danych zarządzających tysiącami serwerów.

Umiejętność debugowania playbooków i rozwiązywania problemów z łącznością SSH to kompetencje niezbędne w codziennej pracy z Ansible.

3 / 50
Agenda - plan dziesiątej prezentacji

Agenda - plan dziesiątej prezentacji

  • Część I (10 min): Wprowadzenie do IaC - paradygmat, problem snowflake servers, ewolucja podejść
  • Część II (10 min): Narzędzia automatyzacji - Ansible, Puppet, Chef, Terraform, architektura Ansible
  • Część III (10 min): Struktura projektu Ansible - inventory, ansible.cfg, moduły
  • Część IV (10 min): Playbooki YAML - składnia, zmienne, fakty, templaty, warunki, pętle, handlery
  • Część V (30 min): Laboratorium - instalacja Nginx playbookiem, dry-run, weryfikacja idempotentności
  • Część VI (10 min): Troubleshooting, debugowanie, Cheat sheet, podsumowanie
ASK_prez10_s03

Prezentacja została podzielona na sześć bloków tematycznych zgodnie z zasadą 20 minut teorii i 30 minut praktyki.

Część pierwsza wprowadza w paradygmat IaC, wyjaśniając, dlaczego tradycyjne zarządzanie ręczne jest niebezpieczne i jakie korzyści daje automatyzacja.

W części drugiej omówimy różne narzędzia automatyzacji, a następnie skupimy się na architekturze Ansible - bezagentowej, pushowej, wykorzystującej SSH i moduły Pythona.

Część trzecia i czwarta to przygotowanie do laboratorium: omówienie struktury projektu Ansible, składni YAML, zmiennych, faktów, templatów, warunków, pętli i handlerów.

Najważniejszą częścią jest laboratorium, w którym uczestnicy samodzielnie napiszą playbook instalujący Nginx i zweryfikują jego działanie.

4 / 50
Tradycyjne zarządzanie serwerami - problemy

Tradycyjne zarządzanie serwerami - problemy

  • Konfiguracja ręczna przez SSH - każdy administrator loguje się i wykonuje komendy ad-hoc
  • Brak powtarzalności - nikt nie pamięta dokładnie, jakie komendy zostały wykonane na którym serwerze
  • Zmiany ad-hoc w konsoli - "ktoś coś skonfigurował" i nikt nie wie co, kiedy i dlaczego
  • Problem snowflake servers - każdy serwer jest unikalny, nie ma dwóch identycznych
  • Trudność w odtwarzaniu konfiguracji - odtworzenie serwera od zera trwa godzinami lub dniami
  • Błędy ludzkie - pomylenie serwerów, literówki w komendach, niepoprawne uprawnienia
ASK_prez10_s04

W tradycyjnym modelu zarządzania każdy administrator loguje się na serwer przez SSH i wykonuje komendy ręcznie. Nawet przy użyciu notatek i dokumentacji, proces ten jest podatny na błędy i niepowtarzalny.

Problem snowflake servers (serwery-płatki śniegu) polega na tym, że każdy serwer w infrastrukturze staje się unikalny z powodu nagromadzenia ręcznych zmian, różnych wersji pakietów i indywidualnych konfiguracji.

Odtworzenie serwera po awarii w modelu ręcznym wymaga od administratora przypomnienia sobie wszystkich zmian, które zostały naniesione od momentu instalacji. W praktyce oznacza to wiele godzin pracy i ryzyko pominięcia krytycznych konfiguracji.

Błędy ludzkie są nieuniknione przy ręcznym zarządzaniu. Pomylenie serwerów produkcyjnych z testowymi, literówki w konfiguracji firewalla czy niepoprawne uprawnienia do plików to tylko niektóre z typowych problemów.

5 / 50
Snowflake servers - dlaczego to zagrożenie

Snowflake servers - dlaczego to zagrożenie

  • Każdy serwer z czasem staje się unikalny - inna wersja pakietów, inne poprawki, inne konfiguracje
  • Trudność w skalowaniu - nie można automatycznie dodać nowego serwera, bo każdy jest inny
  • Audyt bezpieczeństwa staje się niemożliwy - nie wiadomo, które serwery mają jakie luki
  • Aktualizacje bezpieczeństwa wymagają ręcznego sprawdzenia każdego serwera z osobna
  • Rotacja personelu powoduje utratę wiedzy o konfiguracji
  • Przejście do modelu IaC eliminuje problem snowflake servers poprzez definicję deklaratywną
ASK_prez10_s05

Problem snowflake servers narasta z czasem. Każda ręczna zmiana, każda aktualizacja, każda poprawka wprowadza różnicę między serwerami. Po kilku miesiącach serwery, które startowały identycznie, mogą się znacząco różnić.

W praktyce oznacza to, że dodanie nowego serwera do klastra wymaga ręcznego odtworzenia wszystkich zmian, które zostały naniesione na istniejące serwery. Jest to proces czasochłonny i podatny na błędy.

Z perspektywy bezpieczeństwa, snowflake servers są koszmarem. Administrator nie wie, które serwery mają zainstalowane wszystkie łatki bezpieczeństwa, a które mają przestarzałe wersje pakietów.

IaC rozwiązuje ten problem poprzez przechowywanie definicji konfiguracji w plikach, które są wspólne dla wszystkich serwerów. Każdy nowy serwer jest konfigurowany automatycznie na podstawie tych samych definicji.

6 / 50
Ewolucja podejść: od ręcznej do deklaratywnej

Ewolucja podejść: od ręcznej do deklaratywnej

  • Faza 1: Konfiguracja ręczna - administrator loguje się przez SSH i konfiguruje serwer
  • Faza 2: Skrypty bash - automatyzacja przez skrypty, ale brak idempotentności i kontrola wersji
  • Faza 3: Podejście deklaratywne - opisujemy pożądany stan, narzędzie dba o jego osiągnięcie
  • Faza 4: IaC w pełni - konfiguracja w Git, automatyczne stosowanie, CI/CD, testowanie
  • Skrypty bash są ad-hoc, nieidempotentne - uruchomienie dwa razy może dać różne efekty
  • IaC zapewnia idempotentność - wielokrotne uruchomienie daje ten sam rezultat
ASK_prez10_s06

Ewolucja zarządzania konfiguracją przeszła przez cztery wyraźne fazy. Faza 1 to czysto ręczna konfiguracja, która jest całkowicie niepowtarzalna i uzależniona od wiedzy administratora.

Faza 2 to skrypty bash. Są one lepsze niż ręczna konfiguracja, ale mają poważne wady: nie są idempotentne, trudno je testować i nie dają informacji zwrotnej o zgodności stanu.

Faza 3 to podejście deklaratywne, reprezentowane przez narzędzia takie jak Ansible. Administrator nie pisze "jak" coś zrobić, ale "co" ma być zrobione.

Faza 4 to pełne wdrożenie IaC z wykorzystaniem kontroli wersji, automatycznego stosowania konfiguracji przez CI/CD oraz testowania zmian w środowisku staging przed wdrożeniem na produkcję.

7 / 50
Idempotentność - kluczowa koncepcja IaC

Idempotentność - kluczowa koncepcja IaC

  • Idempotentność: wielokrotne wykonanie tej samej operacji daje ten sam efekt końcowy
  • Przykład nieidempotentny: mkdir /tmp/test - drugie wykonanie zwróci błąd (katalog istnieje)
  • Przykład nieidempotentny: echo "text" >> plik - drugie wykonanie doda drugą linię
  • Ansible sprawdza aktualny stan przed wykonaniem - jeśli stan jest zgodny, nic nie robi
  • Wynik: changed=0 przy stanie zgodnym, changed=1 przy zmianie
  • Dzięki idempotentności można bezpiecznie uruchamiać playbooki wielokrotnie
ASK_prez10_s07

Idempotentność to właściwość operacji, która polega na tym, że wielokrotne jej wykonanie daje ten sam rezultat co wykonanie jednokrotne. W kontekście IaC oznacza to, że playbook można uruchomić wielokrotnie bez ryzyka wprowadzenia niepożądanych zmian.

Rozważmy typowy skrypt bash: apt install nginx. Przy pierwszym uruchomieniu pakiet zostanie zainstalowany. Przy drugim uruchomieniu apt sprawdzi, że pakiet jest już zainstalowany, ale skrypt i tak wykona operację i zgłosi sukces. Ansible natomiast sprawdzi, czy nginx jest zainstalowany, i jeśli tak, pominie zadanie.

Moduł copy w Ansible jest dobrym przykładem idempotentności. Sprawdza on sumę kontrolną (MD5/SHA1) pliku źródłowego i docelowego. Jeśli plik docelowy ma tę samą sumę kontrolną, Ansible nie kopiuje pliku ponownie.

Dzięki idempotentności administrator może bezpiecznie uruchamiać playbooki w pętli cron lub w ramach CI/CD, wiedząc, że nie spowoduje to nieoczekiwanych zmian w systemie.

8 / 50
Pożądany stan (Desired State) - jak to działa

Pożądany stan (Desired State) - jak to działa

  • Playbook definiuje pożądany stan systemu - jaki pakiet ma być zainstalowany, jaki plik ma mieć zawartość
  • Ansible porównuje aktualny stan systemu z pożądanym stanem zdefiniowanym w playbooku
  • Jeśli stan jest zgodny - zadanie jest pomijane (ok status)
  • Jeśli stan jest niezgodny - Ansible wykonuje akcję, aby doprowadzić system do stanu pożądanego
  • Wynik wykonania: ok (stan zgodny), changed (wykonano zmianę), failed (błąd)
  • Podejście deklaratywne kontra imperatywne - mówimy "co" ma być, a nie "jak" to zrobić
ASK_prez10_s08

Model pożądanego stanu (desired state) jest fundamentalny dla zrozumienia IaC. Administrator opisuje w pliku YAML, jaki ma być końcowy stan systemu, a narzędzie samo decyduje, jakie operacje wykonać, aby ten stan osiągnąć.

Na przykład zamiast pisać skrypt: "apt update, apt install nginx -y, systemctl start nginx, systemctl enable nginx", w Ansible piszemy: "stan: nginx zainstalowany, uruchomiony i włączony przy starcie".

Porównanie do SQL jest pouczające: podejście imperatywne to SELECT * FROM users WHERE name = 'ala', a podejście deklaratywne to CREATE TABLE users (name VARCHAR, email VARCHAR) - definiujemy strukturę, a nie sposób jej uzyskania.

W praktyce podejście deklaratywne znacznie upraszcza zarządzanie konfiguracją, ponieważ administrator nie musi myśleć o kolejności operacji ani o przypadku brzegowym, gdy konfiguracja jest już zgodna.

9 / 50
Kontrola wersji konfiguracji - Git jako podstawa

Kontrola wersji konfiguracji - Git jako podstawa

  • Playbooki Ansible to pliki tekstowe - idealnie nadają się do przechowywania w Git
  • Każda zmiana konfiguracji jest śledzona: kto, kiedy i co zmienił
  • Możliwość cofnięcia zmian - git revert przywraca poprzednią wersję konfiguracji
  • Code review - zmiany są sprawdzane przez innych administratorów przed wdrożeniem
  • Gałęzie (branches) - staging przed produkcją, testowanie zmian w izolacji
  • Integracja z CI/CD - automatyczne uruchamianie playbooków po merge do main/master
ASK_prez10_s09

Przechowywanie konfiguracji w systemie kontroli wersji to jedna z najważniejszych zalet IaC. Git pozwala na śledzenie każdej zmiany, co w praktyce oznacza pełną historię konfiguracji każdego serwera w infrastrukturze.

W tradycyjnym modelu, gdy coś przestaje działać, administrator nie wie, co się zmieniło. W modelu IaC wystarczy sprawdzić git log, aby zobaczyć, jakie zmiany zostały wprowadzone i przez kogo.

Code review to kolejna kluczowa zaleta. Zmiany w konfiguracji są zatwierdzane przez pull requesty, gdzie inni administratorzy mogą je przejrzeć i skomentować.

Gałęzie w Git umożliwiają testowanie zmian w środowisku staging zanim trafią na produkcję. Pozytywny wynik testów automatycznych w stagingu jest warunkiem wdrożenia na produkcję.

10 / 50
Korzyści z IaC - podsumowanie

Korzyści z IaC - podsumowanie

  • Powtarzalność: każdy serwer konfigurowany identycznie, bez względu na to, kto uruchamia playbook
  • Szybkość: konfiguracja setek serwerów w minutach zamiast dni
  • Audytowalność: każda zmiana jest śledzona i możliwa do prześledzenia w historii Gita
  • Odtwarzalność: odtworzenie serwera po awarii to jedno polecenie zamiast godzin pracy
  • Testowalność: możliwość testowania konfiguracji w środowisku staging przed wdrożeniem
  • Redukcja błędów: automatyzacja eliminuje błędy ludzkie związane z ręczną konfiguracją
ASK_prez10_s10

Powtarzalność to największa zaleta IaC. Niezależnie od tego, który administrator uruchamia playbook, rezultat jest identyczny. Nie ma już sytuacji, w której różni administratorzy konfigurują serwery w różny sposób.

Szybkość wdrożenia nowych serwerów jest dramatycznie większa. W tradycyjnym modelu konfiguracja nowego serwera mogła zająć cały dzień. Z IaC i Ansible to kwestia kilku minut na uruchomienie playbooka.

Audytowalność jest kluczowa z perspektywy zgodności z regulacjami (PCI DSS, HIPAA, SOX). W modelu IaC każda zmiana konfiguracji ma wpis w historii Gita z informacją o autorze, dacie i zakresie zmian.

Odtwarzalność po awarii to jedna z najważniejszych zalet w środowisku produkcyjnym. Gdy serwer ulegnie awarii, administrator uruchamia nową maszynę, wykonuje ansible-playbook i po kilku minutach serwer jest w pełni skonfigurowany.

11 / 50
Scenariusz: odtworzenie serwera po awarii

Scenariusz: odtworzenie serwera po awarii

  • Tradycyjnie: administrator musi przypomnieć sobie wszystkie zmiany, odtworzyć konfigurację z notatek - ryzyko błędu, wiele godzin pracy
  • Z IaC: administrator uruchamia nową maszynę wirtualną, klonuje repozytorium Git, uruchamia ansible-playbook
  • Po kilku minutach serwer jest w pełni skonfigurowany zgodnie z definicją w playbooku
  • Nie ma ryzyka pominięcia jakiejś konfiguracji - playbook definiuje wszystko
  • Git log pokazuje dokładnie, jaka wersja konfiguracji była na serwerze przed awarią
  • ansible-playbook -i hosts.ini site.yml - tyle wystarczy do odtworzenia serwera
ASK_prez10_s11

Scenariusz odtworzenia serwera po awarii doskonale ilustruje różnicę między tradycyjnym zarządzaniem a IaC. W pierwszym przypadku administrator musi polegać na swojej pamięci i notatkach, które często są niekompletne.

W praktyce odtworzenie serwera w tradycyjnym modelu oznacza: instalację systemu operacyjnego, instalację niezbędnych pakietów, przywrócenie konfiguracji z kopii zapasowej (jeśli istnieje), ręczne dostrojenie parametrów i weryfikację.

W modelu IaC proces jest znacznie prostszy: nowa maszyna otrzymuje adres IP, administrator aktualizuje inventory, uruchamia ansible-playbook i po kilku minutach serwer jest gotowy do pracy.

Dodatkowo, ponieważ playbook jest przechowywany w Git, administrator może wybrać konkretną wersję konfiguracji (commit, tag), która była na serwerze przed awarią.

12 / 50
Podsumowanie wprowadzenia do IaC

Podsumowanie wprowadzenia do IaC

  • IaC to paradygmat zarządzania infrastrukturą poprzez pliki konfiguracyjne w kontroli wersji
  • Eliminuje problem snowflake servers i błędów ludzkich
  • Zapewnia idempotentność - wielokrotne uruchomienie daje ten sam efekt
  • Podejście deklaratywne: definiujemy pożądany stan, narzędzie dba o jego osiągnięcie
  • Ansible jest jednym z najpopularniejszych narzędzi do IaC - bezagentowy, prosty w użyciu
  • Przechodzimy do omówienia konkretnych narzędzi automatyzacji
ASK_prez10_s12

Wprowadzenie do IaC stanowi fundament dalszej części prezentacji. Zrozumienie koncepcji idempotentności, pożądanego stanu i deklaratywnego podejścia jest niezbędne do efektywnej pracy z Ansible.

W kolejnych slajdach omówimy konkretne narzędzia automatyzacji, ze szczególnym uwzględnieniem Ansible. Przedstawimy architekturę, strukturę projektu i praktyczne przykłady użycia.

Warto pamiętać, że IaC to nie tylko narzędzia, ale przede wszystkim zmiana sposobu myślenia o zarządzaniu infrastrukturą.

Przejście na IaC wymaga inwestycji czasu w naukę narzędzi i zmianę procesów, ale zwraca się wielokrotnie w postaci szybszego wdrażania, mniejszej liczby błędów i lepszej kontroli nad infrastrukturą.

13 / 50
Przegląd narzędzi automatyzacji konfiguracji

Przegląd narzędzi automatyzacji konfiguracji

  • Ansible (Red Hat) - bezagentowy, push, YAML, SSH, najprostszy w użyciu
  • Puppet - agentowy, pull, własny DSL (Puppet Language), dojrzały ekosystem
  • Chef - agentowy, pull, Ruby DSL, popularny w środowiskach Ruby on Rails
  • SaltStack (Salt) - agentowy i bezagentowy, push i pull, YAML + Jinja2, szybki dzięki ZeroMQ
  • Każde narzędzie ma swoje zalety i wady, ale Ansible wygrywa prostotą i niskim progiem wejścia
  • Wybór narzędzia zależy od wielkości środowiska, kompetencji zespołu i wymagań
ASK_prez10_s13

Ansible został przejęty przez Red Hat w 2015 roku i od tego czasu dynamicznie się rozwija. Jego główną zaletą jest bezagentowa architektura - nie wymaga instalowania żadnego oprogramowania na zarządzanych węzłach, wystarczy SSH i Python.

Puppet, stworzony przez Puppet Labs w 2005 roku, był pierwszym popularnym narzędziem do zarządzania konfiguracją. Używa własnego języka deklaratywnego (Puppet Language) i działa w modelu pull.

Chef, napisany w Ruby, jest popularny w środowiskach developerskich. Używa Ruby DSL, co daje dużą elastyczność, ale wymaga znajomości tego języka.

SaltStack (obecnie VMware Salt) oferuje zarówno model push, jak i pull. Używa magistrali komunikacyjnej ZeroMQ, co zapewnia bardzo wysoką wydajność przy zarządzaniu tysiącami węzłów.

14 / 50
Provisioning vs configuration management

Provisioning vs configuration management

  • Provisioning: przygotowywanie infrastruktury - tworzenie VM, sieci, storage, load balancerów
  • Narzędzia provisioning: Terraform (HashiCorp), AWS CloudFormation, OpenStack Heat
  • Configuration Management: zarządzanie stanem systemów - instalacja pakietów, konfiguracja usług
  • Narzędzia CM: Ansible, Puppet, Chef, SaltStack
  • Ansible może być używany do obu zadań, ale specjalizuje się w configuration management
  • Popularne połączenie: Terraform do provisioning + Ansible do konfiguracji
ASK_prez10_s14

Różnica między provisioning a configuration management jest często mylona przez początkujących administratorów. Provisioning dotyczy tworzenia i zarządzania samą infrastrukturą: maszynami wirtualnymi, sieciami, dyskami, load balancerami.

Terraform jest obecnie standardem w provisioning'u. Używa deklaratywnego języka HCL (HashiCorp Configuration Language) i może zarządzać infrastrukturą w wielu chmurach jednocześnie.

Configuration management zajmuje się tym, co dzieje się wewnątrz maszyn po ich utworzeniu: instalacja pakietów, konfiguracja usług, tworzenie użytkowników, zarządzanie plikami konfiguracyjnymi.

W praktyce oba narzędzia często współpracują: Terraform tworzy maszyny wirtualne w chmurze, a następnie przekazuje ich adresy IP do Ansible, który konfiguruje je zgodnie z wymaganiami.

15 / 50
Architektura Ansible - bezagentowa i prosta

Architektura Ansible - bezagentowa i prosta

  • Ansible jest bezagentowy (agentless) - nie wymaga instalacji oprogramowania na zarządzanych węzłach
  • Komunikacja przez SSH - kontroler łączy się z węzłami przez SSH (domyślnie na porcie 22)
  • Moduły Ansible są wykonywane zdalnie w Pythonie - węzeł musi mieć zainstalowany Python 3.9+
  • Wyniki są zwracane w formacie JSON - maszynowo czytelne, łatwe do przetwarzania
  • Model push - kontroler wypycha konfigurację do węzłów (nie ma agenta pullującego)
  • Jeden kontroler może zarządzać setkami, a nawet tysiącami węzłów jednocześnie
ASK_prez10_s15

Architektura bezagentowa jest główną zaletą Ansible w porównaniu do Puppet czy Chef. Brak agenta oznacza brak potrzeby zarządzania certyfikatami, brak problemów z aktualizacją agenta i brak dodatkowego obciążenia na zarządzanych węzłach.

Gdy administrator uruchamia playbook, Ansible nawiązuje połączenie SSH z każdym węzłem, kopiuje moduły (skrypty Pythona) do węzła, wykonuje je zdalnie i zbiera wyniki. Po zakończeniu wszystkie pliki tymczasowe są usuwane.

Moduły Ansible są pisane w Pythonie i wykonywane na zdalnym węźle. Każdy moduł to osobny skrypt, który wykonuje konkretne zadanie: instaluje pakiet, kopiuje plik, restartuje usługę.

Model push oznacza, że to kontroler inicjuje komunikację. Administrator uruchamia ansible-playbook, który łączy się z węzłami i wypycha konfigurację.

16 / 50
SSH w Ansible - klucz do komunikacji

SSH w Ansible - klucz do komunikacji

  • Ansible używa domyślnie uwierzytelniania przez klucz SSH (key-based authentication)
  • Zalecane: klucz SSH bez hasła (passphrase) dla automatyzacji, zabezpieczony przez ograniczenia w authorized_keys
  • Możliwe uwierzytelnianie hasłem z --ask-pass - tylko w środowiskach testowych
  • Ansible domyślnie używa SSH ControlMaster i ControlPersist do utrzymywania trwałych połączeń SSH dla lepszej wydajności
  • Opcje SSH w ansible.cfg: ssh_args, control_path, pipelining
  • Pipelining (ansible.cfg: pipelining = True) znacząco przyspiesza działanie - redukuje liczbę połączeń SSH
ASK_prez10_s16

Uwierzytelnianie przez klucz SSH jest standardem w Ansible. Klucz publiczny jest dodawany do pliku ~/.ssh/authorized_keys na zarządzanych węzłach, a klucz prywatny znajduje się na kontrolerze.

W środowiskach produkcyjnych klucz SSH powinien być zabezpieczony frazą (passphrase) i zarządzany przez ssh-agent. Można też używać SSH certificates (ssh-keygen -s CA) dla większych środowisk.

ControlMaster i ControlPersist to funkcje OpenSSH używane przez Ansible do utrzymywania otwartego połączenia SSH między zadaniami w playbooku. Bez nich każde zadanie wymagałoby nowego połączenia SSH, co znacząco spowalnia wykonanie.

Pipelining to optymalizacja, która wysyła moduły przez stdin SSH zamiast przez osobne połączenie SFTP. Wymaga wyłączenia opcji requiretty w sudoers na węzłach zarządzanych.

17 / 50
Instalacja Ansible na kontrolerze

Instalacja Ansible na kontrolerze

  • Ansible działa na systemach Linux (preferowany) i macOS (ograniczone wsparcie)
  • Instalacja na Ubuntu/Debian: apt install ansible (starsze wersje) lub z pip
  • Instalacja z pip (zalecana dla najnowszej wersji): pip install ansible
  • Weryfikacja instalacji: ansible --version pokazuje wersję i ścieżki konfiguracji
  • Ansible na Windows (kontroler) - nie jest oficjalnie wspierany, zaleca się WSL lub maszynę wirtualną
  • Zalecana wersja: Ansible 13.x (ansible-core 2.20+) dla najnowszych funkcji i poprawek bezpieczeństwa
ASK_prez10_s17

Ansible wymaga Pythona na kontrolerze (kontroler to maszyna, z której uruchamiamy playbooki). Najnowsze wersje Ansible wymagają Pythona 3.12 lub nowszego.

Instalacja z pip (pip install ansible) jest zalecana, ponieważ zapewnia najnowszą wersję. Można użyć środowiska wirtualnego (venv), aby uniknąć konfliktów z pakietami systemowymi.

W systemach RHEL/CentOS/Fedora, Ansible jest dostępny z repozytoriów EPEL lub jako pakiet ansible-core z modułami społeczności.

Należy pamiętać, że Ansible wymaga Pythona tylko na kontrolerze. Na zarządzanych węzłach wystarczy Python (bez Ansible) i dostęp SSH.

18 / 50
Wymagania dla zarządzanych węzłów

Wymagania dla zarządzanych węzłów

  • Zainstalowany Python 3.9+ - moduły Ansible są wykonywane przez interpreter Pythona
  • Dostęp SSH z kontrolera do węzła - klucz publiczny dodany do authorized_keys
  • Użytkownik SSH z uprawnieniami sudo (dla zadań wymagających uprawnień root)
  • Sprawdzenie Pythona na węźle: ansible all -m raw -a "python3 --version"
  • Dla Windows: PowerShell 3.0+ i WinRM skonfigurowany (zamiast SSH)
  • Domyślny interpreter Pythona: ansible_python_interpreter=/usr/bin/python3
ASK_prez10_s18

Zarządzane węzły nie wymagają instalacji Ansible ani żadnego agenta. Jedynym wymaganiem jest Python w wersji 3.9+ oraz dostęp SSH z kontrolera.

Moduły Ansible są kopiowane na węzeł przez SFTP lub SSH (z pipelining) i wykonywane przez lokalny interpreter Pythona. Po wykonaniu modułu wyniki są zwracane w formacie JSON, a pliki tymczasowe są usuwane.

Dla środowisk, gdzie Python nie jest domyślnie zainstalowany (np. minimalistyczne kontenery Docker), Ansible oferuje moduł raw, który wykonuje komendy bezpośrednio przez SSH bez potrzeby Pythona.

W przypadku systemów Windows, Ansible używa WinRM (Windows Remote Management) zamiast SSH. Wymaga to konfiguracji WinRM na węźle Windows i użycia ansible_connection=winrm w inventory.

19 / 50
Moduły Ansible - podstawowe narzędzia pracy

Moduły Ansible - podstawowe narzędzia pracy

  • ping - test połączenia z węzłem (zwraca pong przy sukcesie)
  • apt/yum/dnf - zarządzanie pakietami w dystrybucjach Debiana/RHEL
  • copy/template - zarządzanie plikami (kopiowanie lub generowanie z szablonów Jinja2)
  • service/systemd - zarządzanie usługami (start, stop, restart, enable, disable)
  • user - zarządzanie użytkownikami (tworzenie, usuwanie, modyfikacja)
  • file - zarządzanie uprawnieniami i własnością plików/katalogów
ASK_prez10_s19

Moduły Ansible to podstawowe jednostki pracy w playbooku. Każdy moduł wykonuje konkretne zadanie i zwraca wynik w formacie JSON z informacją o zmianie (changed, ok, failed).

Moduł ping jest najprostszym modułem - testuje, czy Ansible może połączyć się z węzłem przez SSH i wykonać moduł Pythona. Zwraca pong przy sukcesie.

Moduły do zarządzania pakietami (apt, yum, dnf) są idempotentne - sprawdzają, czy pakiet jest już zainstalowany, i instalują go tylko wtedy, gdy jest nieobecny.

Moduł copy kopiuje plik z kontrolera na węzeł i sprawdza sumę kontrolną, aby uniknąć niepotrzebnych kopii. Moduł template działa podobnie, ale używa szablonów Jinja2 z dynamicznymi wartościami.

20 / 50
Komendy ad-hoc w Ansible

Komendy ad-hoc w Ansible

  • Komendy ad-hoc - szybkie zadania bez playbooka, bezpośrednio z linii poleceń
  • ansible all -m ping -i hosts.ini - test połączenia ze wszystkimi hostami
  • ansible web -m apt -a "name=nginx state=present" -b - instalacja pakietu
  • ansible db -m service -a "name=postgresql state=started" -b - uruchomienie usługi
  • ansible all -m command -a "uptime" - wykonanie dowolnej komendy
  • Ad-hoc przydatne do szybkiej diagnostyki i jednorazowych zadań
ASK_prez10_s20

Komendy ad-hoc są przydatne do szybkich, jednorazowych zadań, gdy nie chcemy tworzyć pełnego playbooka. Składnia to: ansible -m -a "" -i .

Flaga -b (--become) oznacza eskalację uprawnień (domyślnie sudo). Jest niezbędna do zadań wymagających uprawnień administratora, takich jak instalacja pakietów czy restartowanie usług.

Wzorzec hostów (all, web, db) określa, do których hostów z inventory ma być zastosowane polecenie.

Komendy ad-hoc są idealne do: sprawdzenia, które hosty są dostępne (ansible all -m ping), szybkiej aktualizacji pakietów lub sprawdzenia wersji systemu.

21 / 50
Struktura projektu Ansible - katalogi i pliki

Struktura projektu Ansible - katalogi i pliki

  • inventory/ - pliki inventory definiujące zarządzane hosty i grupy
  • ansible.cfg - konfiguracja Ansible (SSH, połączenia, domyślne ustawienia)
  • playbooki/ - pliki YAML z definicją zadań do wykonania
  • roles/ - struktura katalogów do organizacji kodu (opcjonalnie, dla zaawansowanych)
  • group_vars/ i host_vars/ - zmienne dla grup i pojedynczych hostów
  • templates/ - szablony Jinja2 do generowania plików konfiguracyjnych
ASK_prez10_s21

Struktura projektu Ansible nie jest sztywno narzucona, ale istnieją przyjęte konwencje. Dla małych projektów wystarczy jeden lub dwa pliki, dla większych zaleca się organizację według standardów.

Plik ansible.cfg definiuje globalne ustawienia Ansible: domyślne inventory, użytkownika SSH, ścieżkę do klucza, opcje połączenia SSH (pipelining, ControlMaster), timeouty i poziomy logowania.

Katalog group_vars zawiera pliki YAML nazwane według grup z inventory. Zmienne zdefiniowane w tych plikach są dostępne dla wszystkich hostów w danej grupie.

Role to zaawansowana struktura organizacji kodu w Ansible. Każda rola może zawierać zadania, handlery, zmienne, pliki, szablony i metadane.

22 / 50
Inventory - definiowanie zarządzanych węzłów

Inventory - definiowanie zarządzanych węzłów

  • Inventory to plik (INI lub YAML) zawierający listę zarządzanych hostów i ich grupy
  • Format INI (hosts.ini): grupy w nawiasach kwadratowych, hosty poniżej
  • Format YAML (hosts.yml): słownik z grupami jako kluczami i listami hostów
  • Przykład INI: [web] web1 ansible_host=10.0.0.1 web2 ansible_host=10.0.0.2
  • Zmienne specyficzne dla hosta: ansible_user=admin ansible_port=2222
  • Grupowanie umożliwia targetowanie zadań do konkretnych grup hostów
ASK_prez10_s22

Inventory jest sercem projektu Ansible - definiuje, które maszyny są zarządzane i jak się z nimi łączyć. Domyślnie Ansible szuka pliku /etc/ansible/hosts, ale lepiej używać własnego pliku inventory w projekcie.

W formacie INI każda sekcja w nawiasach kwadratowych to grupa. Hosty mogą być wymienione z adresem IP lub nazwą DNS, a zmienne specyficzne dla hosta są dodawane po spacji.

Przykład: [web] web1 ansible_host=192.168.1.10 ansible_user=admin lub [web] 192.168.1.10.

Można również używać zakresów: [web] web[1:5].example.com rozwinie się do web1.example.com do web5.example.com.

23 / 50
Przykład pliku inventory (hosts.ini)

Przykład pliku inventory (hosts.ini)

  • Przykład: sekcje [web], [db], [loadbalancer] z aliasami i adresami IP
  • web01 ansible_host=10.0.0.10 ansible_user=admin
  • db01 ansible_host=10.0.0.20 ansible_user=admin
  • Sekcja [all:vars] - zmienne wspólne dla wszystkich hostów
  • ansible_ssh_private_key_file, ansible_python_interpreter
  • Weryfikacja: ansible-inventory --list -i hosts.ini
ASK_prez10_s23

Plik hosts.ini pokazuje typową strukturę inventory w małym środowisku. Hosty są podzielone na grupy według pełnionej roli: web (serwery aplikacji), db (bazy danych), loadbalancer.

Aliasy hostów (web01, web02) są wygodniejsze w użyciu niż adresy IP, szczególnie gdy adresy IP mogą się zmieniać. W playbookach odwołujemy się do aliasów, a nie do adresów IP.

Sekcja [all:vars] definiuje zmienne wspólne dla wszystkich hostów. W tym przypadku są to ścieżka do klucza SSH i interpreter Pythona.

Weryfikacja inventory za pomocą ansible-inventory --list pokazuje rozszerzone inventory z wszystkimi zmiennymi i grupami.

24 / 50
Plik ansible.cfg - konfiguracja globalna

Plik ansible.cfg - konfiguracja globalna

  • inventory = hosts.ini - domyślny plik inventory
  • remote_user = admin - domyślny użytkownik SSH
  • host_key_checking = False - pomija weryfikację klucza SSH (używać ostrożnie!)
  • pipelining = True - znacząco przyspiesza działanie Ansible
  • gathering = smart - zbiera fakty tylko przy pierwszym uruchomieniu
  • Sprawdzenie konfiguracji: ansible-config list
ASK_prez10_s24

Plik ansible.cfg może znajdować się w kilku lokalizacjach. Kolejność pierwszeństwa: ANSIBLE_CONFIG (zmienna środowiskowa), ./ansible.cfg (bieżący katalog), ~/.ansible.cfg, /etc/ansible/ansible.cfg.

Opcja host_key_checking = False wyłącza sprawdzanie klucza SSH hosta w known_hosts. Jest to wygodne w środowiskach testowych, ale w produkcji powinno być włączone dla bezpieczeństwa.

Pipelining to jedna z najważniejszych optymalizacji. Bez niej Ansible wysyła moduły przez SFTP (osobne połączenie SSH), a z pipelining moduły są wysyłane przez stdin SSH.

Opcja gathering = smart w połączeniu z fact_caching_timeout pozwala uniknąć niepotrzebnego zbierania faktów przy każdym uruchomieniu playbooka.

25 / 50
Playbook - podstawowa jednostka automatyzacji

Playbook - podstawowa jednostka automatyzacji

  • Playbook to plik YAML zawierający listę play (sztuk)
  • Każdy play targetuje grupę hostów (hosts:) i definiuje zadania (tasks:)
  • become: yes - eskalacja uprawnień (sudo) dla wszystkich zadań w play
  • Zadania są wykonywane sekwencyjnie - kolejność ma znaczenie
  • Playbook uruchamiamy: ansible-playbook playbook.yml -i hosts.ini
  • Przykład: --- - name: Instalacja Nginx hosts: web become: yes tasks: - apt: name=nginx state=present
ASK_prez10_s25

Playbook to plik YAML zawierający jeden lub więcej play. Każdy play definiuje: które hosty są celem (hosts), czy wymagana jest eskalacja uprawnień (become) oraz listę zadań do wykonania (tasks).

Zadania w playbooku są wykonywane sekwencyjnie. Jeśli któreś zadanie zakończy się błędem (failed), dalsze zadania w play nie są wykonywane. Można zmienić to zachowanie przez ignore_errors lub failed_when.

Flaga become: yes oznacza, że Ansible użyje sudo do wykonania zadań jako root. Można też określić konkretnego użytkownika: become_user: postgres.

Po uruchomieniu ansible-playbook, Ansible łączy się z hostami z grupy web, zbiera fakty (opcjonalnie), a następnie wykonuje każde zadanie, porównując stan pożądany z aktualnym.

26 / 50
Składnia YAML - podstawy dla Ansible

Składnia YAML - podstawy dla Ansible

  • YAML (YAML Ain't Markup Language) - format serializacji danych, czytelny dla człowieka
  • Wcięcia (spacje) określają strukturę - KONIECZNIE spacje, NIGDY tabulatory!
  • Listy: elementy zaczynające się od - (myślnik i spacja)
  • Słowniki: klucz: wartość (dwukropek i spacja)
  • Walidacja składni: ansible-playbook playbook.yml --syntax-check
  • Typowe błędy: mieszanie tabulatorów i spacji, brak wcięcia, zła liczba spacji
ASK_prez10_s26

YAML to format danych, który jest znacznie bardziej czytelny niż JSON czy XML. Ansible używa YAML jako formatu do definiowania playbooków, inventory (w formacie YAML) i zmiennych.

Wcięcia w YAML muszą być wykonane spacjami, nigdy tabulatorami. Różne edytory tekstu mogą domyślnie używać tabulatorów, co prowadzi do błędów składni.

Lista w YAML to sekwencja elementów poprzedzonych myślnikiem (- ). Słownik to pary klucz-wartość oddzielone dwukropkiem (:). Ważne: po dwukropku zawsze musi być spacja.

Najczęstszym błędem w plikach YAML jest niepoprawne wcięcie - albo użycie tabulatora zamiast spacji, albo nieprawidłowa liczba spacji.

27 / 50
Zmienne w Ansible - vars i fakty

Zmienne w Ansible - vars i fakty

  • Zmienne (vars) - definiowane przez użytkownika, przechowują konfigurację specyficzną dla hosta/grupy
  • Zmienne mogą być zdefiniowane w playbooku, inventory, group_vars, host_vars lub jako extra vars
  • Fakty (facts) - automatycznie zbierane informacje o systemie: OS, IP, CPU, RAM, dyski
  • Zbieranie faktów: ansible all -m setup -i hosts.ini
  • Kolejność priorytetów zmiennych (od najwyższego): extra vars, host_vars, group_vars, playbook vars
  • Użycie w playbooku: {{ zmienna }} lub {{ ansible_facts['os_family'] }}
ASK_prez10_s27

Zmienne w Ansible pozwalają na parametryzację playbooków. Zamiast na sztywno wpisywać nazwę pakietu czy ścieżkę, używamy zmiennych, które są podstawiane podczas wykonywania playbooka.

Fakty (facts) są zbierane przez moduł setup na początku każdego playbooka. Zawierają szczegółowe informacje o systemie: nazwę hosta, adresy IP, system operacyjny, wersję jądra, procesor, pamięć, dyski.

Priorytety zmiennych są ważne do zrozumienia, która wartość będzie użyta, gdy zmienna jest zdefiniowana w wielu miejscach.

Możliwość zbierania faktów pozwala na pisanie playbooków, które dostosowują się do systemu: na Debianie używamy apt, na RHEL yum, na FreeBSD pkg.

28 / 50
Szablony Jinja2 - dynamiczne pliki konfiguracyjne

Szablony Jinja2 - dynamiczne pliki konfiguracyjne

  • Jinja2 - silnik szablonów Pythona, używany przez Ansible do dynamicznego generowania plików
  • Składnia: {{ zmienna }} do wstawiania wartości, {% if %} do logiki
  • Moduł template generuje plik z szablonu .j2 na węźle docelowym
  • Przykład: plik nginx.conf.j2 z dynamicznym portem i nazwą serwera
  • Szablony umieszczamy w katalogu templates/ w projekcie
  • Filtry Jinja2: default, upper, lower, join, regex_replace
ASK_prez10_s28

Jinja2 to potężny silnik szablonów, który pozwala na tworzenie dynamicznych plików konfiguracyjnych. Działa to tak: tworzymy plik szablonu z rozszerzeniem .j2, w którym umieszczamy zmienne w podwójnych nawiasach klamrowych.

Moduł template w Ansible działa podobnie do copy, ale przed skopiowaniem przetwarza szablon Jinja2. Można w nim używać zmiennych, faktów, pętli i warunków.

Przykład szablonu nginx.conf.j2: server { listen {{ http_port }}; server_name {{ server_name }}; root {{ web_root }}; }.

Jinja2 wspiera również filtry: {{ zmienna | default('wartosc_domyslna') }}, {{ zmienna | upper }}, {{ lista | join(',') }}.

29 / 50
Warunki (when) - wykonywanie warunkowe

Warunki (when) - wykonywanie warunkowe

  • Warunek when określa, czy zadanie ma być wykonane
  • Wyrażenie w when jest interpretowane jako Python - dostępne zmienne i operatory
  • Typowe użycie: sprawdzanie systemu operacyjnego, wersji, dostępności zmiennej
  • Warunki można łączyć: when: var is defined and var == "value"
  • Negacja: when: not zmienna lub when: zmienna is not defined
  • Przykład: when: ansible_facts['os_family'] == "Debian"
ASK_prez10_s29

Warunki when są kluczowe do pisania uniwersalnych playbooków, które działają na różnych systemach operacyjnych lub w różnych konfiguracjach.

Najczęstszym zastosowaniem jest dostosowanie komend do systemu operacyjnego. Na Debianie/Ubuntu pakiet Apache nazywa się apache2, a na RHEL/CentOS - httpd.

Warunki mogą być również używane do sprawdzania wartości zmiennych: when: port is defined and port > 1024.

W Ansible dostępne są również testy Jinja2: defined, undefined, none, boolean, number, string, even, odd.

30 / 50
Pętle - powtarzanie zadań

Pętle - powtarzanie zadań

  • loop - nowoczesna składnia pętli (Ansible 2.5+), iteruje po liście
  • {{ item }} - zmienna przechowująca bieżący element pętli
  • Starsza składnia: with_items - nadal wspierana, ale loop jest zalecany
  • Przykład: instalacja wielu pakietów za pomocą loop
  • Można iterować po słowniku: loop: "{{ dict | dict2items }}"
  • Pętle z warunkami: loop: "{{ lista }}" when: item != 'pomijany'
ASK_prez10_s30

Pętle w Ansible pozwalają na wykonanie tego samego zadania wielokrotnie z różnymi parametrami. Zamiast pisać osobne zadanie dla każdego pakietu, użytkownika czy pliku, definiujemy listę i używamy pętli.

Składnia loop przyjmuje listę wartości. Dla każdego elementu listy Ansible wykonuje zadanie, podstawiając bieżący element do zmiennej item.

W przypadku instalacji pakietów, pętla loop jest znacznie czytelniejsza niż lista pakietów w jednym zadaniu.

Dla bardziej złożonych przypadków, Ansible oferuje lookup plugins, które mogą być używane jako źródło danych do pętli.

31 / 50
Tagi - wybiórcze uruchamianie zadań

Tagi - wybiórcze uruchamianie zadań

  • Tagi pozwalają uruchamiać tylko wybrane zadania z playbooka
  • ansible-playbook playbook.yml --tags "config" - tylko zadania z tagiem config
  • ansible-playbook playbook.yml --skip-tags "packages" - pomiń zadania z tagiem packages
  • Przydatne do szybkich aktualizacji konfiguracji bez instalacji pakietów
  • Specjalny tag: always - zadanie zawsze wykonane (chyba że --skip-tags always)
  • Tagi można przypisać do całego play (play-level tags) lub pojedynczego zadania
ASK_prez10_s31

Tagi to mechanizm etykietowania zadań w playbooku, który pozwala na wybiórcze uruchamianie tylko niektórych zadań. Jest to niezwykle przydatne w dużych playbookach.

Na przykład, jeśli mamy playbook, który instaluje pakiety, konfiguruje usługi i uruchamia je, możemy użyć tagów packages, config i service.

Tagi mogą być przypisane do całego play (play-level tags) lub do pojedynczego zadania. Można też użyć tagów dziedziczonych z roli.

Specjalny tag always powoduje, że zadanie jest zawsze wykonywane, chyba że jawnie pominiemy tag always przez --skip-tags always.

32 / 50
Handlery - reagowanie na zmiany

Handlery - reagowanie na zmiany

  • Handler - specjalne zadanie wywoływane tylko po zmianie (notify)
  • Zadanie z notify wywołuje handlera tylko gdy status to changed
  • Handlery są uruchamiane na końcu playbooka, po wszystkich zadaniach
  • Zapobiega to niepotrzebnym restartom usług przy każdym uruchomieniu playbooka
  • Jeden handler może być wywołany przez wiele zadań - uruchomi się tylko raz
  • Przykład: notify: restart nginx z handlerem restartującym usługę
ASK_prez10_s32

Handlery to jedno z najważniejszych narzędzi do zarządzania usługami w Ansible. Są to zadania, które są uruchamiane tylko wtedy, gdy zostały wywołane przez inne zadanie poprzez dyrektywę notify.

Kluczową zaletą handlerów jest to, że są uruchamiane na końcu playbooka, a nie natychmiast po zadaniu, które je wywołało. Dzięki temu, jeśli kilka zadań zmodyfikuje konfigurację, usługa zostanie zrestartowana tylko raz.

W przykładzie, zadanie używające modułu template do skopiowania pliku konfiguracyjnego wywołuje handler restartu tylko wtedy, gdy plik ulegnie zmianie.

Handlery są szczególnie przydatne przy zarządzaniu usługami, które wymagają restartu po zmianie konfiguracji (Nginx, Apache, PostgreSQL, SSH).

33 / 50
Moduł copy - zarządzanie plikami

Moduł copy - zarządzanie plikami

  • src - plik źródłowy na kontrolerze (względem projektu)
  • dest - ścieżka docelowa na zarządzanym węźle
  • owner/group - własność pliku
  • mode - uprawnienia (w formacie ósemkowym, podane w stringu!)
  • Sprawdza sumę kontrolną - nie kopiuje, jeśli plik jest identyczny
  • Przykład: copy: src: files/index.html dest: /var/www/html/index.html mode: '0644'
ASK_prez10_s33

Moduł copy to jeden z najczęściej używanych modułów w Ansible. Służy do kopiowania plików z kontrolera na zarządzane węzły. Działa idempotentnie - porównuje sumę kontrolną pliku źródłowego i docelowego przed kopiowaniem.

Ścieżka src jest domyślnie względna wobec katalogu projektu. Najlepiej trzymać pliki w osobnym katalogu files/ wewnątrz projektu.

Parametr mode definiuje uprawnienia w formacie ósemkowym. Ważne: mode w Ansible musi być stringiem ('0644', a nie liczbą 0644).

Moduł copy wspiera również kopiowanie całych katalogów (recurse: yes) oraz używanie zawartości bezpośrednio z playbooka przez parametr content.

34 / 50
Moduł service/systemd - zarządzanie usługami

Moduł service/systemd - zarządzanie usługami

  • state: started - uruchom usługę (jeśli nie jest uruchomiona)
  • state: stopped - zatrzymaj usługę
  • state: restarted - restart (zawsze wykonuje restart, nawet jeśli usługa działa)
  • state: reloaded - przeładowanie konfiguracji (jeśli usługa wspiera)
  • enabled: yes/no - włączenie/wyłączenie autostartu (systemctl enable/disable)
  • Przykład: service: name: nginx state: started enabled: yes
ASK_prez10_s34

Moduł service (lub systemd dla systemów z systemd) zarządza usługami systemowymi. Jest w pełni idempotentny: uruchamia usługę tylko wtedy, gdy jest zatrzymana.

Różnica między state: restarted a state: reloaded jest ważna. Restart zatrzymuje i uruchamia usługę (przerwa w działaniu), podczas gdy reload wysyła sygnał SIGHUP do procesu.

W przypadku Nginx, reload jest preferowany nad restartem, ponieważ nie powoduje przerw w obsłudze klientów.

Dla systemów bez systemd (starsze dystrybucje), moduł service automatycznie wybiera odpowiedni system init.

35 / 50
Moduł user - zarządzanie użytkownikami

Moduł user - zarządzanie użytkownikami

  • name - nazwa użytkownika
  • uid/gid - identyfikatory numeryczne (opcjonalne)
  • shell - powłoka użytkownika (domyślnie /bin/bash)
  • state: present - utwórz użytkownika, absent - usuń
  • remove: yes - usuń również katalog domowy i skrzynkę pocztową
  • Przykład: user: name: ala uid: 1100 group: developers shell: /bin/bash
ASK_prez10_s35

Moduł user to kompletne narzędzie do zarządzania kontami użytkowników w systemie Linux. Może tworzyć, modyfikować i usuwać użytkowników, a także zarządzać ich grupami, powłoką i katalogiem domowym.

Tworząc użytkownika, można określić grupę podstawową (group), grupy dodatkowe (groups z append: yes) oraz UID.

Parametr state: absent z remove: yes usuwa użytkownika wraz z katalogiem domowym i skrzynką pocztową. Należy używać ostrożnie w środowisku produkcyjnym.

Moduł user może również zarządzać hasłami (password z zahashowanym hasłem), datą wygaśnięcia konta (expires) oraz SSH keys.

36 / 50
Moduł file - uprawnienia i własność plików

Moduł file - uprawnienia i własność plików

  • state: directory - tworzy katalog (rekurencyjnie z recurse: yes)
  • state: touch - tworzy pusty plik (jak unixowe touch)
  • state: absent - usuwa plik/katalog
  • state: link - tworzy dowiązanie symboliczne (src -> path)
  • Moduł file nie kopiuje zawartości pliku - tylko zarządza atrybutami
  • Przykład: file: path: /srv/web state: directory owner: www-data mode: '0755'
ASK_prez10_s36

Moduł file jest podstawowym narzędziem do zarządzania atrybutami plików i katalogów w Ansible. Nie służy do kopiowania treści (do tego jest copy i template), ale do zarządzania własnością, uprawnieniami i typem pliku.

Najczęstszym zastosowaniem jest tworzenie katalogów przed skopiowaniem do nich plików. state: directory tworzy katalog, jeśli nie istnieje.

state: touch tworzy pusty plik lub aktualizuje znacznik czasu (atime/mtime) istniejącego pliku.

state: link tworzy dowiązanie symboliczne. Parametr src wskazuje na cel dowiązania, a path na ścieżkę dowiązania.

37 / 50
Role - organizacja kodu na większą skalę

Role - organizacja kodu na większą skalę

  • Role - struktura katalogów do organizacji zadań, handlerów, zmiennych, plików i szablonów
  • Struktura: roles/nazwa_roli/{tasks,handlers,vars,defaults,meta}/main.yml oraz katalogi files/ i templates/
  • Role są reużywalne - można je pobierać z Ansible Galaxy i udostępniać innym
  • Użycie roli w playbooku: roles: - nazwa_roli
  • Kolejność wykonywania: role przed tasks w playbooku
  • Ansible Galaxy: ansible-galaxy install nazwa_roli
ASK_prez10_s37

Role to zaawansowany mechanizm organizacji kodu w Ansible. Pozwalają na grupowanie powiązanych zadań, handlerów, zmiennych, plików i szablonów w jedną, reużywalną jednostkę.

Struktura katalogów roli jest ściśle określona: tasks/main.yml (główne zadania), handlers/main.yml (handlery), vars/main.yml (zmienne wysokiego priorytetu), defaults/main.yml (zmienne niskiego priorytetu), meta/main.yml (zależności i metadane).

Role są szczególnie przydatne w większych projektach, gdzie wiele playbooków korzysta z tych samych konfiguracji.

Ansible Galaxy (galaxy.ansible.com) to repozytorium publicznych ról, które można pobrać i użyć we własnych projektach.

38 / 50
Best practices - dobre praktyki Ansible

Best practices - dobre praktyki Ansible

  • Przechowuj projekt w Git - każda zmiana ma historię i autora
  • Używaj ansible-playbook --syntax-check przed każdym uruchomieniem
  • Testuj playbooki w środowisku staging przed wdrożeniem na produkcję
  • Używaj --check (dry-run) do symulacji zmian przed rzeczywistym wykonaniem
  • Trzymaj hasła i sekrety w Ansible Vault (ansible-vault encrypt)
  • Nadawaj zadaniom opisowe nazwy (name:) - ułatwia debugowanie i czytanie logów
ASK_prez10_s38

Dobre praktyki są kluczowe dla utrzymania jakości kodu Ansible w dłuższej perspektywie. Przechowywanie projektu w Git to podstawa.

Walidacja składni (--syntax-check) powinna być wykonywana przed każdym uruchomieniem playbooka. W środowisku CI/CD jest to automatycznie sprawdzane.

Tryb --check (dry-run) symuluje wykonanie playbooka bez wprowadzania rzeczywistych zmian. Jest to niezbędne narzędzie do weryfikacji.

Ansible Vault pozwala na szyfrowanie wrażliwych danych: haseł, kluczy API, certyfikatów. Zaszyfrowane pliki można bezpiecznie przechowywać w Git.

39 / 50
Laboratorium: przygotowanie środowiska

Laboratorium: przygotowanie środowiska

  • Wymagania: dwie maszyny wirtualne z Ubuntu 22.04/24.04 (kontroler i węzeł zarządzany)
  • Kontroler: minimalna instalacja + Python 3 + ansible (pip install ansible)
  • Węzeł zarządzany: minimalna instalacja + Python 3 + SSH
  • Klucz SSH: ssh-keygen -t ed25519 na kontrolerze
  • Kopiowanie klucza: ssh-copy-id admin@wezel
  • Test połączenia: ssh admin@wezel "python3 --version"
ASK_prez10_s39

Do laboratorium potrzebujemy dwóch maszyn wirtualnych z systemem Ubuntu. Można użyć VirtualBox, VMware, maszyn w chmurze (AWS EC2, Azure VM) lub kontenerów LXC/Docker.

Kontroler to maszyna, z której będziemy uruchamiać Ansible. Nie wymaga dużej mocy obliczeniowej (1 CPU, 1 GB RAM wystarczy).

Po wygenerowaniu klucza SSH (ed25519 jest bezpieczniejszy i szybszy od RSA), kopiujemy klucz publiczny na węzeł zarządzany.

Przed rozpoczęciem laboratorium warto sprawdzić, czy połączenie SSH działa bez hasła.

40 / 50
Krok 1: test połączenia ad-hoc

Krok 1: test połączenia ad-hoc

  • Utworzenie pliku inventory z jednym węzłem w grupie [web]
  • ansible all -m ping -i hosts.ini - test połączenia SSH i działania Pythona
  • Odpowiedź SUCCESS z "pong" oznacza, że komunikacja działa
  • Jeśli pojawi się UNREACHABLE - problem z SSH lub Pythonem
  • Wynik: changed: false - moduł ping nie zmienia stanu systemu
  • Przykład outputu: wezel01 | SUCCESS => { "ping": "pong" }
ASK_prez10_s40

Pierwszym krokiem laboratorium jest utworzenie pliku inventory i przetestowanie połączenia z węzłem zarządzanym. Moduł ping to najprostszy moduł Ansible.

W odpowiedzi widzimy: adres IP węzła, status SUCCESS (lub FAILURE/UNREACHABLE), informację o interpreterze Pythona oraz odpowiedź pong.

Jeśli otrzymamy UNREACHABLE, należy sprawdzić: czy adres IP jest poprawny, czy klucz SSH jest dodany do authorized_keys, czy Python jest zainstalowany na węźle oraz czy firewall nie blokuje portu 22.

Status changed: false oznacza, że żadna zmiana nie została wykonana - moduł ping jest tylko testem połączenia.

41 / 50
Krok 2: pierwszy playbook - instalacja Nginx

Krok 2: pierwszy playbook - instalacja Nginx

  • Playbook install_nginx.yml: hosts: web, become: yes, vars: http_port
  • Zadanie: apt name=nginx state=present - instalacja pakietu
  • Uruchomienie: ansible-playbook install_nginx.yml -i hosts.ini
  • Pierwsze uruchomienie: changed=1 (pakiet został zainstalowany)
  • Drugie uruchomienie: changed=0 (pakiet już istnieje - idempotentność)
  • Play recap: ok=2 (gathering facts + instalacja), changed=1/0
ASK_prez10_s41

Nasz pierwszy playbook jest prosty - instaluje Nginx na węźle z grupy web. Zawiera definicję play (hosts: web), eskalację uprawnień (become: yes) oraz zmienne (vars).

Po uruchomieniu ansible-playbook, Ansible połączy się z węzłem, zbierze fakty, sprawdzi czy Nginx jest zainstalowany, a jeśli nie - zainstaluje go.

Wynik powinien pokazać: PLAY (instalacja Nginx), TASK (Gathering Facts), TASK (Instalacja Nginx) oraz PLAY RECAP z podsumowaniem.

W play recap zobaczymy: ok=2, changed=1 (pierwsze uruchomienie) lub changed=0 (drugie uruchomienie - dowód idempotentności).

42 / 50
Krok 3: dodanie strony i handlera

Krok 3: dodanie strony i handlera

  • Zadanie copy: kopiuje index.html z katalogu files/ do /var/www/html/
  • notify: restart nginx - wywołuje handlera tylko jeśli plik się zmienił
  • Zadanie service: uruchamia i włącza Nginx przy starcie systemu
  • Handler restart nginx: service name=nginx state=restarted
  • Handler uruchamiany tylko po zmianie (changed), nie przy ok
  • Idempotentność: drugie uruchomienie bez zmian w index.html -> brak restartu
ASK_prez10_s42

Rozszerzamy playbook o zadanie kopiowania pliku index.html z kontrolera na węzeł. Plik index.html powinien być umieszczony w katalogu files/ w projekcie.

Moduł copy kopiuje plik i ustawia własność na www-data (użytkownik Nginx) oraz uprawnienia 0644. Jeśli plik docelowy ma już te same atrybuty i sumę kontrolną, zadanie zgłosi ok.

Dzięki notify, handler restart nginx zostanie wywołany tylko wtedy, gdy plik index.html faktycznie się zmienił.

Zadanie uruchomienia Nginx (service: state: started, enabled: yes) jest idempotentne - jeśli Nginx już działa i jest włączony, zadanie zgłosi ok.

43 / 50
Krok 4: tryb dry-run i dowód idempotentności

Krok 4: tryb dry-run i dowód idempotentności

  • --check (dry-run): symuluje zmiany, nie wprowadza ich
  • --diff: pokazuje różnice w plikach (przydatne z --check)
  • Pierwsze uruchomienie: changed=3 (instalacja, index, uruchomienie)
  • Drugie uruchomienie: changed=0 - stan zgodny, brak zmian
  • Dowód idempotentności: wielokrotne uruchomienie nie zmienia systemu
  • Weryfikacja: curl localhost na docelowej maszynie -> HTTP 200
ASK_prez10_s43

Tryb dry-run (--check) to jedna z najważniejszych funkcji Ansible. Symuluje on wykonanie playbooka bez wprowadzania rzeczywistych zmian.

Z --diff Ansible pokazuje dokładne różnice w plikach (jak git diff). Jest to szczególnie przydatne przy sprawdzaniu, czy szablony generują poprawne pliki konfiguracyjne.

Po pierwszym uruchomieniu playbooka, changed=3 oznacza, że trzy zadania wprowadziły zmiany.

Po drugim uruchomieniu, changed=0 - to jest właśnie dowód idempotentności. Playbook został wykonany, ale ponieważ stan systemu był już zgodny z pożądanym, żadne zadanie nie musiało wprowadzać zmian.

44 / 50
Krok 5: weryfikacja działania serwera

Krok 5: weryfikacja działania serwera

  • ansible web -m command -a "systemctl status nginx" - status usługi
  • ansible web -m command -a "ss -tlnp | grep nginx" - nasłuch
  • curl -I http://10.0.0.50:8080 - test HTTP z kontrolera
  • Odpowiedź HTTP/1.1 200 OK potwierdza działanie serwera
  • ansible web -m command -a "curl -s localhost" - test lokalny
  • Weryfikacja przez ad-hoc: szybkie sprawdzenie bez logowania SSH
ASK_prez10_s44

Weryfikacja jest kluczowym etapem każdego zadania automatyzacji. Nie wystarczy uruchomić playbooka - trzeba sprawdzić, czy faktycznie działa zgodnie z oczekiwaniami.

Pierwsza komenda ad-hoc sprawdza status usługi Nginx przez systemctl. Powinna pokazać active (running).

curl z kontrolera (maszyny, na której uruchamiamy Ansible) testuje, czy serwer odpowiada na żądania HTTP. Wynik 200 OK potwierdza działanie.

curl z węzła zarządzanego, wykonany przez moduł command, sprawdza lokalnie, czy Nginx odpowiada na localhost.

45 / 50
Troubleshooting: błędy składni YAML

Troubleshooting: błędy składni YAML

  • Najczęstszy błąd: użycie tabulatora zamiast spacji - YAML nie akceptuje tabów
  • Objaw: ERROR! Syntax Error while loading YAML
  • Sprawdzanie składni: ansible-playbook playbook.yml --syntax-check
  • Weryfikacja YAML: python3 -c "import yaml; print(yaml.safe_load(open('playbook.yml')))"
  • Typowe błędy: brak spacji po dwukropku, złe wcięcie, brak myślnika w liście
  • Edycja pliku: ustaw edytor na wstawianie spacji zamiast tabulatorów
ASK_prez10_s45

Błędy składni YAML są najczęstszym problemem początkujących użytkowników Ansible. YAML jest bardzo wrażliwy na wcięcia i formatowanie.

Użycie tabulatora zamiast spacji jest najczęstszym błędem. Większość edytorów kodu można skonfigurować do automatycznego zamieniania tabulatorów na spacje.

Komenda ansible-playbook --syntax-check jest pierwszą linią obrony przed błędami składni. Powinna być wykonywana przed każdym uruchomieniem playbooka.

Dodatkowo można użyć python3 z modułem yaml do walidacji pliku. Prawidłowy plik YAML powinien zostać wczytany bez błędów.

46 / 50
Troubleshooting: problemy z połączeniem SSH

Troubleshooting: problemy z połączeniem SSH

  • UNREACHABLE! - Ansible nie może połączyć się przez SSH
  • Sprawdź: ssh -vvv user@host - szczegółowe logi połączenia SSH
  • Błędny klucz: sprawdź czy klucz publiczny jest w authorized_keys na węźle
  • Zły port: domyślnie 22, zmiana przez ansible_port lub -p w ssh
  • Brak hosta w known_hosts: host_key_checking = False (tymczasowo) lub ssh-keyscan
  • Timeout: sprawdź firewall, routing i dostępność hosta (ping)
ASK_prez10_s46

Problemy z połączeniem SSH są drugim najczęstszym problemem w Ansible. Objawiają się komunikatem UNREACHABLE! i zatrzymaniem wykonania playbooka.

Pierwszym krokiem diagnostyki jest ręczne połączenie SSH z kontrolera do węzła: ssh -vvv user@host. Opcja -vvv pokazuje szczegółowe informacje o procesie uwierzytelniania.

Jeśli ręczne SSH działa, ale Ansible nie, problemem może być: inny użytkownik w Ansible, inny port SSH, lub brak klucza w ssh-agencie.

W środowisku produkcyjnym zaleca się używanie SSH keys z ssh-agent i włączenie host_key_checking z dodaniem kluczy hostów przez ssh-keyscan.

47 / 50
Troubleshooting: błędy uprawnień

Troubleshooting: błędy uprawnień

  • Brak sudo: user is not allowed to execute sudo
  • Sprawdź: sudo -l -U user - jakie komendy może wykonać użytkownik
  • Rozwiązanie: dodaj użytkownika do sudoers: user ALL=(ALL) NOPASSWD:ALL
  • Brak dostępu do plików: sprawdź uprawnienia i SELinux/AppArmor
  • Brak Pythona: ansible_python_interpreter=/usr/bin/python3
  • Brak modułu: ansible-doc -l | grep nazwa - sprawdź dostępność modułu
ASK_prez10_s47

Błędy uprawnień są szczególnie częste przy pierwszej konfiguracji Ansible. Użytkownik SSH musi mieć uprawnienia sudo do wykonywania zadań wymagających uprawnień root.

Zaleca się skonfigurowanie sudo z opcją NOPASSWD dla użytkownika Ansible, aby uniknąć blokowania się na pytanie o hasło podczas automatyzacji.

W systemach z SELinux (RHEL/CentOS/Fedora) lub AppArmor (Ubuntu/Debian), dodatkowe polityki bezpieczeństwa mogą blokować dostęp do plików nawet przy poprawnych uprawnieniach.

W przypadku braku Pythona na węźle, Ansible nie będzie mógł wykonać większości modułów. Należy zainstalować Python lub użyć modułu raw dla podstawowych komend.

48 / 50
Debugowanie playbooków w Ansible

Debugowanie playbooków w Ansible

  • Poziomy verbose: -v (podstawowe), -vvv (szczegółowe SSH), -vvvvv (wszystko)
  • Moduł debug: debug: var=zmienna - wyświetla wartość zmiennej
  • Moduł debug: debug: msg="Wartość to {{ zmienna }}" - niestandardowy komunikat
  • ansible-playbook --check --diff - pokazuje planowane zmiany
  • Logi Ansible: log_path = ./ansible.log w ansible.cfg
  • Sprawdzenie zmiennych: ansible all -m setup -i hosts.ini | less
ASK_prez10_s48

Debugowanie playbooków jest niezbędną umiejętnością każdego administratora Ansible. Najprostszą metodą jest zwiększenie poziomu verbose (-v, -vv, -vvv).

Poziom -v pokazuje podstawowe informacje o wykonaniu zadań. -vv dodaje informacje o połączeniach SSH. -vvv pokazuje pełne dane debugowania, w tym komendy SSH wykonywane na węźle.

Moduł debug to wbudowane narzędzie do wyświetlania wartości zmiennych podczas wykonywania playbooka. Jest nieocenione przy diagnozowaniu problemów z podstawianiem zmiennych.

Tryb --check --diff pokazuje, jakie zmiany zostaną wprowadzone, bez faktycznego ich wykonywania. --diff dodatkowo pokazuje różnice w plikach.

49 / 50
Typowe problemy w Ansible - podsumowanie

Typowe problemy w Ansible - podsumowanie

  • Błąd składni YAML -> ansible-playbook --syntax-check
  • UNREACHABLE -> ssh -vvv, sprawdź klucz, firewall, port, known_hosts
  • Brak uprawnień -> sudo -l, dodaj NOPASSWD do sudoers
  • Moduł nie działa -> ansible-doc -l, sprawdź wersję Ansible i Pythona
  • Zmienna nie podstawiona -> debug: var=zmienna, sprawdź priorytety zmiennych
  • Handler nie uruchomiony -> sprawdź czy zadanie notify zmieniło stan (changed)
ASK_prez10_s49

Typowe problemy w Ansible mają przewidywalne objawy i rozwiązania. Warto zapamiętać najczęstsze scenariusze, aby szybko diagnozować problemy.

Błąd składni YAML jest najłatwiejszy do zdiagnozowania - ansible-playbook --syntax-check wskaże linię z błędem.

Problemy z SSH są najtrudniejsze do zdiagnozowania, ponieważ komunikaty błędów są często mylące. Zawsze warto sprawdzić ręczne połączenie SSH z verbose.

Problemy z uprawnieniami są szczególnie częste przy pierwszej konfiguracji. Należy pamiętać, że Ansible potrzebuje sudo do zadań wymagających uprawnień root.

50 / 50
Cheat sheet - najważniejsze polecenia Ansible

Cheat sheet - najważniejsze polecenia Ansible

  • ansible all -m ping -i hosts.ini - test połączenia ze wszystkimi hostami
  • ansible-playbook playbook.yml -i hosts.ini - uruchomienie playbooka
  • ansible-playbook --check --diff playbook.yml - symulacja zmian z diff
  • ansible-doc -l - lista wszystkich dostępnych modułów
  • ansible-inventory --list -i hosts.ini - podgląd inventory
  • ansible all -m setup -i hosts.ini - zbieranie faktów systemowych
ASK_prez10_s50

Cheat sheet zawiera najważniejsze polecenia Ansible, które każdy administrator powinien znać. Warto wydrukować go i mieć pod ręką podczas pracy.

ansible all -m ping to pierwsze polecenie, które należy uruchomić po skonfigurowaniu nowego inventory. Potwierdza ono, że Ansible może komunikować się ze wszystkimi hostami.

ansible-playbook z --check i --diff to bezpieczny sposób na sprawdzenie, jakie zmiany wprowadzi playbook przed faktycznym uruchomieniem.

ansible-doc -l wyświetla listę wszystkich dostępnych modułów z krótkim opisem. Dla szczegółowej dokumentacji konkretnego modułu: ansible-doc nazwa_modulu.